Azure Cosmos DB 中的合并分区功能(预览版)

适用对象: NoSQL Mongodb

使用 Azure Cosmos DB 中的合并分区功能(预览版),你可以减少原地用于容器的物理分区数。 通过合并,具有碎片化吞吐量(每个分区的 RU/秒值较低)或碎片化存储(每个分区的存储较少)的容器可以重做其物理分区。 如果容器的吞吐量已调高且之后需要再调低,合并可以帮助解决吞吐量碎片化问题。 在预配的 RU/s 总量相同的情况下,物理分区越少,每个物理分区分配到的 RU/s 就越多。 如果从容器中删除大量数据,分区数量最小化可以降低速率受限的可能性,并且每个分区的 RU/秒也会较低。 合并可以帮助清除未使用的分区或空分区,从而有效地解决存储碎片化问题。

入门

若要开始使用分区合并,请导航到你的 Azure Cosmos DB 帐户中的“功能”页。 选择并启用“分区合并(预览版)”功能。

在启用该功能之前,请验证你的 Azure Cosmos DB 帐户是否满足所有预览版资格条件。 启用该功能后,需要经过 15-20 分钟才会生效。

注意

在帐户上启用合并后,无论是否正在进行合并,该帐户都将仅允许来自 .NET SDK 版本 >=3.27.0、Java SDK >= 4.42.0 或 Azure Cosmos DB Spark 连接器 >=4.18.0 的请求。 来自其他 SDK(旧版 .NET SDK、旧版 Java SDK、任何 JavaScript SDK、任何 Python SDK、任何 Go SDK)或不受支持的连接器(Azure 数据工厂、Azure 搜索、Azure Functionsextension < = 3.x、Azure 流分析等)的请求将被阻止并失败。 在启用该功能之前,请确保已升级到受支持的 SDK 版本。 启用或禁用该功能后,可能需要经过 15-20 分钟它才能完全传播到帐户。 如果你打算在使用完该功能后将其禁用,可能需要等待 15-20 分钟,然后才会允许来自不支持合并的 SDK 和连接器的请求。

“功能”窗格和“分区合并”功能的屏幕截图。

若要检查 Azure Cosmos DB 帐户是否符合预览版的条件,可以使用Azure 门户中的内置资格检查器。 在 Azure 门户的 Azure Cosmos DB 帐户概述页面中,导航到 “诊断并解决问题” ->“吞吐量和缩放” ->“分区合并”。 运行检查是否符合分区合并预览条件诊断。

“诊断并解决问题”页面中“吞吐量和缩放”内容的屏幕截图。

屏幕截图显示合并资格检查以及包含所有预览资格条件的表格。

如何标识要合并的容器

满足以下两个条件的容器可能受益于分区合并:

  • 条件 1:每个物理分区当前的 RU/s 为 <3000 RU/s
  • 条件 2:每个物理分区的当前平均存储 (GB) 20 GB

情况 1 通常出现在以下情形:你之前提高了 RU/s(通常是为了导入数据),而现在希望在稳定运行状态下将其调低。 如果删除/TTL 大量数据,留下未使用的分区,通常会出现条件 2。

条件 1

若要确定每个物理分区的当前 RU/秒,请从 Cosmos 帐户导航到“指标”。 选择指标物理分区吞吐量,并将范围筛选到你的数据库和容器。 按 PhysicalPartitionId 进行拆分。

对于使用自动缩放的容器,此指标会显示当前在每个物理分区上预配的最大 RU/秒。 对于使用手动吞吐量的容器,此指标显示每个物理分区上的手动 RU/s 值。

在下面的示例中,我们有一个自动缩放容器,预配吞吐量为 5000 RU/秒(可在 500 到 5000 RU/秒之间自动缩放)。 它有 5 个物理分区,每个物理分区为 1000 RU/秒。

屏幕截图显示 Azure 门户中的 Azure Monitor 指标“物理分区吞吐量”。

条件 2

若要确定每个物理分区的当前平均存储,请先找到容器的总体存储(数据 + 索引)。

导航到 洞察>存储>数据和索引使用情况。 总存储是数据和索引使用情况的总和。 在以下示例中,容器总共有 74 GB 的存储。

Azure 门户中容器的 Azure Monitor 存储(数据 + 索引)指标的屏幕截图。

接下来,查找物理分区的总数。 此指标是我们在条件 1 中看到的 PhysicalPartitionThroughput 图表中不同的 PhysicalPartitionIds 数量。 在我们的示例中,我们有 5 个物理分区。

最后计算:总存储(以 GB 为单位)/物理分区数。 在我们的示例中,平均值为 (74 GB/5 个物理分区) = 每个物理分区 14.8 GB。

基于条件 1 和 2,我们的容器可能会通过合并分区获益。

合并物理分区

在 PowerShell 中,传入标志 -WhatIf 时,Azure Cosmos DB 会运行模拟并返回合并的预期结果。 尽管合并本身未运行,此结果仍会返回。 如果未传入该标记,则会对该资源执行合并操作。 完成后,该命令会在合并后以 KB 为单位输出每个物理分区的当前存储量。

提示

在运行合并之前,建议将你的预配 RU/秒(手动 RU/秒或自动缩放最大 RU/秒)设置为尽可能接近你在合并后所需的稳定态 RU/秒,以帮助确保系统计算出高效的分区布局。

使用 Install-Module 安装启用了预发行功能的 Az.CosmosDB 模块。

$parameters = @{
    Name = "Az.CosmosDB"
    AllowPrerelease = $true
    Force = $true
}
Install-Module @parameters

对于 预配吞吐量容器,使用 Invoke-AzCosmosDBSqlContainerMerge 并结合 -WhatIf 参数,可以在不实际执行该操作的情况下预览合并。

