如何监视 Azure Cosmos DB 容器或帐户的规范化 RU/秒

适用对象: NoSQL MongoDB Cassandra Gremlin

适用于 Azure Cosmos DB 的 Azure Monitor 提供一个指标视图,用于监视帐户和创建仪表板。 默认情况下,系统会收集 Azure Cosmos DB 指标,此功能不需要你显式启用或配置任何设置。

指标定义

“规范化 RU 消耗量”指标是一个介于 0% 到 100% 之间的指标,用于帮助度量数据库或容器上预配吞吐量的利用率。 指标每隔 1 分钟发出一次,并定义为时间间隔内所有分区键范围的最大 RU/秒利用率。 每个分区键范围映射到一个物理分区,并分配用于保存一系列可能的哈希值的数据。 通常,规范化 RU 百分比越高,对已预配吞吐量的利用率就越高。 该指标还可用于查看数据库或容器上各个分区键范围的利用率。

例如,假设你有一个容器,在其中设置 20,000 RU/秒的自动缩放最大吞吐量(缩放范围为 2000 - 20,000 RU/秒),并且有两个分区键范围(物理分区)P1 和 P2。 由于 Azure Cosmos DB 在所有分区键范围之间平均分布预配的吞吐量,因此 P1 和 P2 各自的缩放范围可以是 1000 - 10,000 RU/秒。 假设间隔为 1 分钟,在某一秒内,P1 消耗了 6000 个请求单位,P2 消耗了 8000 个请求单位。 P1 的规范化 RU 消耗量为 P2 的 60% 到 80%。 整个容器的总体规范化 RU 消耗量为 MAX(60%, 80%) = 80%。

如果你有兴趣查看每秒间隔的请求单位消耗量,以及操作类型,可以使用可选的功能诊断日志并查询 PartitionKeyRUConsumption 表。 要获取应用程序在 Azure Cosmos DB 资源上执行的操作和状态代码的总体概述,可以使用内置的 Azure Monitor“请求总数”(API for NoSQL)、“Mongo 请求”、“Gremlin 请求”或“Cassandra 请求”指标。 稍后,你可以通过 429 状态代码对这些请求进行筛选,并按操作类型来划分这些请求。

规范化 RU/秒较高时会发生的事情和应该做的事情

给定分区键范围的规范化 RU 消耗量达到 100% 时,如果客户端仍在 1 秒的时间范围向该特定分区键范围发出请求,则会收到速率限制错误 (429)。

这不一定表示资源出现了问题。 默认情况下,Azure Cosmos DB 客户端 SDK 和数据导入工具(如 Azure 数据工厂和批量执行工具库)会自动重试提交出现 429 错误的请求。 重试次数通常最多 9 次。 因此,虽然指标中可能会显示 429 错误,但这些错误甚至可能尚未返回到应用程序。

一般情况下,对于生产工作负载而言,如果看到出现 429 代码的请求百分比在 1% - 5% 之间,并且端到端延迟可接受,那么这就是一个可以表明 RU/s 受到充分利用的良好迹象。 在这种情况下,“规范化 RU 消耗量”指标达到 100% 仅表示在某一秒内,至少有一个分区键范围使用了其所有预配的吞吐量。 这是可接受的,因为 429 错误的整体比率仍然较低。 无需进一步执行操作。

若要确定针对数据库或容器发出的、导致 429 错误的请求数,请从“Azure Cosmos DB 帐户”边栏选项卡中,导航到“见解”>“请求”>“按状态代码显示的请求总数”。 筛选到特定数据库和容器。 对于 API for Gremlin,请使用“Gremlin 请求”指标。 Total Requests by Status Code chart that shows number of 429 and 2xx requests.

如果多个分区键范围的“规范化 RU 消耗量”指标始终为 100%,且 429 错误的比率大于 5%,建议增加吞吐量。 可使用 Azure Monitor 指标和 Azure Monitor 诊断日志查明哪些操作繁忙及其使用率峰值是多少。 遵循缩放预配吞吐量的最佳做法(RU/秒)

并非总是仅因为规范化 RU 已达到100%,就会看到 429 速率限制错误。 原因是规范化 RU 是一个表示所有分区键范围的最大利用率的值。 一个分区键范围可能处于忙碌状态,但其他分区键范围可正常为这些请求提供服务。 例如,如果某个操作(例如存储过程)消耗了分区键范围上的所有 RU/秒,则会导致“规范化 RU 消耗量”指标出现短期峰值。 在这种情况下,如果总体请求率较低或对不同分区键范围内的其他分区发出请求,则不会有任何即时速率限制错误。

详细了解如何解释和调试 429 速率限制错误

如何监视热分区

“规范化 RU 消耗量”指标可用于监视工作负载是否具有热分区。 当一个或几个逻辑分区键由于请求量较高而消耗了过多的总 RU/s 时,即会出现热分区。 而造成这一情况的原因可能是分区键设计导致请求未能均匀分布。 这会导致许多请求被定向到变“热”的一小部分逻辑分区(这里表示分区键范围)。由于逻辑分区的所有数据都驻留在一个分区键范围上,并且总 RU/秒在所有分区键范围之间均匀分布,因此,热分区可能导致吞吐量的 429 错误和低效使用。

如果确定是否存在热分区

若要验证是否存在热分区,请导航到“见解”>“吞吐量”>“按 PartitionKeyRangeID 列出的规范化 RU 消耗量(%)”。 筛选到特定数据库和容器。

