你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

有关 Azure Cosmos DB 中的分层分区键的常见问题解答

适用对象: NoSQL MongoDB Cassandra Gremlin

分层分区键或子分区使你能够为分区键配置最多三级层次结构,以进一步优化数据分布并实现更高的规模。 本文解答有关 Azure Cosmos DB 分层分区键的常见问题。

是否可以将分层分区键添加到现有容器?

不支持将分层分区键添加到现有容器。 但是,你可以使用所需的分层分区键创建新容器,并运行容器复制作业,以将现有容器中的数据复制到新容器。 有关如何复制数据的详细信息,请参阅容器复制作业

逻辑分区键的大小是否有存储限制?

是的。 就像现在的 Azure Cosmos DB 一样,逻辑分区大小仍限制为 20 GB。 但是,对于分层分区键,逻辑分区现在是整个分区键路径。 例如,如果按 TenantId -> UserId 分区,则示例逻辑分区将为 Contoso_Alice。 利用子分区意味着可以具有 20 GB 的数据,其中分区键值为 Contoso_Alice。 “Contoso”允许的数据存储量实际上是租户“Contoso”的 20 GB * 唯一 UserId 数。

对物理分区的存储和 RU/秒限制是否有任何更改?

否。 就像现在的 Azure Cosmos DB 一样,物理分区可以容纳 50 GB 的存储,并提供高达 10,000 RU/秒的服务。 但是,对于分层分区键,如果特定分区键前缀(例如 TenantId)的数据位于多个物理分区中,则子分区意味着单个 TenantId 可实现的总 RU/秒可能超过 10,000 RU/s。

如果执行查询并仅在路径的“中间”指定分区键,会发生什么情况?

你的查询是跨分区查询。 例如,如果按 TenantId -> UserId 进行分区,并且在查询中仅提供 UserId,则此查询将展开到所有物理分区。

若要使用 TenantId -> UserId 示例高效路由查询,有两个选项:

  • 提供 TenantId。 查询将转到包含 TenantId 数据的所有物理分区。
  • 同时提供 TenantId 和 UserId。 查询将转到包含 TenantId 和特定 UserId 的单个物理分区。

是否必须在文档中创建新属性才能使用此功能?

否。 指定要在容器创建期间使用的分区键路径的层次结构。 例如,如果按 TenantId -> UserId 进行分区,则无需创建连接这些值的新属性。 确保每个文档都有属性 TenantId 和属性 UserId。 有关详细信息,请参阅子分区代码示例

我创建了一个没有太多基数的键层次结构。 应采取何种操作?

你可能遇到工作负载仅命中所有分区中的几个物理分区的方案。 此方案可能意味着一个或多个级别的分层分区键基数较低。 要对方案进行故障排除,我们始终建议重新创建分层分区键,并且可以使用 DTS 更改密钥并将容器的数据复制到新容器。 如果无法执行此步骤,建议采用两种解决方法,以确保数据的统一分布

  • 方法 1
  1. 可以创建少于 10,000 RU 的容器,以确保只有一个物理分区。
  2. 引入大约 5 GB 的数据,以确保没有分区拆分。
  3. 纵向扩展到所需的 RU,继续引入数据,Azure Cosmos DB 可确保统一拆分物理分区。
  • 方法 2
  1. 可将套餐总数提高到更高的 RU 数,并引入所有数据。
  2. 然后,执行分区合并,以确保工作负载的分区不会碎片化,并且分布均匀
  3. 合并完成后,请纵向缩减回所需的原始 RU 数。

要更好地控制每个分区的吞吐量,还可以使用吞吐量重新分发来确保工作负载使用的分区具有足够的 RU,以用于将来的请求。

后续步骤