$parameters = @{
    ResourceGroupName = "<resource-group-name>"
    AccountName = "<cosmos-account-name>"
    DatabaseName = "<cosmos-database-name>"
    Name = "<cosmos-container-name>"
    WhatIf = $true
}
Invoke-AzCosmosDBSqlContainerMerge @parameters

在不使用 -WhatIf 参数的情况下运行同一命令可以启动合并。

$parameters = @{
    ResourceGroupName = "<resource-group-name>"
    AccountName = "<cosmos-account-name>"
    DatabaseName = "<cosmos-database-name>"
    Name = "<cosmos-container-name>"
}
Invoke-AzCosmosDBSqlContainerMerge @parameters

对于共享吞吐量数据库,请使用 来启动合并az cosmosdb mongodb database merge

az cosmosdb mongodb database merge \
	--account-name '<cosmos-account-name>'                               
	--name '<cosmos-database-name>'                                
	--resource-group '<resource-group-name>'

监视合并操作

分区合并是一项长期运行的操作,没有关于完成该操作所需时间的 SLA。 这一时间取决于容器中的数据量和物理分区的数量。 建议至少留出 5-6 小时来完成合并。

在容器上运行分区合并时,如果更改容器设置(TTL、索引策略、唯一键等),则会取消正在进行的合并操作。 如果您在合并操作进行期间提高 RU/s,正在进行的合并操作将被取消,并且容器的 RU/s 将更新为您设置的新值。 取决于所请求的 RU/s,您的 向上扩展可能会立即完成,也可能耗时更长。 如果在合并正在进行时降低 RU/s,RU/s 会立即更新为新的值。 正在进行的合并将继续进行,目标分区数保持不变,并基于触发合并时设置的 RU/s 值来确定。 最佳做法是先等待合并操作完成再更改容器或吞吐量设置。

可通过查看“活动日志”或筛选“合并 MongoDB 集合的物理分区”或“合并 SQL 容器的物理分区”事件来跟踪合并是否仍在进行中。

限制

下面是合并功能目前存在的限制。

预览资格标准

若要注册预览版,Azure Cosmos DB 帐户必须满足以下所有条件:

  • 您的 Azure Cosmos DB 帐户使用适用于 NoSQL 的 API 或版本为 >=3.6 的 MongoDB。
  • 您的 Azure Cosmos DB 帐户正在使用预配吞吐量(手动或自动缩放)。 合并不适用于无服务器帐户。
  • Azure Cosmos DB 帐户是单写入区域帐户(多区域写入帐户目前不支持合并)。
  • Azure Cosmos DB 帐户不使用以下任何功能:
  • 如果使用 API for NoSQL,应用程序必须使用 Azure Cosmos DB .NET v3 SDK(3.27.0 或更高版本)或 Java v4 SDK(4.42.0 或更高版本)。 在帐户上启用合并预览后,该帐户不接受从非 .NET/Java SDK 或较旧的 .NET/Java SDK 版本发送的请求。
    • 在适用于 MongoDB 的 API 中使用该功能时,没有 SDK 或驱动程序要求。
  • Azure Cosmos DB 帐户未使用任何当前不受支持的连接器:
    • Azure 数据工厂
    • Azure 流分析
    • Logic Apps
    • Azure Functions 扩展 <= 3.x (支持 Azure Functions 扩展 4.0 及更高版本)
    • Azure 搜寻
    • Azure Cosmos DB Spark 连接器 < 4.18.0
    • 任何在 Azure Cosmos DB SDK 上具有非 .NET V3 SDK >= v3.27.0 或 Java v4 SDK >= 4.42.0 的依赖项的第三方库或工具

帐户资源和配置

  • 合并仅适用于 API for NoSQL 和 MongoDB 帐户。 对于适用于 MongoDB 的 API 帐户,MongoDB 帐户版本必须为 3.6 或更高版本。
  • 合并仅适用于单区域写入帐户。 不支持多区域写入帐户。
  • 使用合并功能的帐户也不能使用这些功能(如果将这些功能添加到已启用合并的帐户,则该帐户无法合并资源):
  • 合并容器后,将无法读取带有开始时间的更改源。 计划在未来支持此功能。

SDK 要求(仅适用于 NoSQL API)

仅当使用最新版本的 .NET v3 SDK 或 Java v4 SDK 时,才支持启用了合并功能的帐户。 在你的帐户上启用了此功能时(无论是否运行合并),在使用该帐户时你必须仅使用受支持的 SDK。 不接受从其他 SDK 或更早版本发送的请求。 只要使用的是受支持的 SDK,应用程序就可以在合并期间继续运行。

查找支持的 SDK 的最新版本:

SDK 支持的版本 包管理器链接
.NET SDK v3 >= 3.27.0 https://www.nuget.org/packages/Microsoft.Azure.Cosmos
Java SDK v4 >= 4.42.0 https://mvnrepository.com/artifact/com.azure/azure-cosmos

计划未来支持其他 SDK。

提示

注册预览版之前,应确保应用程序已更新,可以使用兼容的 SDK 版本。 如果使用旧版 SDK,请遵循相应的迁移指南:

不支持的连接器

如果加入预览版,以下连接器将无法正常工作。

  • Azure 数据工厂 ¹
  • Azure 流分析 ¹
  • 逻辑应用 ¹
  • Azure Functions 扩展 <= 3.x (支持 Azure Functions 扩展 4.0 及更高版本) ¹
  • Azure 搜索服务 ¹
  • Azure Cosmos DB Spark 连接器 < 4.18.0
  • 任何在 Azure Cosmos DB SDK 上具有非 .NET V3 SDK >= v3.27.0 或 Java v4 SDK >= 4.42.0 的依赖项的第三方库或工具

¹ 计划在将来支持这些连接器。

后续步骤