python - 混淆 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相同的分区键。那么,这里分区有什么用呢?
在我看来,分区是适用于共享某个公共组的键的东西,例如对食物组的分区。
解决方案
在我看来,分区是适用于共享某个公共组的键的东西,例如对食物组的分区。
这并不完全正确。如果您查看文档,它说您应该选择具有高基数的分区键。换句话说,该属性应该具有广泛的可能值。它应该是一个不会改变的值。您还需要注意,如果要更新或删除文档,则需要传递分区键。
在后台发生的事情是,Cosmos 可以有多个服务器,从 1 到无穷大。它使用您的分区键对您的数据进行逻辑分区。但它仍然在一台服务器上。如果您的吞吐量超过 10K RU 或存储超过 50GB,Cosmos 将自动拆分为 2 个物理服务器。这意味着您的数据被分成两台服务器。拆分可以继续进行,直到每台服务器的最大吞吐量 < 10K RU 并且每台服务器的存储量 < 50GB。这就是 Cosmos 管理无限规模的方式。您可能会问如何预测文档可能进入哪个分区。答案是你不能。Cosmos 使用您的分区键生成哈希值,其值介于 1 和服务器数量之间。
所以 doc id 是一个很好的分区键,因为它是唯一的并且可以有很大范围的值。
请注意,一旦 Cosmos 分区到多个服务器,即使您减少存储或减少吞吐量,目前也没有自动方法来减少服务器数量。
推荐阅读
- google-chrome-devtools - Lighthouse 开发工具 - 具有身份验证的站点
- python - Pool.map 循环和内存错误
- selenium - 尝试使用硒单击横幅
- mysql - 问题在使用 express 节点的虚拟机中加入数据库 mysql
- oracle - 无法从 JDBC 获取 OUT 参数中的二维关联数组
- ios - 键盘导致 UICollectionView Cells 加载错误
- maven - Maven故障安全插件不执行测试
- c# - C#函数
与表达 > - ios - UITableView 单元格被重用/重复
- c++ - std::locale 向“en_US.UTF-8”语言环境抛出 runtime_error 异常