DynamoDB入门知识和一些注意事项
什么是DynamoDB
Amazon DynamoDB分布式NoSQL數據庫服務,支持動態擴展,性能可靠
DynamoDB基本概念
DynamoDB的組成
表:表示用來存儲DynamoDB數據,它類似于關系型數據庫的“表”
項目:表中可以有0 到 N(N > 0)個項目,它類似于關系型數據庫的“行”,在DynamoDB中,項目數量是沒有限制的。
屬性:多個屬性組成了一個項目,它類似于關系型數據庫中的“字段”。DynamoDB中表除了主鍵外都是無架構的,因此在項目里可以有不同的屬性、大小、數據類型
DynamoDB主鍵
DynamoDB中使用主鍵標識唯一的項目,在創建表時必須指定主鍵。DynamoDB主鍵支持兩種類型
單個分區鍵組成的主鍵:由一個分區鍵屬性組成,他標識了唯一的項目,同時也覺得項目存儲到哪個分區。DynamoDB根據內部散列函數計算分區鍵的值,其結果用來決定將項目存儲到哪個分區。
分區鍵 + 排序鍵:在單個分區鍵基礎上加上排序鍵,由這兩個屬性組成復合主鍵。同樣,分區鍵決定項目存儲到哪個分區,排序鍵決定在同一個分區內相同分區鍵的項目的排列順序。
DynamoDB流
DynamoDB流可以捕獲表中的數據修改事件,這些事件以發生的順序寫入到流中。流有生命周期,從計入到結束一共有24小時,到期后將從流中自動刪除。
以下幾個事件將觸發流的產生
向表添加新項目時,此時流會捕獲整個項目即所有屬性
更新項目時,此時流將波或項目中已修改的屬性
刪除項目時,流在項目被刪除前捕獲
DynamoDB二級索引
DynamoDB提供了本地二級索引和全局二級索引,二者有一定的差異。
| 本地二級索引 | 全局二級索引 | |
| 概念 |
本地二級索引的含義是“本地”,意思是說二級索引的索引范圍限定為具有相同分區鍵的表分區。 也就是說該索引只能在同一個分區中索引 |
全局是指對索引執行的查詢可以跨基表中所有分區的所有數據 |
| 一致性 | 支持強一致性 | 僅支持最終一致性 |
| 限制 | 一個表中只能創建5個本地二級索引 | 一個表中只能創建5個全局二級索引 |
DynamoDB讀寫限制
在創建表時需指定表的讀取、寫入的吞吐量。在生產環境中如果實際吞吐量超過了當前為DynamoDB設置的吞吐量,在經過重試后(如果DynamoDB Client設置了重試機制)最終將會拋出異常。
讀取吞吐量單位:讀取吞吐量取決于項目的大小以及是需要最終一致性還是強一致性
最終一致性的讀取容量單位 = 2次4KB項目讀 / 秒
強一致性的讀取容量單位 = 1次4KB讀 / 秒
如果一次讀取大于4KB的項目,DynamoDB要消耗額外的讀取容量單位。
寫入吞吐量單位:寫入容量單位取決于寫入項目的大小。
一個寫入容量單位 = 1次最多1KB的項目寫入 / 秒
如果需要寫入大于1KB的項目,DynamoDB需要消耗額外的寫入容量單位。
其他限制:DynamoDB規定一個項目大小上限為400KB,如果項目的大小超過了這個限制將會消耗更多的容量單位。
一旦超過DynamoDB的限制,那么請求會被限制,這種錯誤在程序中是無法自動恢復的,因此需要合理設置吞吐量和一個項目大小。
DynamoDB吞吐量預置值計算
吞吐量在創建表時候可以指定,在運行中的線上業務也可以通過DynamoDB后臺可視化界面或提供的API動態調整。API方式相對來說非常靈活。注意:DynamoDB每天每個表僅允許向下調整4次,向上調整無限制。
這個預置值有一套計算方式,如果您的業務讀寫量可預估那么請參考下面公式
強一致性讀取容量計算:向上取整(項目大小 / 4KB) * 預計每秒讀取個數
比如:強一致性讀要求,一個項目大小為3KB,期望每秒讀80個項目。
3KB / 4KB = 0.75 ,向上取整后 = 1
1 * 80 = 80個讀取容量單位
最終一致性讀取容量計算:與強一致性讀取容量計算方式一樣,在最終結果上 * 2
寫入容量計算:向上取整(項目大小 / 1KB) * 預計每秒寫入個數
比如:項目大小為512字節,期望打到每秒寫入100個項目。
512字節 / 1KB = 0.5 向上取整 = 1
1 * 100 = 100個寫入容量單位
DynamoDB分區
初始分區數計算
在數據存儲時,DynamoDB會將表的項目劃分至多個分區,并由SSD支撐。數據的分布主要是根據分區值決定。
DynamoDB服務全權負責分區的管理,包括起始表分區個數、分區拆分。
首先我們需要知道,在DynamoDB中一個分區大約可保存10GB的數據,最多支持每秒3000個讀請求和每秒1000個寫請求。
在創建一個表時,會根據預置的讀寫吞吐量初始化表分區個數,計算公式如下:
初始化分區個數 = 向上取整( (讀取預設吞吐量 / 3000) + (寫入預設吞吐量 / 1000) )
比如:讀取預設5000,寫入預設2000,那么套用公式(5000 / 3000) + (2000 / 1000) = 3.6667 向上取整后 = 4個分區數
那么每個分區的可以支持5000 / 4 = 1250個讀和(2000 / 4) = 500個寫
分區拆分
DynamoDB是可以動態擴容的,吞吐量也可以保證。但這些都是基于它的分區設計。
分區拆分方式
既然是DynamoDB全權負責分區管理,那么分區拆分的時機和方式由DynamoDB決定。當必要的時候DynadmoDB會自動拆分現有的分區,以提供更多的分區以支持吞吐量。我們首先了解拆分的方式
圖中第1步,DynamoDB會分配兩個新分區
圖中第2步,DynamoDB將原分區數據均勻分配到新分區
圖中第3步,DynamoDB不再給原分區分配數據
分區拆分觸發條件
上面提到,“在DynamoDB中一個分區大約可保存10GB的數據,最多支持每秒3000個讀請求和每秒1000個寫請求”
那么分區觸發條件也是圍繞著分區實際存儲量和讀寫來觸發的。
預置吞吐量增加:如果當前分區表不能滿足新的預置吞吐量時,DynamoDB會將當前的分區數量擴充一倍
圖中表示的是,起初表分配了4個分區(讀取預設5000,寫入預設2000,那么套用公式(5000 / 3000) + (2000 / 1000) = 3.6667 向上取整后 = 4個分區數)
每個分區有1250個讀取單元和500個寫入單元,此時將讀容量從5000調整到8000時,此時4個分區不能滿足了,DynamoDB將分區數翻倍 4 * 2 = 8個分區,因此每個分區醬油1000個讀取單元和250個寫入單元
存儲要求增加:如果某個分區數據超過了限制的10G,DynamoDB將把這個分區拆成兩個,并且數據平均分配到新的兩個分區中。造成某個分區超過限制10G的原因有很多,其中比較常見的就是分區鍵散列度不夠,導致數據偏移到某一個分區。
如圖,紅框分區填滿數據后,DynamoDB將把這個分區拆出兩個新分區,在拆之前,總容量上限為8個分區 * 10GB容量 = 80GB,拆后總容量上限為9個分區 * 10GB容量 = 90GB
注意:這種從分區拆出的兩個分區只會共享原分區的讀寫吞吐量。舉個例子:
5000讀和2000寫,DynamoDB此時創建4個分區,每個分區讀寫容量為
5000 / 4 = 1250讀取容量
2000 / 4 = 500 寫入容量
假設其中一個分區即將滿10G,DynamoDB會將這個分區拆出兩個分區,此時這個表共有5個分區,他們的寫入容量分別為
其中3個分區讀寫容量依然是1250讀取容量和500寫入容量,被拆出的兩個分區讀寫為1250 / 2 = 625讀取和500 / 2 = 250寫入
參考:https://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/Introduction.html
總結
以上是生活随笔為你收集整理的DynamoDB入门知识和一些注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 启动linux的rpc服务的命令
- 下一篇: 安装redis 6.0.6