[英]Is there a DynamoDB max partition size of 10GB for a single partition key value?
我已經閱讀了很多關於設計分區鍵和排序鍵的DynamoDB文檔,但我認為我必須遺漏一些基本的東西。
如果您的分區鍵設計錯誤,那么當SINGLE分區鍵值的數據超過10GB時會發生什么?
“理解分區行為”部分指出:
“單個分區可容納大約10 GB的數據”
它如何分區單個分區鍵?
文檔還討論限制,本地二級索引限制為10GB數據,之后您開始收到錯誤。
“任何項目集合的最大大小為10 GB。此限制不適用於沒有本地二級索引的表;只有具有一個或多個本地二級索引的表才會受到影響。”
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LSI.html#LSI.ItemCollections
我能理解。 如果它超過10GB,它還有一些其他的魔法來分割單個分區鍵的數據。 或者只是繼續增長分區? 這對您的關鍵設計有何影響?
這個問題的背景是我已經看到很多在TenantId中使用類似TenantId作為分區鍵的例子。 但是,如果特定的TenantId可以擁有超過10 GB的數據,那似乎是有限的。
我肯定錯過了什么?
TL; DR - 項目可以通過將范圍鍵值包含在分區函數中來拆分,即使它們具有相同的分區鍵值。
長版:
這是一個非常好的問題,它在這里和這里的文檔中得到了解決。 正如文檔所述,DynamoDB表中的項目使用ah ashing函數根據其分區鍵值(以前稱為哈希鍵 )分區為一個或多個分區。 分區數是根據最大期望總吞吐量以及密鑰空間中項目的分布得出的。 換句話說,如果選擇分區密鑰使得它在分區密鑰空間上均勻地分配項目,則分區最終具有大致相同數量的項目。 每個分區中的項目數大約等於表中項目的總數除以分區數。
該文檔還指出每個分區限制為大約10GB的空間。 並且,一旦存儲在任何分區中的所有項目的大小總和超過10GB,DynamoDB將啟動后台進程,該進程將自動且透明地將這些分區分成兩半 - 從而產生兩個新分區。 再一次,如果項目是均勻分布的,這很好,因為每個新的子分區最終將保留原始分區中大約一半的項目。
拆分的一個重要方面是拆分分區的吞吐量每個都是原始分區可用吞吐量的一半。
到目前為止,我們已經涵蓋了幸福的案例。
另一方面,可以具有對應於非常大量項目的一個或幾個分區鍵值。 如果表模式使用排序鍵並且多個項散列到同一分區鍵,則通常會發生這種情況。 在這種情況下,單個分區鍵可能負責共同占用10 GB以上的項目。 這將導致分裂。 在這種情況下,DynamoDB仍將創建兩個新分區,但不是僅使用分區鍵來決定項目應存儲在哪個子分區中,它還將使用排序鍵。
例
在不失一般性並且易於推理的情況下,假設有一個表格,其中分區鍵是字母(AZ),並且數字用作排序鍵。
該表具有大約9個分區的成像,因此字母A,B,C將存儲在分區1中,字母D,E,F將存儲在分區2中,等等。
在下圖中,分區邊界標記為h(A0)
, h(D0)
等,以顯示,例如,存儲在第一個分區中的項是分區鍵散列到h(A0)
之間的值的項和h(D0)
- 0
是有意的,接下來就派上用場了。
[ h(A0) ]--------[ h(D0) ]---------[ h(G0) ]-------[ h(J0) ]-------[ h(M0) ]- ..
| A B C | E F | G I | J K L |
| 1 1 1 | 1 1 | 1 1 | 1 1 1 |
| 2 2 2 | 2 2 | 2 | 2 |
| 3 3 | 3 | 3 | |
.. .. .. .. ..
| 100 | 500 | | |
+-----------------+----------------+---------------+---------------+-- ..
請注意,對於大多數分區鍵值,表中有1到3個項目,但有兩個分區鍵值: D
和F
看起來不太好。 D
有100件物品,而F
有500件。
如果分區鍵值為F
不斷添加,最終分區[h(D0)-h(G0))
將被分割。 為了能夠拆分具有相同散列鍵的項,必須使用范圍鍵值,因此我們最終會遇到以下情況:
..[ h(D0) ]------------/ [ h(F500) ] / ----------[ h(G0) ]- ..
| E F | F |
| 1 1 | 501 |
| 2 2 | 502 |
| 3 | 503 |
.. .. ..
| 500 | 1000 |
.. ---+-----------------------+---------------------+--- ..
原分區[h(D0)-h(G0))
分為[h(D0)-h(F500))
和[h(F500)-h(G0))
我希望這有助於可視化項目通常根據通過將散列函數應用於其分區鍵值而獲得的散列值映射到分區,但是如果需要,散列值可以包括分區鍵+排序鍵值為好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.