Azure cosmosdb 为什么cosmos db为同一个分区键值创建5个分区?

Azure cosmosdb 为什么cosmos db为同一个分区键值创建5个分区?,azure-cosmosdb,partitioning,azure-cosmosdb-sqlapi,Azure Cosmosdb,Partitioning,Azure Cosmosdb Sqlapi,我们正在使用Cosmos DB SQL API,下面是一个集合XYZ,其中包含: 尺寸:不限 吞吐量:50000 RU/s 分区键:散列 我们正在插入200000条记录,每条记录大小约为2.1KB,分区键列的值相同。据我们所知,所有具有相同分区键值的文档都存储在相同的逻辑分区中,无论是固定大小还是无限大小的集合,逻辑分区都不应超过10GB的限制 显然,我们的总数据甚至不到0.5 GB。然而,在门户网站Azure Cosmos DB的度量刀片中,它说: 集合XYZ有5个分区键范围。配置的吞吐量为

我们正在使用Cosmos DB SQL API,下面是一个集合XYZ,其中包含:

尺寸:不限 吞吐量:50000 RU/s 分区键:散列

我们正在插入200000条记录,每条记录大小约为2.1KB,分区键列的值相同。据我们所知,所有具有相同分区键值的文档都存储在相同的逻辑分区中,无论是固定大小还是无限大小的集合,逻辑分区都不应超过10GB的限制

显然,我们的总数据甚至不到0.5 GB。然而,在门户网站Azure Cosmos DB的度量刀片中,它说:

集合XYZ有5个分区键范围。配置的吞吐量为 平均分布在这些分区上,每个分区10000 RU/s

这与我们迄今为止在MSFT文档中研究的内容不符。我们错过什么了吗?为什么要创建这5个分区

发件人:

简而言之,以下是分区在Azure Cosmos DB中的工作原理:

您提供了一组带有tru/s的Azure Cosmos DB容器 每秒请求吞吐量。 幕后,Azure Cosmos DB 提供每秒服务T个请求所需的物理分区。 如果T高于每个物理分区的最大吞吐量T, 然后Azure Cosmos DB规定N=T/T物理分区。价值 每个分区的最大吞吐量由Azure Cosmos配置 DB,该值是根据总配置吞吐量和 使用的硬件配置。 。。更重要的是:

当您提供的吞吐量高于t*N时,Azure Cosmos DB会拆分一个或多个物理分区以支持更高的吞吐量

因此,您请求的RU吞吐量(50k)似乎高于上面提到的t。考虑到这些数字,t似乎约为10k RU/s

关于t的实际值,CosmosDB团队成员表示:

[-]未明确提及此值的原因是,它将随着Azure Cosmos DB团队更改硬件或推出硬件升级而更改或增加。其目的是显示每个分区机器总是有一个限制,并且分区密钥将分布在这些分区中

您可以通过以最大吞吐量饱和单个分区键的写入来发现当前值

发件人:

简而言之,以下是分区在Azure Cosmos DB中的工作原理:

您提供了一组带有tru/s的Azure Cosmos DB容器 每秒请求吞吐量。 幕后,Azure Cosmos DB 提供每秒服务T个请求所需的物理分区。 如果每个物理分区的最大吞吐量大于, 然后Azure Cosmos DB规定N=T/T物理分区。价值 每个分区的最大吞吐量由Azure Cosmos配置 DB,该值是根据总配置吞吐量和 使用的硬件配置。 。。更重要的是:

当您提供的吞吐量高于t*N时,Azure Cosmos DB会拆分一个或多个物理分区以支持更高的吞吐量

因此,您请求的RU吞吐量(50k)似乎高于上面提到的t。考虑到这些数字,t似乎约为10k RU/s

关于t的实际值,CosmosDB团队成员表示:

[-]未明确提及此值的原因是,它将随着Azure Cosmos DB团队更改硬件或推出硬件升级而更改或增加。其目的是显示每个分区机器总是有一个限制,并且分区密钥将分布在这些分区中

您可以通过以最大吞吐量饱和单个分区键的写入来发现当前值

