分析访问模式

您可以使用 Google Cloud console中的访问模式页面直观地分析应用在 Bigtable 中读取和写入数据的方式,也可以通过编程方式调用 Cloud Monitoring API 来查询底层访问模式指标。

在阅读本文档之前,请先查看读取、写入和监控。

概览

Bigtable 会自动将传入的数据请求分类为 Cloud Monitoring 中的查询类型。工作负载访问模式是不同查询类型的组合。例如,您的工作负载访问模式可以包含点读取、短扫描和点写入查询类型。Bigtable 定义了 10 种不同的查询类型。

系统数据分析页面显示整体资源利用率,Key Visualizer 显示 Bigtable 如何在行键范围内分配流量,而访问模式页面则在集群、表和应用配置文件级别提供以查询为中心的工作负载细分。您可以使用访问模式页面执行以下任务:

  • 了解您的工作负载:查看每个集群的读取、写入和读写查询类型的比例和速率,并按表或应用配置文件对指标进行分组
  • 检测低效查询模式并排查延迟时间问题:
    • 识别稀疏读取,即 Bigtable 扫描的行数或单元格数明显多于返回的行数或单元格数,这是因为存在选择性过滤条件或未收集的单元格正在等待垃圾回收
    • 监控反向扫描,其效率低于正向扫描
    • 比较服务器端延迟时间百分位以及扫描的行数、返回的行数和看到的单元格数,以查明哪些访问模式会导致延迟时间激增
  • 确定要采用该功能的工作负载:
    • 识别具有大量点读取操作的表或应用配置文件,这些表或应用配置文件可以从企业 Plus 版中的内存中层受益
    • 确定您可以使用 Data Boost 无服务器计算与服务流量隔离开来的大型扫描或批量读取工作负载

限制

Bigtable 不会将 GoogleSQL for Bigtable 查询归类为访问模式,也不会将这些查询纳入行、单元格或字节访问模式指标中。在 QPS 分布、QPS 和延迟时间图表中,SQL 查询和其他未分类的请求显示为 QUERY_TYPE_UNKNOWN。

所需的角色

如需获得在 Google Cloud 控制台中查看访问模式页面所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。

这些预定义角色包含在 Google Cloud 控制台中查看访问模式页面所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

您需要具备以下权限,才能在 Google Cloud 控制台中查看访问模式页面:

  • 查看实例详情: bigtable.instances.get
  • 列出集群、应用配置文件和表: bigtable.clusters.list, bigtable.appProfiles.list, bigtable.tables.list
  • 查询 Monitoring 指标: monitoring.timeSeries.list

您也可以使用自定义角色或其他预定义角色来获取这些权限。

访问模式

当您的应用使用 Bigtable 客户端库时,客户端库会将您的方法调用转换为 Bigtable Data API 请求:

Bigtable 会在每个传入的 Data API 请求完成后,根据以下因素(而非仅根据客户端库方法名称)在服务器上对其进行分类:

  • 请求参数:请求是针对单个行键、多个行键还是行范围,请求是否设置了 reversed,以及应用了哪些过滤条件
  • 执行统计信息:扫描和返回的行数和单元格数,以及字节载荷

例如,当您调用单行读取方法(例如 readRow)或使用单行键调用 readRows 时,Bigtable 通常会将请求归类为点读取,这符合内存层级的条件。不过,如果该单行读取操作使用复杂的过滤条件或扫描大量单元格,Bigtable 可能会将其归类为稀疏读取、批量读取或其他读取。相反,如果您调用 readRows 来读取多个行键或扫描行范围,Bigtable 会将该请求归类为批量读取或扫描,不符合内存层级的条件。

读取评估顺序

由于单个 ReadRows Data API 请求可能符合多个类别的特征,因此 Bigtable 会按以下顺序评估读取请求,并分配第一个匹配的访问模式:

  1. 点读取
  2. 短扫描(对于正向扫描)或反向短扫描(当 reversed 设置为 true 时)
  3. 反向扫描(针对 reversed 设置为 true 的任何剩余读取请求)
  4. 稀疏读取(在批量读取之前进行评估,以便 Bigtable 将多键读取或具有大量过滤条件消除的大型前向扫描标记为稀疏读取)
  5. 批量读取
  6. 其他读取(针对任何剩余的 ReadRows 请求)

查询类型定义

下表介绍了每个访问模式类别、其在 Monitoring 中对应的 query_type 标签、其适用的典型客户端库操作和底层 Data API 方法(method 指标标签),以及 Bigtable 如何将请求分类到该类别。由于方法名称因编程语言而异,因此该表列出了具有代表性的客户端库方法名称;如需查看特定语言的代码示例,请参阅读取示例和写入示例。如需了解简单过滤条件和复杂过滤条件,请参阅本文档的简单过滤条件与复杂过滤条件部分。

查询类型 query_type 个指标标签 客户端操作和 Data API 方法 分类标准
点读取 QUERY_TYPE_POINT_READ

单行读取,例如 readRow 或单键 readRows

Data API:ReadRows

对单个行键进行正向读取,不使用过滤条件或使用简单过滤条件,其中扫描和返回的单元格数量以及总响应大小保持在较小的单行限制范围内。

短扫描 QUERY_TYPE_SHORT_SCAN

行范围或前缀扫描,例如具有单个范围或前缀的 readRows

Data API:ReadRows

对单个连续行范围进行正向扫描,不使用过滤条件或使用简单过滤条件,其中扫描和返回的行数和单元格数以及总响应大小保持在较小的有界限值内。

反向短扫描 QUERY_TYPE_REVERSE_SHORT_SCAN

反向扫描,例如 readRows,其中包含单个反向范围或前缀

Data API:ReadRows

对单个连续行范围的反向扫描,不使用过滤条件或使用简单过滤条件,并且保持在与短扫描相同的有界行、单元格和字节限制内。

反向扫描 QUERY_TYPE_REVERSE_SCAN

反向扫描,例如反向 readRows

Data API:ReadRows

不符合反向短扫描条件的任何反向读取,例如,超出短扫描行、单元格或字节限制的反向扫描,指定单个行键,扫描多个行范围,或使用复杂过滤条件。

稀疏读取 QUERY_TYPE_SPARSE_READ

使用 readRow 或 readRows 对未收集的单元格进行过滤读取或扫描

Data API:ReadRows

任何正向读取请求(在点读取、短扫描和反向扫描之后评估),其中 Bigtable 扫描的行或单元格明显多于返回的行或单元格,因为过滤条件消除或未收集的单元格等待垃圾回收。

批量读取 QUERY_TYPE_BULK_READ

多行读取,例如多键 readRows 或 bulkReadRows,或使用 readRow 的大型单行读取

Data API:ReadRows

一种前向读取,它指定一个或多个行键,不使用过滤条件或使用简单过滤条件,超出点读取限制(例如,请求多个行键或读取大型单行),并且不符合稀疏读取的条件。

其他读取 QUERY_TYPE_OTHER_READ

使用 readRow 或 readRows 的大型范围扫描、多范围扫描或过滤读取

Data API:ReadRows

任何不符合上述读取类别的 ReadRows 请求,例如大型前向范围扫描、多范围扫描、组合行键和行范围的请求,或具有不符合稀疏条件的复杂过滤条件的读取。

点写入 QUERY_TYPE_POINT_WRITE

简单写入、增量更新或小型批量写入,例如 mutateRow 或 bulkMutateRows

Data API:MutateRow、MutateRows

单行 MutateRow 请求或小型 MutateRows 批量请求,用于修改少量行和单元格,总字节载荷较小。

其他写入 QUERY_TYPE_OTHER_WRITE

大型批量写入或大型简单写入,例如 bulkMutateRows 或 mutateRow

Data API:MutateRow、MutateRows

