Azure Cosmos DB 使用自动缩放预配的吞吐量根据使用情况自动管理和缩放数据库或容器的请求单位/秒(RU/秒)。 本文解答了有关 Azure Cosmos DB 中的自动缩放的常见问题。
Azure Cosmos DB 中的自动缩放与动态自动缩放有何区别?
自动缩放或自动缩放预配的吞吐量根据最活跃的区域和分区缩放工作负载。 相比之下,动态自动缩放允许工作负载的区域和分区根据使用情况独立缩放。 我们建议向计划使用自动缩放的所有客户使用动态自动缩放。
如何以编程方式对帐户启用动态自动缩放?
可以使用预览版2023-11-15-preview或更高版本以及稳定版本2024-11-15或更高版本的Resource Manager模板将属性enablePerRegionPerPartitionAutoscale设置为true。
可以使用 资源提供程序 REST API 版本 2024-11-15 或更高版本 将 enablePerRegionPerPartitionAutoscale 设置为 true。
还可以使用Azure CLI或 PowerShell。
// Add Azure Cosmos DB extension 1.18.0 or later for PowerShell
Install-Module -Name Az.CosmosDB -RequiredVersion 1.18.0
// update the account using this command to enable or disable the property
Update-AzCosmosDBAccount -EnablePerRegionPerPartitionAutoscale $true -ResourceGroupName "<resource-group-name>" -Name "<cosmos-account-name>"
// Run this command to see the enablement or disablement status:
Get-AzCosmosDBAccount -ResourceGroupName "<resource-group-name>" -Name "<cosmos-account-name>"
即使预配的吞吐量或自动缩放的 RU 指标不能扩展到最大 RU/秒,规范化的 RU/秒消耗量也能达到 100%。
是的。 有关详细信息,请参阅监视规范化 RU/秒。
应使用什么指标来确定自动缩放的最大 RU/s 或手动预配的 RU/s 是否可以以编程方式扩展或缩减?
我们建议您充分利用 Azure Cosmos DB 的本机动态缩放功能来管理资源的 RU/s。 但是,如果需要,应使用 Azure Monitor 中的规范化 RU 消耗指标做出编程缩放决策。 规范化 RU 消耗指标是介于 0% 到 100% 之间的指标,用于测量自动缩放最大 RU/秒或数据库或容器上手动预配吞吐量的利用率。 这是确定是否可以进行纵向扩展或缩减的最准确方法。 不推荐使用 Azure Cosmos DB SDK 中的 ReadThroughputAsync() 方法获取 ProvisionedThroughput,或者在 Azure Monitor 中调用 ProvisionedThroughput,因为这两种方法都会导致结果不准确。 这些指标表示具有延迟计费的吞吐量,不应用于扩展决策。
如何解读动态自动缩放和自动缩放中的ProvisionedThroughput?
可以使用预配吞吐量查看每小时计费的 RU/秒。
在动态自动缩放中,Azure 监视预配置的吞吐量指标以及下面列出的各种 SDK API 指标,反映了每个分区和区域中每小时的最高 RU/秒。
在自动缩放中,Azure Monitor 预配吞吐量指标和下面列出的各种 SDK API 指标反映了最活跃分区的每秒 RU,这些指标统一应用于所有分区和区域,并进行每小时聚合。
在以前的 autopilot 层级模型中创建的数据库或容器会有什么变化?
新的自动扩展自定义最大 RU/s 模型无需手动操作即可支持早期层模型中创建的资源。 该层的上限成为新的最大 RU/s,这产生相同的缩放范围。
例如,如果您之前选择了缩放范围为400 RU/秒到4000 RU/秒的层,那么数据库或容器现在显示的最大RU/秒为4000 RU/秒,缩放范围仍然是400 RU/秒到4000 RU/秒。 然后,可以根据自己的工作负荷,将最大 RU/秒更改为自定义值。
自动缩放的入口点 RU/秒是多少?
从 2022 年 4 月开始,自动缩放的最大 RU/秒可以设置为低至 1000 RU/秒(缩放范围在 100 RU/秒 - 1000 RU/秒之间)。 还可以将缩放范围设置为 200 RU/s 到 2000 RU/秒或者 300 RU/s 到 3000 RU/秒。 以前,入口点是 400 - 4000 RU/秒。
对于吞吐量要求较低,但仍可能扩展到最大 RU/秒的工作负载,建议使用此配置。
自动缩放功能根据流量增加而扩展的速度有多快?
使用自动缩放,系统会根据传入流量在 0.1 x T 到 T 范围内将吞吐量(RU/秒)增加 Tmax 或减少 Tmax。 因为缩放是自动且即时的,所以可在任何时间点无延迟地使用吞吐量(最多使用预配的 Tmax)。
我如何确定系统当前的RU/s缩放水平?
使用 Azure Monitor 指标来监测已预配的自动缩放最大 RU/秒以及系统当前缩放至的吞吐量(RU/秒)。
自动缩放的价格是多少?
每小时,您将根据系统在该小时内扩展到的最高吞吐量 T 进行计费。 如果你的资源在该小时内没有请求,或者扩展未超过 0.1 x Tmax,将按照 0.1 x Tmax 的最低费率收费。 有关详细信息,请参阅 Azure Cosmos DB 定价页。
我的账单上如何显示自动缩放功能?
在单一写入区域帐户中,每 100 RU/s 的自动缩放费率是标准(手动)预配吞吐量的 1.5 倍。 帐单上显示的是标准化的现有预配吞吐量计量器。 将此计量器中的数量乘以 1.5。 例如,如果系统在一小时内扩展到的最高 RU/秒为 6000 RU/秒,则你在该小时应付的费用为:60 x 1.5 = 90 个计量单位。
在具有多个写入区域的帐户中,每 100 RU/s 的自动缩放费率与标准(手动)预配的多写入区域吞吐量费率相同。 在帐单上,你可看到现有的多写入区域计量。 由于费率是相同的,因此,如果使用自动缩放,您将看到与标准吞吐量相同的数量。
自动缩放能与预留容量一起使用吗?
是的。 获取单写入区域的帐户的预留容量后,自动缩放资源的预留折扣将应用于计量使用量,比率为特定区域比率的 1.5 倍。 例如,如果要使用预留容量来覆盖 10,000 个自动缩放 RU/秒,应计划购买 15,000 RU/秒的总预留容量。
多写入区域预留容量同样适用于自动缩放和标准(手动)预配吞吐量。
自动缩放是否适用于 Azure Cosmos DB 免费层?
是的。 在免费层,您可以在数据库或容器上使用自动扩展吞吐量。 详细了解 免费层计费的工作原理及其与自动缩放的配合使用。
是否所有 API 都支持自动缩放?
是的。 所有 API 都支持自动缩放:NoSQL、Gremlin、Table、Cassandra 和 MongoDB。
多区域写入帐户是否支持自动缩放?
是的。 在您添加到 Azure Cosmos DB 帐户的每个区域中,最大 RU/s 是可用的。
如何在新数据库或容器上启用自动缩放?
了解如何启用自动缩放。
是否能在现有的数据库或容器上启用自动缩放?
是的。 还可以在自动缩放与标准(手动)预配吞吐量之间切换。 目前,对于所有 API,可以使用 Azure portal、Azure CLI、PowerShell或其中一个 Azure 管理 SDK 执行这些操作。 不能使用 Azure Cosmos DB 客户端 SDK 或 Azure Resource Manager 模板来在手动配置的吞吐量和自动缩放之间进行迁移。 但是,可以使用客户端 SDK 或Azure Resource Manager模板创建新的自动缩放资源,并更改现有自动缩放资源的最大 RU/秒。
自动缩放与标准(手动)预配置吞吐量之间的迁移是如何进行的?
从概念上讲,更改吞吐量类型是一个两阶段的过程。 首先,您需要发送请求,以更改吞吐量设置为使用自动缩放或手动配置的吞吐量。 在这两种情况下,系统都会根据当前的吞吐量设置和存储自动确定并设置初始 RU/秒值。 在此步骤中,不接受用户提供的 RU/秒值。 然后,在更新完成后,可以根据自己的工作负荷更改 RU/秒。
从标准(手动设置)预配吞吐量迁移到自动扩展
对于容器,请使用以下公式来估算初始的自动缩放最大 RU/秒:
MAX(1,000, current manual provisioned RU/s, maximum RU/s ever provisioned / 10, storage in GB × 10)四舍五入到最接近的 1,000 RU/秒。
实际初始的自动缩放最大 RU/秒可能因帐户配置而异。
示例 #1:您有一个容器,其手动预配吞吐量为 10,000 RU/秒,存储容量为 25 GB。 启用自动缩放后,初始自动缩放的最大 RU/秒将为 10000 RU/秒(在 1000 - 10000 RU/秒之间缩放)。
示例 #2:容器具有 50,000 RU/秒的手动预配吞吐量和 25,000 GB 的存储容量。 启用自动缩放后,初始最大自动缩放单位为 250,000 RU/秒,并可在 25,000 RU/秒到 250,000 RU/秒之间调整。
从自动缩放迁移到标准(手动)预配吞吐量
初始手动配置吞吐量等于当前自动缩放的最大 RU/秒。
示例:您拥有一个支持自动缩放的数据库或容器,其最大 RU/秒为 20,000 RU/秒(缩放范围为 2,000 RU/秒 到 20,000 RU/秒)。 更新后以使用手动预配吞吐量时,初始吞吐量将为 20,000 RU/秒。
如果需要迁移大量吞吐量资源,请考虑使用Azure CLI。
是否可以使用 Azure CLI、PowerShell 或Azure Resource Manager来管理使用自动缩放的数据库或容器?
是的。 若要以编程方式在现有数据库或容器上启用自动缩放,可以使用 Azure CLI 或 PowerShell。
若要创建使用自动缩放的新数据库或容器,可以使用 Azure CLI、PowerShell 或 Azure Resource Manager 模板。
共享吞吐量数据库是否支持自动缩放?
是的。 若要为共享吞吐量数据库启用自动缩放,请在创建数据库时选择“自动缩放”和“预配吞吐量”选项。
启用自动缩放后,每个共享吞吐量数据库允许多少个容器?
Azure Cosmos DB 在共享吞吐量数据库中强制实施最多 25 个容器。 最大值适用于具有自动缩放或标准(手动)吞吐量的数据库。
自动缩放如何影响数据库一致性级别?
自动缩放不会影响数据库的一致性级别。
有关详细信息,请参阅一致性级别。
与每个最大 RU/s 选项关联的存储限制是什么?
每个最大请求单位/秒(RU/s)的存储限制是数据库或容器的最大请求单位/秒(RU/s)除以 10。 例如,如果最大 RU/s 为 20,000 RU/秒,则资源可以支持 2,000 GB storage。
有关可用的最大 RU/s 和存储 选项,请参阅 预配吞吐量自动缩放限制。
如果超出与最大吞吐量相关的存储限制,会发生什么情况?
如果超出与数据库或容器最大吞吐量关联的storage限制,Azure Cosmos DB 会自动将最大吞吐量增加到支持该级别storage的下一个最高 RU/秒。
例如,如果最初的最大 RU/秒为 50000 RU/秒(在 5000 RU/秒到 50000 RU/秒之间缩放),则最多可存储 5000 GB 数据。 如果存储大小增加到 5,001 GB,存储将扩展到 6,000 GB,新的最大 RU/秒为 60,000 RU/秒(扩展范围在 6,000 RU/秒到 60,000 RU/秒之间)。
我可以更改数据库或容器的最大 RU/秒吗?
是的。 有关详细信息,请参阅如何配置自动缩放吞吐量。
更改最大 RU/秒时,根据请求的值,异步操作可能需要 4 到 6 小时才能完成。 了解详细信息。
如何提高最大 RU/秒限额?
当你发送请求以增加最大 RU/秒Tmax时,该服务将预配更多资源来支持更大的最大 RU/秒,具体取决于所选的最大 RU/秒。 发生这种情况时,现有工作负载和操作不会受到影响。 系统将继续在以前的 0.1 x Tmax 和 Tmax 之间缩放数据库或容器,直到新的缩放范围(0.1 x Tmax_new 到 Tmax_new)准备就绪。
我如何降低最大 RU/秒?
当您降低最大 RU/秒时,可以将其最小值设置为四舍五入到最接近 1,000 RU/秒的MAX(1,000, highest maximum RU/s ever provisioned / 10, current storage in GB × 10)。
示例 #1:您有一个最大 RU/s 为 20,000 RU/s 的自动缩放容器(可缩放范围为 2,000 RU/s 到 20,000 RU/s),以及 1,500 GB 的存储空间。 可设置的最大 RU/秒的最低值是 MAX(1,000, 20,000 / 10, 1,500 × 10) = 15000 RU/秒(缩放范围为 1500 RU/秒 - 15000 RU/秒)。
示例 #2:您有一个自动缩放容器,其最大 RU/秒为 100,000 RU/秒,存储容量为 100 GB。 现在,最多可将最大 RU/秒增加到 150000 RU/秒(缩放范围为 15000 RU/秒到 150000 RU/秒)。 可设置的最大 RU/秒的最低值是 MAX(1,000, 150,000 / 10, 100 × 10) = 15000 RU/秒(缩放范围为 1500 RU/秒 - 15000 RU/秒)。
对于共享吞吐量数据库,当降低最大 RU/秒值时,您可以将其设置为的最小值是MAX(1,000, highest maximum RU/s ever provisioned / 10, current storage in GB × 10, 1,000 + (MAX(Container count - 25, 0) × 1,000)),并将其舍入到最接近的 1,000 RU/秒。
这些公式和示例适用于可以设置的自动缩放最大 RU/秒的最小值。 它们是独立于系统自动缩放至的 0.1 × Tmax 到 Tmax 范围之外。 无论最大 RU/秒 如何,系统始终在 0.1 × Tmax 到 Tmax 之间缩放。
TTL 如何与自动缩放一起工作?
使用自动缩放时,生存时间 (TTL) 操作不会影响 RU/秒的缩放。 由于 TTL 操作而使用的任何 RU 都不属于自动缩放容器的计费 RU/秒。
例如,对于支持400 RU/秒到4000 RU/秒的自动缩放容器:
- 1 小时:T=0:容器未执行操作(没有 TTL 或工作负载请求)。 计费的 RU/s 是 400 RU/s。
- 1 小时:T=1:已启用 TTL。
- 1 小时:T=2:容器开始接收请求。 请求在 1 秒内消耗 1000 RU/s。 使用了 200 RU/s 的 TTL。 可计费的 RU/秒仍为1000 RU/秒。 无论 TTL 删除何时发生,它们都不会影响自动缩放逻辑。
最大 RU/秒如何映射到物理分区?
当您首次选择最大 RU/秒时,Azure Cosmos DB 会通过将最大 RU/秒除以 10,000 RU/秒来进行预配计算,从而确定所需的物理分区数。 每个物理分区最多可支持 10,000 RU/s 和 50 GB storage。 随着storage大小增加,Azure Cosmos DB 会自动拆分分区,以添加更多的物理分区来处理storage增加。 如果存储超过关联的限制,Azure Cosmos DB 将增加最大 RU/秒。
数据库或容器的最大 RU/秒在所有物理分区之间平均划分。 任何单个物理分区可缩放到的总吞吐量是数据库或容器的最大 RU/秒除以物理分区数。
如果传入请求超过数据库或容器的最大 RU/秒,会发生什么?
如果整体使用的 RU/秒超过了数据库或容器的最大 RU/秒,超出最大 RU/秒的请求将受到限制,并返回 429 状态代码。 导致规范化利用率超过 100% 的请求将被限制处理。 标准化利用率为所有物理分区的 RU/秒利用率的最大值。
例如,假设最大吞吐量为 20000 RU/秒,两个物理分区为 P_1 和 P_2。 每个分区能够扩展到 10000 RU/秒。 在给定的秒内,如果 P_1 使用了 6,000 RUs,而 P_2 使用了 8,000 RUs,则标准化利用率为 MAX(6,000 RU / 10,000 RU, 8,000 RU / 10,000 RU) = 0.8。
注意事项
Azure Cosmos DB 客户端 SDK 和数据导入工具(Azure Data Factory,批量执行程序库)会在返回代码 429 错误后自动重试,因此偶尔出现代码 429 错误不会出现问题。 持续大量出现代码 429 错误可能表明您需要增加最大 RU/秒,或者重新审视您的分区策略以考虑包含热分区的情况。
启用自动缩放后,是否会出现节流或速率限制错误?
是的。 在两种情况下可能会看到错误代码 429。
第一种情况是,当总体消耗的 RU/秒超过数据库或容器的最大 RU/秒时,服务将相应地限制请求。
第二种情况是,如果一个逻辑分区键值的请求数与其他分区键值的请求数相比过高(如在热分区中),则基础物理分区可能超出其 RU/秒的预算。 最佳做法是避免热分区,选择良好的分区键这会导致storage和吞吐量均匀分布。
例如,如果选择 20,000 RU/秒的最大吞吐量选项,并且有 200 GB 的 storage,如果有四个物理分区,则每个物理分区最多可自动缩放 5,000 RU/秒。 如果热分区位于特定的逻辑分区键上,则当热分区所在的基础物理分区超过 5000 RU/秒或 100% 的规范化利用率时,会看到代码 429 错误。
使用自动缩放时看到代码 429 错误并不一定表示数据库或容器存在问题。 通常,对于生产环境的工作负载,如果 1% 到 5% 的请求出现代码 429 错误,并且端到端的延迟在可接受范围内,这些错误表明 RU/s 已经被充分利用,是一种正常的情况。 不需要执行任何操作。
详细了解如何解释和调试代码 429 速率限制错误。
后续步骤
- 了解如何在 Azure Cosmos DB 数据库或容器上启用自动缩放。
- 了解自动缩放预配吞吐量的优势。
- 详细了解逻辑和物理分区。