Basic of DynamoDB
- DynamoDB 是 AWS NOSQL Database.
- performance 的部分,DynamoDB 的資料存在 SSD
- Data 會自動備份到不同的 AZ ,預防 single point failure
- DynamoDB 以 table 為單位,裡面每筆的 Row 為 Item ,而每個 Item 的 Column 為 Attribute
- DynamoDB 有兩種 Type 的 Primary Key ,在 DB 需要是唯一值
- Partition Key
- Composite Key ( Partition Key + Sort Key)
- 同一個 Partition Key 會存在一起,根據 Sort Key 去排序
- 可以設定 TTL (Time to Live ) to Item,所以當時間到 Item 會自動刪除。TTL 需要存要刪除的時間 Timestamp
Secondary Index
- Projection 代表一組 Attribute 複製到 secondary Index
- Types
- Global Secondly Index
- Partition Key 和 Sort Key 可以都不一樣
- queries or scans 只能拉有 projected 到 secondary Index 的 attribute
- Local Secondary Index
- 一樣的 Partition Key 但是不一樣的 Sort Key => 所以 Primary Key 一定要是 Composite Key
- 只能在建立 Table 時建立
- query or scan 如果沒有 projected 到 secondary Index 的 attribute, DynamoDB 會自動從 table 拉出來
Read Consistency
- Eventually Consistent Reads: 最終會一制性,因為 Data Source 存在不只一個地方,有可能讀到舊的 Data Source
- Strongly Consistent Reads: 讀到的資料一定是最新的,有更高的延遲,不支援 global secondary index
- Transition: 支援 ACID (atomicity, consistency, isolation, & durability) Transition ,上限一次 25 個 write
Query v.s Scan
- Query
- 是透過 primary key 去找搜尋
- 撈出來的資料是根據 Sort Key 去排序 , 可以透過設定 ScanIndexForward = false 得到相反的順序的結果
- 預設是 Eventually Consistent ,可以設定是 Strongly Consistent
- Scan
- 是拉出所有的 Items (full table scan),然後可以透過 Filter 一一過濾
- performance 比 Query 差
- 可以用小的 page size 改進 performance
- 可以設定 Parallel 去加強 performance,但要注意 DynamoDB loading 是否很重
DynamoDB Capacity
- Provisioned Capacity 吞吐量 (Throughput)
- DynamoDB 吞吐量設定單位為 Capacity Unit ,區分為 Read, Write 兩個
- 一個 Write Capacity Unit 等於 1 KB/1 Second
- 一個 Read Capacity Unit 等於
- 1 個 Strongly Consistent Reads 4 KB / 1 Second
- 2 個 Eventually Consistent Reads 4 KB / 1 Second
- 如果超出設定的 Capacity Unit ,DynamoDB 會噴 ProvisionedThroughputExceededException 。
- 建議時做 exponential backoff retry,意思就是隨著 retry 次數的增長,每個request 中間的時間區隔也會增長
- On-Demand Capacity
- AWS 會根據流量自動 Scaling
- 很難預測花費
DynamoDB Accelerator (DAX)
- DAX 是 AWS 管理的 in memory cache cluster ,可以加快 Read 的 Perofrmance
- 在寫入資料時,會同時寫入 DAX 和 DynamoDB Table,所以寫入後直接 Read 會 Hit 到 cache
- 不支援 Strongly consistent reads
DynamoDB Stream
- 會抓到所有修改 Item 的 Event ,可以 Trigger Lambda
- 資料會加密和保存 24 小時
- 有獨立的 Endpoint
AWS CLI create table example
1aws dynamodb create-table \
2 --table-name Music \
3 --attribute-definitions \
4 AttributeName=Artist,AttributeType=S \
5 AttributeName=SongTitle,AttributeType=S \
6 --key-schema \
7 AttributeName=Artist,KeyType=HASH \
8 AttributeName=SongTitle,KeyType=RANGE \
9 --provisioned-throughput \
10 ReadCapacityUnits=10,WriteCapacityUnits=5
- KeyType :
- Hash: Partition Key
- RANGE: Sort Key
IAM Policy Conditions
- 限制 IAM User 只能操作特定的 Item ,以下面為例 dynamodb:LeadingKeys 是指 partition key,當 IAM UserID 等於 partition key 時才可以執行 Policy 裡面的 Action。
1{
2 "Version": "2012-10-17",
3 "Statement": [
4 {
5 "Sid": "AllowAccessToOnlyItemsMatchingUserID",
6 "Effect": "Allow",
7 "Action": [
8 "dynamodb:GetItem",
9 "dynamodb:BatchGetItem",
10 "dynamodb:Query",
11 "dynamodb:PutItem",
12 "dynamodb:UpdateItem",
13 "dynamodb:DeleteItem",
14 "dynamodb:BatchWriteItem"
15 ],
16 "Resource": [
17 "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
18 ],
19 "Condition": {
20 "ForAllValues:StringEquals": {
21 "dynamodb:LeadingKeys": [
22 "${www.amazon.com:user_id}"
23 ],
24 "dynamodb:Attributes": [
25 "UserId",
26 "GameTitle",
27 "Wins",
28 "Losses",
29 "TopScore",
30 "TopScoreDateTime"
31 ]
32 },
33 "StringEqualsIfExists": {
34 "dynamodb:Select": "SPECIFIC_ATTRIBUTES"
35 }
36 }
37 }
38 ]
39}
評論