我试图了解如何为DynamoDB表创建分区。
根据这个blog,“具有相同分区键的所有项目都存储在一起”,所以如果我有一个用户ID从1到1000的表,这是否意味着我将有1000个分区?或者它的“内部哈希函数”,但我们怎么知道会有多少分区?
后来建议使用1-10中的随机后缀来均匀分配每个分区的数据,但是它如何知道它会查询给定发票号码10次?只有你有10个分区?但在这种情况下,您可以拥有数千个发票编号,这意味着将创建相同数量的分区,并查询查询发票编号
答案 0 :(得分:21)
创建Amazon DynamoDB表时,您可以以每秒读数和每秒写入数指定所需的吞吐量。然后,该表将跨多个服务器(分区)进行配置,足以提供所请求的吞吐量。
您对已创建的分区数没有可见性 - 它完全由DynamoDB管理。随着数据量的增加或预配置吞吐量的增加,将创建其他分区。
假设您已经请求每秒1000次读取,并且数据已在10个服务器(10个分区)内部分区。每个分区将提供每秒100次读取。如果所有读取请求都针对相同的分区键,则吞吐量将限制为每秒100次读取。如果请求分布在一系列不同的值上,则吞吐量可以是完整的每秒1000次读取。
如果对同一个分区键进行了多次查询,则可能会导致 Hot Partition 限制总可用吞吐量。
把它想象成一个在柜员窗口前面有行的银行。如果每个人都在一个出纳员排队,那么可以为更少的顾客服务。在不同的柜员窗口分配客户更有效。分发客户的良好分区密钥可能是客户编号,因为每个客户的编号都不同。 糟糕的分区密钥可能是他们的邮政编码,因为他们都住在银行附近的同一区域。
简单的规则是,您应该选择具有一系列不同值的分区键。
答案 1 :(得分:11)
根据每个AWS DynamoDB博客文章:Choosing the Right DynamoDB Partition Key
选择正确的DynamoDB分区密钥是其中的重要一步 设计和构建可扩展且可靠的应用程序 DynamoDB。强>
什么是分区键?
DynamoDB支持两种类型的主键:
分区键:也称为哈希键,分区键由单个属性组成。 DynamoDB中的属性类似于 许多其他数据库系统中字段或列的方法。
分区键和排序键:这种键称为复合主键或哈希范围键,由两个属性组成。该 第一个属性是分区键,第二个属性是 排序键。这是一个例子:
为什么我需要分区密钥?
DynamoDB将数据存储为属性组,称为项目。项目 类似于其他数据库系统中的行或记录。 DynamoDB 根据主键值存储和检索每个项目 必须是独一无二的项目分布在10 GB存储单元中, 称为分区(DynamoDB内部的物理存储)。每张桌子 有一个或多个分区,如图2所示。更多 信息,请参阅了解DynamoDB中的分区行为 开发者指南。
DynamoDB使用分区键的值作为内部的输入 哈希函数。哈希函数的输出确定了 将存储项目的分区。每个项目的位置是 由其分区键的哈希值确定。
具有相同分区键的所有项目都存储在一起,并且用于 复合分区键,按排序键值排序。 DynamoDB 如果集合大小变大,将按排序键拆分分区 超过10 GB。
分区键的建议
使用高基数属性。这些属性具有 每个项目的不同值,如电子邮件ID,employee_no, customerid,sessionid,ordered等等。
使用复合属性。尝试将多个属性合并到 如果符合您的访问模式,则形成唯一密钥。例如, 考虑使用customerid + productid + countrycode作为的订单表 partition key和order_date作为排序键。
当有大量读取流量时,缓存热门项目。 缓存充当低通滤波器,防止异常读取 来自沼泽分区的热门商品。例如,考虑一个表 有产品交易信息。预计会有一些交易 在黑色星期五或者黑色星期五等重大销售活动中比其 网络星期一。
从预定范围添加随机数/数字以进行重写 用例。如果您希望分区密钥的写入量很大, 使用额外的前缀或后缀(来自预定义的固定数字 范围,比如1-10)并将其添加到分区键。例如, 考虑一张发票交易表。单个发票可以包含 每个客户有数千笔交易。
答案 2 :(得分:3)
混乱点:
其他答案已经详细说明了DynamoDB如何创建分区。因此,在此不做详细介绍,让我解释一下混乱的根本原因,同时尝试了解DynamoDB中的分区键和分区之间的关系。
IMHO, 将密钥命名为“分区密钥”是造成混乱的原因。它应该仅称为主键 。通过听到分区键,我们的思想开始将每个分区键与一个分区相关联。一对一关系。事实并非如此。正如问题本身所提到的,键是“内部哈希函数”的输入。该函数的输出是对该分区的实际引用。
因此,对于具有1000个用户ID(分区键)的表, DynamoDB不必具有1000个分区。它可以具有1/5/10任意数量的分区,这取决于通过您提到的整个(容量单位)设置。
当您增加吞吐量设置时,分区可能会增加。
还可以根据数据量的增加来增加分区数。当现有分区无法处理它时。
因此,在DynamoDB中我们所谓的分区键不过是表示表中唯一项的主键(在组合键的情况下,借助排序键)。它并不直接与分区(由SSD支持的表的存储分配单元)一对一关联。通过将分区键传递给内部has函数来获得分区的实际键。
更多详细信息here。