TTL 指标和监控

本页介绍了 Spanner 存留时间 (TTL) 指标。如需了解详情, 请参阅关于 TTL

指标

Spanner 提供有关系统中 TTL 活动的信息 可通过 SQL 查询读取的表,以及通过 Cloud Monitoring

系统表报告数据库的每个表的 TTL 信息,而 Cloud Monitoring 报告数据库级别的指标。

使用 SQL 查询

Spanner 提供了用于跟踪相关信息的 至 TTL。该表名为 SPANNER_SYS.ROW_DELETION_POLICIES 并具有以下架构。

列名 类型 说明
TABLE_NAME STRING 包含此 TTL 政策的表的名称。
PROCESSED_WATERMARK 时间戳 到目前为止,此政策已针对表中的所有行运行。某些表分区的处理时间可能更晚,因此该时间戳表示处理时间最晚的分区。通常是在 72 小时内处理的分区。
UNDELETABLE_ROWS INT64 TTL 政策无法删除的行数。如需了解详情,请参阅不可删除的行
MIN_UNDELETABLE_TIMESTAMP 时间戳 在上一个处理周期中观察到的不可删除行的最早时间戳。

删除政策信息将按数据库的每个表返回。

您可以使用类似于以下样式的 SQL 查询来查询此数据:

SELECT TABLE_NAME, UNDELETABLE_ROWS
FROM SPANNER_SYS.ROW_DELETION_POLICIES
WHERE UNDELETABLE_ROWS > 0

SPANNER_SYS 表只能通过 SQL 接口访问;例如:

  • Google Cloud 控制台中的 Spanner Studio 页面
  • gcloud spanner databases execute-sql 命令
  • executeQuery API

Spanner 提供的其他单次读取方法不支持 SPANNER_SYS

使用 Cloud Monitoring

Spanner 提供以下指标来监控数据库级别的 TTL 活动:

  • row_deletion_policy/deleted_rows 是 TTL 删除的行数 政策。
  • row_deletion_policy/undeletable_rows 是与 行删除 (GoogleSQL) 或 TTL INTERVAL(PostgreSQL) 语句,但无法删除。这通常是因为相应行 许多子行,导致操作超出 Spanner 的 交易限额
  • row_deletion_policy/processed_watermark_age 是当前时间和最后一个成功周期(具有或没有不可删除的行)使用的读取时间戳之间相隔的时间。

您可以通过 Cloud MonitoringGoogle Cloud 控制台获得这些指标。

监控

您还可以监控其他 TTL 活动。

查找上次成功的扫描

您可以找到 Spanner 完成用于查找过期行的表扫描的上一个快照时间。要以 SQL 查询的形式执行此操作:

SELECT PROCESSED_WATERMARK
FROM SPANNER_SYS.ROW_DELETION_POLICIES
WHERE TABLE_NAME = $name

或者,row_deletion_policy/process_watermark_age 指标显示类似信息,但表示为当前时间和上次扫描时间之间相隔的时间。此指标不会按表细分,但会表示数据库中任何启用了 TTL 的表的最早扫描时间。

与 TTL 政策匹配的行通常会在过期日期后的 72 小时内删除。您可以针对 processed_watermark_age 设置提醒,以便在超过 72 小时时收到通知。

如果 processed_watermark_age 超过 72 小时,则可能表示优先级较高的任务正在阻止 TTL 运行。在这种情况下,我们建议您检查 CPU 利用率并在必要时添加更多计算容量。如果 CPU 利用率在建议范围内,请使用 Key Visualizer 执行 hotspotting。

监控已删除的行

如需监控表上的 TTL 活动,请绘制 row_deletion_policy/deleted_rows 指标。此指标显示一段时间内删除的行数。

如果没有过期的数据,则此指标为空。

监控不可删除的行

当 TTL 无法删除行时,Spanner 会自动重试。 如果在重试时无法处理 TTL 操作,Spanner 将跳过 该行并在 row_deletion_policy/undeletable_rows_count 中报告 指标。

您可以针对 row_deletion_policy/undeletable_rows_count 设置提醒,以接收非零计数通知。

如果发现非零计数,则可以创建按表细分计数的查询:

SELECT TABLE_NAME, UNDELETABLE_ROWS, MIN_UNDELETABLE_TIMESTAMP
FROM SPANNER_SYS.ROW_DELETION_POLICIES
WHERE UNDELETABLE_ROWS > 0

要查找不可删除行的内容,请执行以下操作:

SELECT *
FROM $TABLE_NAME
WHERE $EXPIRE_COL >= $MIN_UNDELETABLE_TIMESTAMP

最常见的情况是,行删除失败是由于针对交错表和索引执行的级联更新导致产生的事务大小超过 Spanner 的变更限制。如需解决此问题,您可以更新架构以对交错表添加单独的 TTL 政策