使用无限制集合大小时,默认情况下,将为您提供5个物理分区密钥范围。该数字可以更改,但截至2018年5月,默认为5。您可以将每个物理分区看作一个服务器。因此,您的数据将分布在5台物理服务器之间。随着数据大小的增长,您的数据将根据更多的物理分区自动重新分发。这就是为什么在设计中预先获得正确的分区键是如此重要

在您的场景中,所有200k记录都有相同的分区键PK,问题是您将有热点。您有5台物理服务器,但只会使用一台。其他4个将闲置,结果是在相同的价位下性能会降低。你支付了5万卢比/秒,但只能使用10万卢比/秒。把你的PK改成更均匀的分布。当然,您读取数据的方式会有所不同。如果您提供有关您存储的文档的更多详细信息,那么我们可能会提供建议。如果您只是通过每个文档ID调用ReadDocumentSync进行点查找,那么您可以安全地在do的ID字段上进行分区 文件。这将在所有5个物理分区中分布所有200000个文档,并使您的50KRU/s吞吐量最大化。一旦有效地做到这一点,您可能会发现可以将RU使用量降低到更低的水平,并节省大量资金。由于每个2.1KB的记录只有20万条,您可能会降低到2500 RU/s,这是您现在支付的成本的1/20

*服务器在引号中,因为每个物理分区实际上是许多服务器的集合,这些服务器的高可用性和吞吐量都是负载平衡的,这取决于您的一致性级别。

使用无限集合大小时,默认情况下,将为您提供5个物理分区密钥范围。该数字可以更改,但截至2018年5月,默认为5。您可以将每个物理分区看作一个服务器。因此,您的数据将分布在5台物理服务器之间。随着数据大小的增长,您的数据将根据更多的物理分区自动重新分发。这就是为什么在设计中预先获得正确的分区键是如此重要

在您的场景中,所有200k记录都有相同的分区键PK,问题是您将有热点。您有5台物理服务器,但只会使用一台。其他4个将闲置,结果是在相同的价位下性能会降低。你支付了5万卢比/秒,但只能使用10万卢比/秒。把你的PK改成更均匀的分布。当然,您读取数据的方式会有所不同。如果您提供有关您存储的文档的更多详细信息,那么我们可能会提供建议。如果您只是通过每个文档ID调用ReadDocumentSync进行点查找,那么您可以安全地对文档的ID字段进行分区。这将在所有5个物理分区中分布所有200000个文档,并使您的50KRU/s吞吐量最大化。一旦有效地做到这一点,您可能会发现可以将RU使用量降低到更低的水平,并节省大量资金。由于每个2.1KB的记录只有20万条,您可能会降低到2500 RU/s,这是您现在支付的成本的1/20


*服务器在引号中,因为每个物理分区实际上是许多服务器的集合,这些服务器的高可用性和吞吐量都是负载平衡的,这取决于您的一致性级别。

谢谢您提供的信息。我可以得到一个文档的参考吗?该文档说明在使用无限制集合大小时,默认情况下将为您提供5个物理分区密钥范围。@NikhilVartak这不是一个硬数字,它会根据硬件的不同而变化。关键是不要担心CosmosDB将管理的物理分区的数量,只需专注于拥有一个分布良好的分区密钥,这样CosmosDB就可以根据您的吞吐量放大或缩小。如果您对每个200k记录使用相同的分区密钥,那么您就是在自找麻烦,因为您将有热点。在您的5个物理分区服务器中,只有一个将被使用,其他4个将处于空闲状态,并且您将为较低的性能支付更多的费用。感谢您提供的信息。我可以得到一个文档的参考吗?该文档说明在使用无限制集合大小时,默认情况下将为您提供5个物理分区密钥范围。@NikhilVartak这不是一个硬数字,它会根据硬件的不同而变化。关键是不要担心CosmosDB将管理的物理分区的数量,只需专注于拥有一个分布良好的分区密钥,这样CosmosDB就可以根据您的吞吐量放大或缩小。如果您对每个200k记录使用相同的分区密钥,那么您就是在自找麻烦,因为您将有热点。在您的5个物理分区服务器中,只有一个将被使用,其他4个将处于空闲状态,并且您将为较低的性能付出更多的代价。