适用对象:
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/秒。
条件 2
若要确定每个物理分区的当前平均存储,请先找到容器的总体存储(数据 + 索引)。
导航到 洞察>存储>数据和索引使用情况。 总存储是数据和索引使用情况的总和。 在以下示例中,容器总共有 74 GB 的存储。
接下来,查找物理分区的总数。 此指标是我们在条件 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,请遵循相应的迁移指南:
- 旧版 .NET v2 SDK:.NET SDK v3 迁移指南
- 旧版 Java v3 SDK:Java SDK v4 迁移指南
不支持的连接器
如果加入预览版,以下连接器将无法正常工作。
- 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 的依赖项的第三方库或工具
¹ 计划在将来支持这些连接器。