任何超出单点写入限制的 MutateRow 或 MutateRows 请求,例如较大的批量写入或具有大量变更或字节载荷的写入。

读写 QUERY_TYPE_READ_WRITE

条件写入或附加,例如 checkAndMutateRow 或 readModifyWriteRow

Data API:CheckAndMutateRow、ReadModifyWriteRow

任何条件写入 (CheckAndMutateRow) 或原子增量或附加 (ReadModifyWriteRow) 请求,无论载荷大小如何。

在请求数和延迟时间指标中,Bigtable 会将未分类的请求(例如 GoogleSQL for Bigtable 查询)标记为 QUERY_TYPE_UNKNOWN。

简单过滤条件与复杂过滤条件

如需符合点读取、短扫描、反向短扫描或批量读取的条件,ReadRows 请求必须不使用过滤条件或使用简单过滤条件。

如果过滤条件仅使用以下过滤条件类型(单独使用或在有界限的 chain 过滤条件中组合使用),则 Bigtable 会将其归类为简单过滤条件。如需了解详情,请参阅链。

  • 无滤镜 (FILTER_NOT_SET)
  • pass_all_filter 或 block_all_filter
  • column_range_filter、column_qualifier_regex_filter 或 family_name_regex_filter
  • cells_per_column_limit_filter、cells_per_row_limit_filter 或 cells_per_row_offset_filter
  • timestamp_range_filter

如果 ReadRows 请求使用的过滤条件类型不在上述列表中(例如以下类型),或者请求中串联了大量过滤条件,Bigtable 会将其视为使用复杂过滤条件:

  • value_regex_filter
  • value_range_filter
  • row_key_regex_filter
  • row_sample_filter
  • interleave
  • condition
  • sink
  • strip_value_transformer
  • apply_label_transformer

如果 reversed 为 true,Bigtable 会将此类请求归类为反向扫描,否则归类为稀疏读取(如果扫描的行数或单元格数明显多于返回的行数或单元格数)或其他读取。

查看访问模式

您可以在 Google Cloud 控制台中的实例级层或集群级层查看访问模式页面。

查看实例的访问模式

  1. 在 Google Cloud 控制台中,打开 Bigtable 实例列表。

    打开实例列表

  2. 点击要查看其指标的实例。

  3. 在导航窗格中的可观测性下,点击访问模式。

  4. 在集群列表中,选择要检查其访问模式的集群。默认情况下, Google Cloud 控制台会选择实例中的第一个集群。

  5. 在分组依据列表中,选择如何细分图表:

    • 无:默认选项,按访问模式(例如 QUERY_TYPE_POINT_READ)细分所有图表
    • 应用配置文件:按应用配置文件 ID 和访问模式细分所有图表
    • 表:按表 ID 和访问模式细分所有图表
  6. 可选:如需更改时间范围或切换自动刷新,请使用时间范围选择器。

查看集群的访问模式

  1. 在 Google Cloud 控制台中,打开 Bigtable 实例列表。

    打开实例列表

  2. 点击要查看其指标的实例。

    系统会打开实例概览页面。

  3. 在集群表中,点击集群 ID。

  4. 在导航窗格中,点击访问模式。 该页面会显示所选集群的指标。

  5. 在分组依据列表中,选择如何细分图表:

    • 无:默认选项,按访问模式(例如 QUERY_TYPE_POINT_READ)细分所有图表
    • 应用配置文件:按应用配置文件 ID 和访问模式细分所有图表
    • 表:按表 ID 和访问模式细分所有图表
  6. 可选:如需更改时间范围或切换自动刷新,请使用时间范围选择器。

“访问模式”页面上的图表和指标

访问模式页面提供了以下指标的图表:

指标 支持的设备 说明
QPS 分布 集群
表
应用配置文件

在所选时间范围内,集群每秒请求数 (QPS) 的比例和平均速率,按 query_type 和所选分组依据选项细分。

延迟时间 集群
表
应用配置文件

