DynamoDB分区密钥如何工作

时间:2017-08-09 04:33:55

标签: amazon-dynamodb

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

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

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

3 个答案:

答案 0 :(得分:21)

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

对已创建的分区数没有可见性 - 它完全由DynamoDB管理。随着数据量的增加或预配置吞吐量的增加,将创建其他分区。

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

如果对同一个分区键进行了多次查询,则可能会导致 Hot Partition 限制总可用吞吐量。

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

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

请参阅:Partitions and Data Distribution

答案 1 :(得分:11)

根据每个AWS DynamoDB博客文章:Choosing the Right DynamoDB Partition Key

  

选择正确的DynamoDB分区密钥是其中的重要一步   设计和构建可扩展且可靠的应用程序   DynamoDB。

     

什么是分区键?

     

DynamoDB支持两种类型的主键:

     

分区键:也称为哈希键,分区键由单个属性组成。 DynamoDB中的属性类似于   许多其他数据库系统中字段或列的方法。

     

分区键和排序键:这种键称为复合主键或哈希范围键,由两个属性组成。该   第一个属性是分区键,第二个属性是   排序键。这是一个例子:

enter image description here

  

为什么我需要分区密钥?

     

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

     

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

     

具有相同分区键的所有项目都存储在一起,并且用于   复合分区键,按排序键值排序。 DynamoDB   如果集合大小变大,将按排序键拆分分区   超过10 GB。

enter image description here

  

分区键的建议

     

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

     

使用复合属性。尝试将多个属性合并到   如果符合您的访问模式,则形成唯一密钥。例如,   考虑使用customerid + productid + countrycode作为的订单表   partition key和order_date作为排序键。

     当有大量读取流量时,

缓存热门项目。   缓存充当低通滤波器,防止异常读取   来自沼泽分区的热门商品。例如,考虑一个表   有产品交易信息。预计会有一些交易   在黑色星期五或者黑色星期五等重大销售活动中比其   网络星期一。

     

从预定范围添加随机数/数字以进行重写   用例。如果您希望分区密钥的写入量很大,   使用额外的前缀或后缀(来自预定义的固定数字   范围,比如1-10)并将其添加到分区键。例如,   考虑一张发票交易表。单个发票可以包含   每个客户有数千笔交易。

阅读更多@ Choosing the Right DynamoDB Partition Key

答案 2 :(得分:3)

混乱点:

其他答案已经详细说明了DynamoDB如何创建分区。因此,在此不做详细介绍,让我解释一下混乱的根本原因,同时尝试了解DynamoDB中的分区键和分区之间的关系。

  • IMHO, 将密钥命名为“分区密钥”是造成混乱的原因。它应该仅称为主键 。通过听到分区键,我们的思想开始将每个分区键与一个分区相关联。一对一关系。事实并非如此。正如问题本身所提到的,键是“内部哈希函数”的输入。该函数的输出是对该分区的实际引用。

  • 因此,对于具有1000个用户ID(分区键)的表, DynamoDB不必具有1000个分区。它可以具有1/5/10任意数量的分区,这取决于通过您提到的整个(容量单位)设置。

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

  • 还可以根据数据量的增加来增加分区数。当现有分区无法处理它时。

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

更多详细信息here