使用 Azure Cosmos DB 中的见解进行监视和调试
适用对象: NoSQL MongoDB Cassandra Gremlin 表
Azure Cosmos DB 提供吞吐量、存储、一致性、可用性和延迟方面的见解。 Azure 门户提供这些指标的聚合视图。 也可通过 Azure Monitor API 查看 Azure Cosmos DB 指标。 指标的维度值(例如容器名称)不区分大小写。 因此,在对这些维度值进行字符串比较时,需要使用不区分大小写的比较。 若要了解如何从 Azure Monitor 查看指标,请参阅监视 Azure Cosmos DB。
本文介绍常见用例,以及如何使用 Azure Cosmos DB 见解来分析和调试这些问题。 默认情况下,指标见解每五分钟收集一次,并保留 7 天。
以下部分介绍可以使用 Azure Cosmos DB 指标的常见场景。
注意
在指标中按数据库或集合进行筛选时,可能会看到“__Empty”或“<Empty>”作为 resourceName。 这是因为指标数据是为该特定请求在帐户级别收集的。 因此,没有关联的数据库或集合作为指标值。
了解成功的请求数或导致错误的请求数
若要开始,请前往 Azure 门户并导航到“见解”窗格。 在此窗格中,打开“请求”选项卡。“请求”选项卡会显示一个图表,其中包含按状态代码和操作类型细分的请求总数。 有关 HTTP 状态代码的详细信息,请参阅 Azure Cosmos DB 的 HTTP 状态代码。
最常见的错误状态代码为 429(速率限制)。 此错误意味着对 Azure Cosmos DB 的请求超过预配的吞吐量。 此问题最常见的解决方案是为给定集合纵向扩展 RU。 有关详细信息,请参阅 Azure Cosmos DB 中的预配吞吐量简介
按分区键范围确定吞吐量使用量
对任何可伸缩应用程序而言,均必须具有良好的分区键基数。 若要确定任何按分区键范围 ID 细分的分区容器的吞吐量分布,请导航到“见解”窗格。 打开“吞吐量”选项卡。图表中将显示不同分区键范围内的标准化 RU/s 消耗量。
使用此图表可确定是否存在热分区。 PartitionKeyRangeID 对应于物理分区。 归一化 RU 消耗指标是一个介于 0% 和 100% 之间的值,可帮助测量数据库或容器上的预配吞吐量利用率。 吞吐量分布不均可能会导致热分区,进而造成请求受阻,可能需要重新分区。 确定导致分布倾斜的分区键之后,可能需使用进一步分布的分区键重新执行容器分区。 有关 Azure Cosmos DB 中的分区的详细信息,请参阅 Azure Cosmos DB 中的分区和横向缩放。
确定数据和索引使用情况
务必根据数据使用情况、索引使用情况和文档使用情况确定任何分区容器的存储分布。 可以最大限度地减少索引使用量,最大限度地增加数据使用量并优化查询。 若要获取此数据,请导航到“见解”窗格,并打开“存储”选项卡。
比较数据与索引的大小
在 Azure Cosmos DB 中,所用存储空间总量是指数据大小和索引大小的总和。 索引大小通常只是数据大小的一小部分。 若要了解详细信息,请参阅索引大小一文。 在 Azure 门户的“指标”窗格上,“存储”选项卡显示了基于数据和索引的存储空间使用量详情。
// Measure the document size usage (which includes the index size)
ResourceResponse<DocumentCollection> collectionInfo = await client.ReadDocumentCollectionAsync(UriFactory.CreateDocumentCollectionUri("db", "coll"));
Console.WriteLine("Document size quota: {0}, usage: {1}", collectionInfo.DocumentQuota, collectionInfo.DocumentUsage);
若要节省索引空间,可调整索引策略。
调试慢速查询
在 API for NoSQL SDK 中,Azure Cosmos DB 提供查询执行的统计信息。
IDocumentQuery<dynamic> query = client.CreateDocumentQuery(
UriFactory.CreateDocumentCollectionUri(DatabaseName, CollectionName),
"SELECT * FROM c WHERE c.city = 'Seattle'",
new FeedOptions
{
PopulateQueryMetrics = true,
MaxItemCount = -1,
MaxDegreeOfParallelism = -1,
EnableCrossPartitionQuery = true
}).AsDocumentQuery();
FeedResponse<dynamic> result = await query.ExecuteNextAsync();
// Returns metrics by partition key range Id
IReadOnlyDictionary<string, QueryMetrics> metrics = result.QueryMetrics;
QueryMetrics 提供执行每个查询组件所用时长的详细信息。 导致查询长时间运行的最常见根因是扫描,这意味着查询无法应用索引。 可通过设置更好的筛选条件来解决此问题。
监视控制平面请求
Azure Cosmos DB 对连续 5 分钟间隔内可以发出的元数据请求数应用限制。 超出这些限制的控制平面请求可能会受到限制。 在某些情况下,元数据请求可能会对包含帐户所有元数据的帐户中的 master partition
消耗吞吐量。 超过吞吐量量的控制平面请求将遇到速率限制(429 秒)。
若要开始,请前往 Azure 门户并导航到“见解”窗格。 在此窗格中,打开“系统”选项卡。“系统”选项卡显示两个图表。 一个显示帐户的所有元数据请求。 第二个显示存储帐户元数据的帐户 master partition
的元数据请求吞吐量消耗。
上面的“按状态代码显示的元数据请求”图在您增加时间范围时会以更大粒度聚合请求。 可用于 5 分钟时间箱的最大时间范围是 4 小时。 若要以特定粒度监视更大时间范围内的元数据请求,请使用 Azure 指标。 创建新图表并选择“元数据请求指标”。 在右上角选择“5 分钟”作为“时间粒度”,如下所示。 指标还允许用户创建警报,这使得它们比 Insights 更有用。
后续步骤
可以阅读以下文章,进一步介绍了如何提高数据库性能: