Amazon web services 对于单个分区键值,DynamoDB的最大分区大小是否为10GB?

Amazon web services 对于单个分区键值,DynamoDB的最大分区大小是否为10GB?,amazon-web-services,amazon-dynamodb,primary-key-design,Amazon Web Services,Amazon Dynamodb,Primary Key Design,我已经阅读了很多关于设计分区键和排序键的DynamoDB文档,但我认为我肯定缺少一些基本的东西 如果分区密钥设计不好,那么当单个分区密钥值的数据超过10GB时会发生什么情况 “了解分区行为”部分说明: “单个分区可以容纳大约10 GB的数据” 它如何对单个分区键进行分区 文档还讨论了本地二级索引限制为10GB数据的限制,在此限制之后,您将开始出现错误 “任何项集合的最大大小为10 GB。此限制不适用于没有本地二级索引的表;只有具有一个或多个本地二级索引的表才会受到影响。” 我能理解。因此,如

我已经阅读了很多关于设计分区键和排序键的DynamoDB文档,但我认为我肯定缺少一些基本的东西

如果分区密钥设计不好,那么当单个分区密钥值的数据超过10GB时会发生什么情况

“了解分区行为”部分说明:

“单个分区可以容纳大约10 GB的数据”

它如何对单个分区键进行分区

文档还讨论了本地二级索引限制为10GB数据的限制,在此限制之后,您将开始出现错误

“任何项集合的最大大小为10 GB。此限制不适用于没有本地二级索引的表;只有具有一个或多个本地二级索引的表才会受到影响。”

我能理解。因此,如果数据超过10GB,它是否还有其他一些魔力可以将数据分区为单个分区键。或者它只是在不断地增加分区?这对您的关键设计有什么影响

这个问题的背景是,我已经看到了很多在多tentant环境中使用TenantId之类的东西作为分区键的例子。但如果某个特定租户的数据量可能超过10GB,这似乎会受到限制

我一定错过了什么;通过将范围键值包含到分区函数中,可以拆分DR项,即使它们具有相同的分区键值


长版本:

这是一个非常好的问题,文档和文档中对此进行了说明。如文档所述,DynamoDB表中的项根据它们的分区键值(以前称为散列键)使用h分区到一个或多个分区中。分区的数量是根据所需的最大总吞吐量以及密钥空间中项的分布来计算的。换句话说,如果选择分区键,使其在分区键空间中均匀地分布项,则分区最终每个都具有大致相同的项数。每个分区中的项目数大约等于表中的项目总数除以分区数

文档还指出,每个分区的空间限制在10GB左右。一旦存储在任何分区中的所有项的大小之和超过10GB,DynamoDB将启动后台进程,该进程将自动透明地将这些分区一分为二,从而生成两个新分区。同样,如果项目均匀分布,这是很好的,因为每个新的子分区最终将容纳原始分区中大约一半的项目

拆分的一个重要方面是,拆分分区的吞吐量都将是原始分区可用吞吐量的一半

到目前为止,我们已经报道了这个令人高兴的案例

另一方面,可以有一个或几个分区键值,对应于大量的项。如果表模式使用一个排序键和多个项哈希到同一分区键,则通常会发生这种情况。在这种情况下,单个分区键可能负责占用超过10GB的项。这将导致分裂。在这种情况下,DynamoDB仍将创建两个新分区,但它不仅使用分区键来决定项目应存储在哪个子分区中,还将使用排序键

示例

在不丧失通用性的情况下,为了使事情更容易推理,假设有一个表,其中分区键是字母(a-Z),数字用作排序键

想象一下这个表大约有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))


我希望这有助于直观地看到,项目通常是基于通过对分区键值应用哈希函数获得的哈希值映射到分区的,但如果需要,被哈希的值也可以包括分区键+排序键值。

虽然这是一个很好的答案,但它确实涵盖了最坏的情况对于倾斜的数据,只有分区键,没有排序键。在这种情况下,拆分过程会发生什么情况?Hi@florins-根据设计,在没有排序键的情况下,分区方案确保数据在所有分区之间均匀分布。由于项均匀分布,所有分区都均匀填充,因此当发生拆分时,它们将出现在所有分区中。这有意义吗?我不完全理解排序键是如何包含在哈希函数中的。如果我们这样做,具有连续排序键的元素可能最终会出现在不同的分区中。如果发生这种情况,我们就不能