首页 > 解决方案 > 混淆 CosmosDB 的分区键

问题描述

我正在研究 CosmosDB 的 Python 示例(请参阅CosmosDB for Python),我看到容器定义如下:

    partition_key = PartitionKey(path='/id', kind='Hash')
    db.create_container(id=id, partition_key=partition_key)

读取项目的代码:

response = container.read_item(item=doc_id, partition_key=doc_id)

现在我的困惑是为什么选择与唯一文档ID相同的分区键。那么,这里分区有什么用呢?

在我看来,分区是适用于共享某个公共组的键的东西,例如对食物组的分区。

标签: pythonazure-cosmosdbpartitioning

解决方案


在我看来,分区是适用于共享某个公共组的键的东西,例如对食物组的分区。

这并不完全正确。如果您查看文档,它说您应该选择具有高基数的分区键。换句话说,该属性应该具有广泛的可能值。它应该是一个不会改变的值。您还需要注意,如果要更新或删除文档,则需要传递分区键。

在后台发生的事情是,Cosmos 可以有多个服务器,从 1 到无穷大。它使用您的分区键对您的数据进行逻辑分区。但它仍然在一台服务器上。如果您的吞吐量超过 10K RU 或存储超过 50GB,Cosmos 将自动拆分为 2 个物理服务器。这意味着您的数据被分成两台服务器。拆分可以继续进行,直到每台服务器的最大吞吐量 < 10K RU 并且每台服务器的存储量 < 50GB。这就是 Cosmos 管理无限规模的方式。您可能会问如何预测文档可能进入哪个分区。答案是你不能。Cosmos 使用您的分区键生成哈希值,其值介于 1 和服务器数量之间。

所以 doc id 是一个很好的分区键,因为它是唯一的并且可以有很大范围的值。

请注意,一旦 Cosmos 分区到多个服务器,即使您减少存储或减少吞吐量,目前也没有自动方法来减少服务器数量。


推荐阅读