服务器端请求延迟时间随时间的变化,按 query_type 和所选分组依据选项细分。使用图表上的百分位菜单可在第 99 百分位(默认)、第 95 百分位和第 50 百分位之间切换。

QPS 集群
表
应用配置文件

一段时间内每秒请求速率,按 query_type 和所选分组依据选项细分。

返回的行数 集群
表
应用配置文件

应用过滤条件后,Bigtable 每秒针对读取和读写请求向客户端返回的行数。

扫描的行数 集群
表
应用配置文件

Bigtable 在处理读取和读写请求时,在应用过滤条件之前每秒读取的行数。通过将扫描的行数与返回的行数进行比较,您可以识别低效的读取过滤条件。

修改的行数 集群
表
应用配置文件

写入和读写请求每秒修改的行数。

扫描的单元数 集群
表
应用配置文件

在应用过滤条件之前,Bigtable 在读取和读写请求期间每秒检查的单元格数量,包括其过滤掉或正在等待垃圾回收的单元格。

发送的单元数 集群
表
应用配置文件

Bigtable 在应用过滤条件后每秒返回给客户端的单元格数量。通过比较所显示单元数与发送单元数,您可以找出针对每个返回单元检查多个单元的读取请求。

发送的字节数 集群
表
应用配置文件

每秒返回的已编码行数据的字节数。

您还可以使用 Cloud Monitoring API 以编程方式查询这些指标,在 Metrics Explorer 中查看这些指标,或将其添加到自定义信息中心。bigtable_table 受监控的资源上的每个 bigtable.googleapis.com/query_type/* 指标都包含以下标签:

  • 资源标签:project_id、instance、cluster 和 table
  • 指标标签:query_type、app_profile 和 method

如需详细了解如何在 Monitoring 中查询 Bigtable 指标,请参阅使用 Monitoring 进行监控和指标。

根据访问模式优化工作负载

您可以使用访问模式页面上的指标来做出以下决策:

  • 为低延迟点读取启用内存中层:如果 QPS 分布、QPS 和延迟时间图表显示,在具有严格读取延迟时间目标的表或应用配置文件上存在大量 QUERY_TYPE_POINT_READ 请求,请考虑启用企业 Plus 版中提供的内存中层。按表或应用配置文件对图表进行分组,以确定哪些表和工作负载将受益最大。
  • 使用 Data Boost 隔离大型扫描和批量读取:如果您发现与延迟敏感型服务流量共享集群的 QUERY_TYPE_BULK_READ 或 QUERY_TYPE_OTHER_READ 请求出现大量或周期性高峰,请按应用配置文件分组依据,以确定扫描的来源。通过配置为使用 Data Boost 无服务器计算的专用应用配置文件路由批量、报告或分析读取操作,以便大型扫描不会与服务节点争用 CPU 资源。
  • 减少过滤开销并调整垃圾回收:如果您看到 QUERY_TYPE_SPARSE_READ 请求率很高,如果扫描的行数远高于返回的行数,或者如果看到的单元格数远高于发送的单元格数,则您的读取请求正在扫描 Bigtable 不会返回给客户端的数据。如需提高读取效率,请执行以下操作:
    • 在读取请求中缩小行键范围或前缀,而不是依靠值或正则表达式过滤条件来舍弃行。
    • 如果您的应用只需要最新的单元格版本,请添加单元格限制过滤条件,例如 cells_per_column_limit_filter。如需了解详情,请参阅每列单元格数限制。
    • 查看垃圾回收政策,确保过期或过时的单元格版本不会累积并减慢扫描速度。如需了解详情,请参阅垃圾回收概览。
  • 将反向扫描替换为正向扫描:如果您发现频繁的 QUERY_TYPE_REVERSE_SCAN 或 QUERY_TYPE_REVERSE_SHORT_SCAN 请求延迟时间较长,请考虑设计行键,以便应用可以发出正向扫描。如需了解详情,请参阅架构设计最佳实践。

后续步骤