每个分区键范围 ID 映射到一个物理分区。 如果某个 PartitionKeyRangeId 的规范化 RU 消耗量明显高于其他 PartitionKeyRangeId(例如,一个 PartitionKeyRangeId 的消耗量一直为 100%,而其他 PartitionKeyRangeId 的消耗量不超过 30%),则可能表示存在热分区。

Normalized RU Consumption by PartitionKeyRangeId chart with a hot partition.

若要确定 RU/秒消耗量最大的逻辑分区以及建议的解决方案,请参阅诊断和排查 Azure Cosmos DB 请求速率过大 (429) 异常一文。

规范化 RU 消耗量和自动缩放

如果在时间间隔的任何一秒内,至少有 1 个分区键范围使用了所有分配的 RU/秒,“规范化 RU 消耗量”指标将显示为 100%。 一个常见问题是,为何规范化 RU 消耗量为 100%,但 Azure Cosmos DB 未使用自动缩放将 RU/秒扩展到最大吞吐量?

注意

以下信息描述了自动缩放的当前实现,将来可能会发生变化。

使用自动缩放时,仅当规范化 RU 消耗量在 5 秒间隔内持续稳定地保持 100% 时,Azure Cosmos DB 才会将 RU/秒扩展到最大吞吐量。 这是为了确保缩放逻辑的成本对用户可接受,避免单次短暂性的高峰导致不必要的扩展和提高成本。 在出现短暂性的高峰时,系统通常会扩展到一个比上次所扩展到的 RU/秒更高,但比最大 RU/秒更低的值。

例如,假设你有一个容器,它的自动缩放最大吞吐量为 20,000 RU/秒(缩放范围为 2000 - 20,000 RU/秒),并且有 2 个分区键范围。 每个分区键范围的缩放范围为 1000 - 10,000 RU/秒。 由于自动缩放会提前预配所有必需的资源,因此你随时可以使用的量最多为 20,000 RU/秒。 假设你有一个间歇性的流量峰值,在一秒内,其中一个分区键范围的使用量为 10,000 RU/秒。 在接下来的几秒内,使用量又下降到 1000 RU/秒。 由于“规范化 RU 消耗量”指标显示所有分区中时间段内的最高利用率,因此它将显示 100%。 但是,由于利用率只有 1 秒钟的 100%,自动缩放不会自动扩展到最大值。

因此,即使自动缩放未扩展到最大值,你仍可以使用可用的总 RU/秒。 若要验证 RU/秒消耗量,可以使用可选的“诊断日志”功能,查询所有分区键范围内每秒水平的总体 RU/秒消耗量。

CDBPartitionKeyRUConsumption
| where TimeGenerated >= (todatetime('2022-01-28T20:35:00Z')) and TimeGenerated <= todatetime('2022-01-28T20:40:00Z')
| where DatabaseName == "MyDatabase" and CollectionName == "MyContainer"
| summarize sum(RequestCharge) by bin(TimeGenerated, 1sec), PartitionKeyRangeId
| render timechart

一般而言,对于使用自动缩放的生产工作负载,如果你发现 1-5% 的请求出现了 429 错误,并且端到端延迟可接受,则这是一个工作正常的信号,表示 RU 已得到充分利用。 即使规范化 RU 消耗量偶尔达到 100%,自动缩放也不会纵向扩展到最大 RU/秒,这是正常的,因为 429 错误的整体比率较低。 不需要执行任何操作。

提示

如果你使用了自动缩放,并发现规范化 RU 消耗量始终是 100%,并且你持续扩展到最大 RU/秒,这表示使用手动吞吐量可能更具成本效益。 若要确定是自动缩放还是手动吞吐量最适合你的工作负载,请参阅如何在标准(手动)预配吞吐量与自动缩放预配吞吐量之间进行选择

查看规范化请求单位消耗指标

  1. 登录 Azure 门户

  2. 在左侧导航栏中选择“监视”,然后选择“指标”。

    Metrics pane in Azure Monitor

  3. 从“指标”窗格中选择一个资源,然后选择所需的订阅和资源组>>。 对于“资源类型”,请选择“Azure Cosmos DB 帐户”,接着选择你的现有 Azure Cosmos DB 帐户之一,然后选择“应用”。

    Select the account scope to view metrics

  4. 接下来,可以从可用指标列表中选择一个指标。 可以选择特定于请求单位、存储、延迟、可用性、Cassandra 和其他方面的指标。 若要详细了解此列表中的所有可用指标,请参阅按类别列出的指标一文。 在此示例中,我们选择“规范化 RU 消耗”指标,并选择“最大值”作为聚合值。

    除了这些详细信息之外,还可以选择指标的时间范围和时间粒度。 可以查看过去最长 30 天的指标。 应用筛选器后,系统会根据该筛选器显示图表。

    Choose a metric from the Azure portal

针对“规范化 RU 消耗量”指标的筛选器

还可以按特定的 CollectionNameDatabaseNamePartitionKeyRangeID区域筛选所显示的指标和图表。 若要筛选指标,请选择“添加筛选器”,并选择所需的属性(例如 CollectionName)和所关注的相应值。 然后,图中会显示在所选时间段内针对该容器的“规范化 RU 消耗量”指标。

可以使用“应用拆分”选项对指标进行分组。 对于共享吞吐量数据库,“规范化 RU”指标仅以数据库粒度显示数据,不会显示每个集合的任何数据。 因此按集合名称应用拆分时,将看不到共享吞吐量数据库的任何数据。

而是显示每个容器的规范化请求单位消耗指标,如下图所示:

Apply filters to normalized request unit consumption metric

后续步骤