如何监视 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 请求”指标。
如果多个分区键范围的“规范化 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%),则可能表示存在热分区。
若要确定 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/秒,这表示使用手动吞吐量可能更具成本效益。 若要确定是自动缩放还是手动吞吐量最适合你的工作负载,请参阅如何在标准(手动)预配吞吐量与自动缩放预配吞吐量之间进行选择。
查看规范化请求单位消耗指标
登录 Azure 门户。
在左侧导航栏中选择“监视”,然后选择“指标”。
从“指标”窗格中选择一个资源,然后选择所需的订阅和资源组>>。 对于“资源类型”,请选择“Azure Cosmos DB 帐户”,接着选择你的现有 Azure Cosmos DB 帐户之一,然后选择“应用”。
接下来,可以从可用指标列表中选择一个指标。 可以选择特定于请求单位、存储、延迟、可用性、Cassandra 和其他方面的指标。 若要详细了解此列表中的所有可用指标,请参阅按类别列出的指标一文。 在此示例中,我们选择“规范化 RU 消耗”指标,并选择“最大值”作为聚合值。
除了这些详细信息之外,还可以选择指标的时间范围和时间粒度。 可以查看过去最长 30 天的指标。 应用筛选器后,系统会根据该筛选器显示图表。
针对“规范化 RU 消耗量”指标的筛选器
还可以按特定的 CollectionName、DatabaseName、PartitionKeyRangeID 和区域筛选所显示的指标和图表。 若要筛选指标,请选择“添加筛选器”,并选择所需的属性(例如 CollectionName)和所关注的相应值。 然后,图中会显示在所选时间段内针对该容器的“规范化 RU 消耗量”指标。
可以使用“应用拆分”选项对指标进行分组。 对于共享吞吐量数据库,“规范化 RU”指标仅以数据库粒度显示数据,不会显示每个集合的任何数据。 因此按集合名称应用拆分时,将看不到共享吞吐量数据库的任何数据。
而是显示每个容器的规范化请求单位消耗指标,如下图所示:
后续步骤
- 使用 Azure 中的诊断设置监视 Azure Cosmos DB 数据。
- 审核 Azure Cosmos DB 控制平面操作
- 对 Azure Cosmos DB 请求速率过大 (429) 异常进行诊断及故障排除