当前位置: 首页 > 知识库问答 >
问题:

对于单个分区键值,是否有10GB的DynamoDB最大分区大小?

尉迟卓
2023-03-14

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

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

“了解分区行为”部分指出:

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

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

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.Partitions

文档还讨论了本地辅助索引限制为10GB数据的限制,之后您开始收到错误。

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

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LSI.html#LSI.ItemCollections

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

这个问题的背景是,我已经看到了很多在多帐篷环境中使用TenantId之类的东西作为分区键的示例。但如果特定的TenantId可以拥有超过10 GB的数据,这似乎是有限制的。

我一定错过了什么?

共有1个答案

樊宏邈
2023-03-14

TL;通过将范围键值包含到分区函数中,即使项目具有相同的分区键值,也可以对其进行拆分。

长版本:

这是一个很好的问题,在这里和这里的文档中都有说明。正如文档所述,DynamoDB表中的项根据它们的分区键值(以前称为哈希键)使用哈希函数划分为一个或多个分区。分区的数量是基于所需的最大总吞吐量以及项在密钥空间中的分布而得出的。换言之,如果选择分区键,使其在分区键空间中均匀地分布项目,则分区最终每个都具有大约相同数量的项目。每个分区中的项目数大约等于表中的项目总数除以分区数。

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

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

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

另一方面,可以有一个或几个对应于大量项目的分区键值。如果表模式使用排序键并且多个项目散列到同一个分区键,通常会发生这种情况。在这种情况下,单个分区键可能负责总共占用超过10 GB的项目。这将导致拆分。在这种情况下,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个项目,但有两个分区键值:DF看起来不太好。D有100个项目,而F有500个项目。

如果分区键值为F的项不断被添加,最终分区将被拆分。为了能够拆分具有相同哈希键的项,必须使用范围键值,因此我们将出现以下情况:

..[ 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

我希望这有助于可视化,项目通常根据通过对其分区键值应用哈希函数获得的哈希值映射到分区,但如果需要,被哈希的值也可以包括分区键和排序键值。

 类似资料:
  • 从AWS DynamoDB留档: 如果将主键属性定义为字符串类型属性,则会应用以下附加约束: 对于简单的主键,第一个属性值(分区键)的最大长度为2048字节。 对于复合主键,第二个属性值(排序键)的最大长度为1024字节。 这是否意味着在复合主键的情况下,分区键的最大长度不受限制? (每个项目的大小通常有400 KB的限制,但问题不在于此)

  • 问题内容: HTML是否区分大小写? 在一个示例中,我正在使用它说: 还是会有所不同(或根本没有)? 问题答案: 否,但是将HTML标记保持小写被认为是一种好习惯。

  • 问题内容: 在研究G1 GC时,我发现了这篇文章:http : //www.oracle.com/technetwork/articles/java/g1gc-1984535.html。在该文章中,内容如下: G1 GC是一个区域化的,按代划分的垃圾收集器,这意味着Java对象堆(堆)被划分为多个大小相等的区域。启动时,Java虚拟机(JVM)设置区域大小。区域大小可以从1 MB到32 MB不等,

  • 问题内容: 我正在尝试提出一个要求区分大小写的结果的请求。 例如在我的数据库中 该请求是 但我有3行作为结果,我只想要abcdef 我试图找到一个解决方案 但是我有这个错误: 未知归类:’Latin1_General_CS_AS’{“成功”:false,“错误”:“#1273-未知归类:’Latin1_General_CS_AS’”} 谢谢 问题答案: 感谢您的帮助,我找到了不是latin1 ut

  • 问题内容: 我正在研究一些代码,并找到了对的调用。PHP对函数名称是否区分大小写?我记得在某处读过这篇文章,但似乎找不到任何参考。 问题答案: 我在此引用: 注意:函数名称不区分大小写,尽管调用函数通常是一种很好的形式,因为它们出现在声明中。 因此,它看起来像用户定义的函数是不区分大小写,有一个投票下PHP5区分大小写制作功能/对象。

  • 问题内容: 我正在努力理解为什么我的基本href似乎区分大小写。我有一个带有基本href的页面,并利用了angularjs路由。 的HTML: js: 如果我导航到http://www.example.com/Foo/,那就很好。但是,当我导航到http://www.example.com/foo/时,出现一个角度错误: 如果有帮助/有所作为,则将站点托管在IIS上并使用MVC 4。 问题答案: