【问题标题】:Scaling Cosmos DB扩展 Cosmos DB
【发布时间】:2026-01-07 07:00:01
【问题描述】:

我有几个关于扩展 Cosmos DB 的问题,我无法使用官方文档进行验证。 像 userid 这样的分区键将每个唯一的 userid 放入一个逻辑分区中,并且该分区存储在一个物理分区中。对于 2500-5000 RU/s 的集合,cosmos db 提供了十个物理分区,每个分区的吞吐量为 250-500 RU/s。如果到目前为止我错了,请纠正我。还有一点:我对带有 DocumentDB-API 的 Cosmos DB 感兴趣。

现在的问题是:Cosmos db 的自动扩展究竟是如何工作的?我猜他们以任何方式扩展物理分区,但这究竟是如何工作的。如果一个物理分区达到他的吞吐量,是否有任何扩展?消耗大量吞吐量的逻辑分区是否会被移动到另一个具有空闲吞吐量的物理分区中?如果一个物理分区达到其存储限制会怎样? Cosmos db 会提供更多的物理分区吗?如果是的话,最大吞吐量会被拆分成当前物理分区的数量,这样是否正确?

【问题讨论】:

    标签: scaling partitioning azure-cosmosdb


    【解决方案1】:

    我希望 Cosmos DB 团队的某个人提供权威的答案。尽管微软向 * 提问,但我还没有看到官方的答案。话虽如此,这是我试图回答的问题。

    对于 2500-5000 RU/s 这样的集合,cosmos db 提供了十个物理分区,每个分区的吞吐量为 250-500 RU/s。

    最初有 10 个物理分区。但这在任何地方都没有记录。

    如果一个物理分区达到他的吞吐量,是否有任何扩展?

    不,只有在达到分区的存储限制(似乎是 10GB)时才会拆分分区。

    是否会将消耗大量吞吐量的逻辑分区移动到另一个具有空闲吞吐量的物理分区?

    没有。

    如果一个物理分区达到其存储限制会怎样? Cosmos db 会提供更多的物理分区吗?如果是的话,最大吞吐量会被拆分成当前物理分区的数量,这样是否正确?

    来自文档:当物理分区 p 达到其存储限制时,Cosmos DB 将 p 无缝拆分为两个新分区 p1 和 p2,并将对应于大约一半键的值分配给每个分区。此拆分操作对您的应用程序是不可见的。

    您没有提到每分钟 RU,这是系统的一个非常重要的方面。似乎在任何分区中都可以根据需要使用 RU/m(与绑定到物理分区的 RU/s 不同)。这在 Microsoft 博客中特别提到,作为处理热分区键的一种方式。 更新:博客文章不再可用;也许是因为信息不准确。这是原始博客文章:

    https://web.archive.org/web/20170609030349/https://azure.microsoft.com/en-us/blog/azure-cosmosdb-case-study-around-ru-min-with-the-universal-store-team/

    【讨论】:

    • 很好的反馈,这是否已通过您自己的技术调查或您当前对公共域 Microsoft 文档的解释得到验证?例如,2500 RU 的 10 个默认物理分区让我感到惊讶。 2500 RU 是分区集合的旧最小购买容量,这使我相信单个分区中测量的 2500 RU 吞吐量是触发集合的基础单个物理分区上的第一次拆分的最小阈值。您描述了一个不同的方案,其中适度的 RU = 在任何数据填充之前的初始拆分。
    【解决方案2】:

    分区管理完全由 Azure Cosmos DB 管理,您不必编写复杂的代码或管理您的分区。 Cosmos DB 容器在存储和吞吐量方面是无限的。我建议您阅读this 了解更多信息。

    【讨论】:

    • 感谢您的评论,但它甚至没有回答我的问题。而且我已经多次阅读文档。
    【解决方案3】:

    不,只有在达到分区的存储限制(似乎是 10GB)时才会拆分分区。

    您能否验证将完整分区拆分为两个新分区? 对于测试用例,我将多个分区键值分布在所有分区中,并用唯一的分区键值填充一个分区。与 cosmos db 指标相关,此值消耗大约 5.1 GB 的存储空间,并且物理分区已达到其 10 GB 的存储限制。 如果我尝试添加更多具有相同分区键值的文档,我在 VS 中的 c# 控制台应用程序会抛出一个 ForbiddenException,上面写着“超出‘文档’的存储配额”。”指标视图还显示了一个完整的分区,但没有任何自动拆分这个完整的分区。 谁能帮我看看有什么问题?

    【讨论】:

    • 您达到了分区大小限制。您不能使用相同的分区键。 (您应该对我的答案发表评论,而不是作为新答案。)
    • 对不起 :) 分区键的大小只有 5,1 GB,其他 4,9 GB 是多个小分区键值。所以我认为在这种情况下它应该可以工作并分开,不是吗?
    • @Alex:您是说您的第一个物理分区包含一个 5.1Gb 的单个逻辑分区,而另一个 4.9Gb 的物理分区包含多个小分区?如果是这样,读到没有发生自动物理分区拆分是令人失望的。您的测试数据中的平均文档大小是多少?每个分区中是否有 100 个或 1000 个文档?您的数据填充测试例程是否缓慢地增加批量数据插入以使 CosmosDb 有空闲时间来执行内部分区重组?您确定您的测试集合已启用分区吗?
    • 发生分区拆分时,cosmosdb 是否保持两个分区的分区键值相同以支持事务?
    • @AtulChaudhary 单个分区(使用相同分区键的行)永远不能超过 10GB。拆分应该将 不同 分区键分成单独的分区。如果你问我,这是一个奇怪的限制。