【问题标题】:How to decide a good partition key for Azure Cosmos DB如何为 Azure Cosmos DB 确定一个好的分区键
【发布时间】:2018-06-16 01:02:22
【问题描述】:
我是 Azure Cosmos DB 的新手,但我想对以下内容有一个生动的了解:
- 什么是分区键?
目前我的理解很浅——>相同partition key的item会去同一个partition进行存储,这样可以在系统变大的时候更好的进行负载均衡。
- 如何决定一个好的分区键?
有人可以举个例子吗?
非常感谢!
【问题讨论】:
-
this video 更好地说明了您正在搜索的答案,您可以在其中找到非常好的解释和示例。特别是:1)第一个问题的答案从 0.58 分钟开始 2)第二个问题的答案从 5.50 分钟开始
-
标签:
azure
azure-cosmosdb
data-partitioning
【解决方案1】:
1.什么是分区键?
在 azure cosmos db 中,有两个分区:physical partition 和 logical partition
A.物理分区是固定数量的保留 SSD 支持的存储与可变数量的计算资源相结合。
B.逻辑分区是物理分区中的一个分区,它存储与单个分区键值关联的所有数据。
我认为您提到的分区键是逻辑分区键。分区键充当数据的逻辑分区,并为 Azure Cosmos DB 提供跨物理分区分布数据的自然边界。更多详细信息,您可以参考How does partitioning work.
2.如何确定一个好的分区键?有人可以举个例子吗?
您需要考虑选择具有广泛值范围甚至访问模式的属性名称。理想的分区键是在查询中频繁出现的过滤器,并且具有足够的基数以确保您的解决方案具有可扩展性。
例如,您的数据具有名为 id 和 color 的字段,并且您更频繁地查询颜色作为过滤器。您需要为分区键选择颜色而不是 id,这对您的查询性能更有效。因为每个项目都有不同的 id 但可能有相同的颜色。它有广泛的范围。此外,如果添加颜色,分区键是可扩展的。
更多详情,请阅读Partition and scale in Azure Cosmos DB。
希望对你有帮助。
【解决方案2】:
您必须根据工作负载选择分区。它们可以分为两种。
读取繁重的工作负载是指读取的数据多于写入的数据,例如产品目录,其中目录的插入/更新频率较少,而浏览产品的人较多。
写入繁重的工作负载是数据写入多于读取的工作负载。常见场景是物联网设备从多个传感器发送多个数据。您将向 Cosmos DB 写入大量数据,因为您可能每秒都会获取数据。
对于读取繁重的工作负载,选择分区键,该属性在过滤查询中使用。产品示例将是产品 ID,主要用于在用户想要阅读信息和浏览其评论时获取数据。
对于写入繁重的工作负载,选择属性更唯一的分区键。例如,在物联网场景中,使用deviceid_signaldatetime等分区键,将发送信号的device-id串联起来,信号的DateTime更具唯一性。