DynamoDB分区密钥如何工作

use*_*793 14 amazon-dynamodb

我试图了解如何为DynamoDB表创建分区.

根据这篇博客,"具有相同分区键的所有项目都存储在一起",所以如果我有一个用户ID从1到1000的表,这是否意味着我将有1000个分区?或者它的"内部哈希函数",但我们怎么知道会有多少分区?

它后来建议使用1-10中的随机后缀来均匀分配每个分区的数据,但是它如何知道它会查询给定发票号码10次?只有你有10个分区?但在这种情况下,您可能有数千个发票号,这意味着将创建相同数量的分区,并查询查询发票号

Joh*_*ein 28

创建Amazon DynamoDB表时,您可以以每秒读数和每秒写入数指定所需的吞吐量.然后,该表将跨多个服务器(分区)进行配置,足以提供所请求的吞吐量.

无法查看创建的分区数 - 它完全由DynamoDB管理.随着数据量的增加或预配置吞吐量的增加,将创建其他分区.

假设您已经请求每秒1000次读取,并且数据已在10个服务器(10个分区)内部分区.每个分区将提供每秒100次读取.如果所有读取请求都是针对相同的分区键,则吞吐量将限制为每秒100次读取.如果请求分布在一系列不同的值上,则吞吐量可以是每秒1000次读取.

如果对同一分区键进行了许多查询,则可能会导致热分区限制总可用吞吐量.

可以把它想象成一个在柜员窗前排成排的银行.如果每个人都在一个出纳员排队,那么可以为更少的顾客服务.在不同的柜员窗口分配客户更有效.一个好的分区键分发的客户可能是客户数量,因为它是针对每个客户不同的.一个糟糕的分区密钥可能是他们的邮政编码,因为他们都住在银行附近的同一区域.

简单的规则是您应该选择具有一系列不同值的分区键.

请参阅:分区和数据分布


LuF*_*FFy 15

作为每个AWS DynamoDB博客文章:选择正确的DynamoDB分区密钥

选择正确的DynamoDB分区密钥是在DynamoDB之上设计和构建可扩展且可靠的应用程序的重要步骤.

什么是分区键?

DynamoDB支持两种类型的主键:

分区键:也称为哈希键,分区键由单个属性组成.DynamoDB中的属性在很多方面与其他数据库系统中的字段或列类似.

分区键和排序键:称为复合主键或散列范围键,此类键由两个属性组成.第一个属性是分区键,第二个属性是排序键.这是一个例子:

在此输入图像描述

为什么我需要分区密钥?

DynamoDB将数据存储为属性组,称为项目.项类似于其他数据库系统中的行或记录.DynamoDB根据必须唯一的主键值存储和检索每个项目.项目分布在10 GB存储单元中,称为分区(DynamoDB内部的物理存储).每个表都有一个或多个分区,如图2所示.有关更多信息,请参阅DynamoDB开发人员指南中的了解分区行为.

DynamoDB使用分区键的值作为内部哈希函数的输入.散列函数的输出确定将存储项目的分区.每个项目的位置由其分区键的哈希值确定.

具有相同分区键的所有项目一起存储,对于复合分区键,按排序键值排序.如果集合大小超过10 GB,DynamoDB将按排序键拆分分区.

在此输入图像描述

分区键的建议

使用高基数属性.这些属性具有每个项目的不同值,如电子邮件ID,employee_no,customerid,sessionid,ordered等.

使用复合属性.如果符合您的访问模式,请尝试组合多个属性以形成唯一键.例如,考虑一个订单表,其中customerid + productid + countrycode作为分区键,order_date作为排序键.

当存在大量读取流量时,缓存热门项目.缓存充当低通过滤器,防止从淹没分区中读取异常受欢迎的项目.例如,考虑一个包含产品交易信息的表.在黑色星期五或网络星期一等重大销售活动中,预计一些交易将比其他交易更受欢迎.

为预定范围添加随机数/数字,用于写入大量 用例.如果您希望分区密钥有大量写入,请使用附加前缀或后缀(预定义范围内的固定数字,例如1-10)并将其添加到分区键.例如,考虑发票交易表.单个发票可以包含每个客户端数千个事务.

阅读更多@ 选择正确的DynamoDB分区密钥

  • 该页面对我来说似乎很矛盾。它建议使用“高基数属性”,例如employeeID,customerID,orderID等…。但是,在页面的下半部分,它描述了由关系数据库引擎生成的顺序ID或唯一ID(在我看来,这是完美的高基数属性),作为“分区键的反模式”。我糊涂了! (3认同)

Dex*_*ter 11

混淆点:

其他答案已经详细解释了 DynamoDB 如何创建分区。因此,在不涉及这些细节的情况下,让我在尝试了解 DynamoDB 中分区键和分区之间的关系时解释混淆根本原因。

  • 恕我直言,将密钥命名为“分区密钥”是造成混淆的原因。它应该被称为 Primary Key。通过听到分区键,我们的头脑开始将每个分区键与一个分区相关联。一对一的关系。事实并非如此。正如问题本身所提到的,关键是“内部散列函数”的输入。该函数的输出是对分区的实际引用。

  • 因此,对于具有 1000 个用户 ID(分区键)的表,DynamoDB 不需要有 1000 个分区。它可能有 1/5/10 任意数量的分区,这由您指定的吞吐量(容量单位)设置决定。

  • 当您增加吞吐量设置时,分区可能会增加。

  • 当现有分区无法处理时,分区数量也可以随着数据量的增加而增加。

  • 因此,我们在 DynamoDB 中所说的分区键只不过是表示表中唯一项的主键(在组合键的情况下,借助排序键)。它不直接与分区(SSD 支持的表的存储分配单元)一对一关联。分区的实际键是通过将此分区键传递给内部函数来获得的。

更多细节在这里

  • 这解释了我昨天在尝试对“分区键”建模时遇到的困难,就像在其他 NoSQL 数据库中所做的那样。这应该是最好的答案。 (2认同)