排查读取池查询问题

本页介绍了调查和调试 AlloyDB for PostgreSQL 发送到读取池实例的查询的方法:

  • 查看读取池的组成节点的详细列表,包括其 IP 地址。
  • 直接连接到节点,以进行调试。
  • 检查 AlloyDB 日志,以确定哪个特定节点在处理发送到读取池的任何查询。
  • 查询给定读取池节点的所有近期活动的日志。
  • 查看与读取池节点关联的 Google Cloud 指标。

将这些方法结合使用,您可以对读取池执行诊断和调试操作。例如,如果集群的一个读取池在处理长时间运行的查询时使用了异常多的 CPU,您可以使用这些技术确定哪个节点在处理该查询,然后直接连接到该节点以进一步检查或终止该查询。

列出读取池节点的详细信息

在正常使用 AlloyDB 时,您无需知道构成读取池的节点的标识或地址。不过,在必要时,您可以查看读取池实例的节点列表。列出的每个节点都包含以下信息,这些信息对后续诊断和调试很有用:

如需查看读取池节点的内部 ID 字符串和 IP 地址,请按照查看实例详情中针对 gcloud 的说明操作,但要额外添加一个 --view=FULL 命令行参数:

gcloud

gcloud alloydb instances describe READ_POOL_ID \
 --region=REGION_ID \
 --cluster=CLUSTER_ID \
 --project=PROJECT_ID \
 --view=FULL

替换以下内容:

  • READ_POOL_ID:读取池的 ID。
  • REGION_ID:实例的地区 ID。
  • CLUSTER_ID:实例所在集群的 ID。
  • PROJECT_ID:实例所属项目的 ID。

输出包含标记为 nodes 的部分,类似于以下内容:

nodes:
- id: READ_POOL_INSTANCE_ID-edd4f6ed-hcfh
  ip: 10.90.80.57
  state: HEALTHY
  zoneId: us-central1-b
- id: READ_POOL_INSTANCE_ID-edd4f6ed-ldbm
  ip: 10.90.80.56
  state: HEALTHY
  zoneId: us-central1-c

每个条目的 idip 字段与本页介绍的其他技术密切相关:

  • ip 字段显示节点在集群 VPC 中的 IP 地址。

  • id 字段包含节点的完整 Google Cloud ID 字符串。节点的已记录条目中仅会显示此字符串的最后四个字符。

    例如,如需查找与上例输出中的第一个节点相关的日志条目,请使用 ID 字符串 hcfh 查询日志

直接连接到节点

知道节点的 IP 地址后,您可以直接连接到其 PostgreSQL 服务器。例如,如需使用 psql 连接到集群 VPC 中的虚拟机,请按照运行 psql 客户端中的说明操作。执行此操作时,请提供节点的 IP 地址,而不是其读取池实例的 IP 地址:

psql -h NODE_IP_ADDRESS -U USERNAME

在日志中查找节点活动

AlloyDB 会在有关读取池处理的查询的日志条目中包含节点 ID。一般来说,您可以通过以下两种方式使用这些发现的 ID:

  • 确定该节点的 IP 地址,以便您可以连接到该节点。
  • 执行进一步的日志查询,详细了解节点的近期活动。

确定哪个节点正在处理已知查询

如果您知道某个读取池正在处理长时间运行的查询,则日志浏览器可以帮助您确定处理该查询的特定节点的 ID。

请注意,此方法仅适用于启用了 pgAudit 扩展程序的读取池实例。

  1. 访问 Logs Explorer:

    转到日志浏览器

  2. 查询构建器中,将 resource.labels.instance_id="READ_POOL_ID" 添加到查询编辑器字段,并将 READ_POOL_ID 替换为读取池实例的名称。

  3. 将您要调查的 SQL 语句(全部或部分)添加到查询编辑器字段中。例如 select id from MyTable。此输入不区分大小写。

  4. 点击运行查询

  5. 您可以使用日志浏览器的控件根据需要调整和重新运行查询,以过滤出最相关的结果。

  6. 点击结果列表中的日志条目以展开其显示内容。

  7. 点击条目展开式显示中的 labels 字段。

  8. 记下 labels 下的 NODE_ID 的值。

结果是处理查询的节点的四位字符标识符。

连接到日志条目中提及的节点

如果您想根据特定节点的日志记录活动直接连接到其 PostgreSQL 服务器,请按以下步骤操作:

  1. 记下已记录节点的四位字符 ID 字符串。您可以在日志条目的 NODE_ID 字段中找到此 ID。

  2. 列出读取池的节点

  3. 在该列表中,找到 ID 字符串以您在第一步中记下的四个字符结尾的节点。列出的节点可能都不匹配。

  4. 如果您找到匹配的节点,请使用其匹配的 IP 地址连接到该节点的 PostgreSQL 服务器

    否则,如果上一步中列出的读取池的所有节点的 ID 都与已记录的节点不匹配,则表示读取池在原始日志条目之后的时间段内已停用该节点。这是 AlloyDB 读取池的正常行为,如关于节点易失性的备注中所述。在这种情况下,您无法与该节点建立直接连接。

连接到节点的 PostgreSQL 服务器后,您可以使用标准 PostgreSQL 监控技术(例如 pg_stat_activity)进一步调查节点的当前进程,并根据需要进行调整。

查看有关节点的更多日志条目

如需查看与特定 ID 的节点相关的较新日志记录活动,请执行以下操作:

  1. 访问 Logs Explorer:

    转到日志浏览器

  2. labels.NODE_ID=NODE_ID 添加到日志浏览器查询构建器,将 NODE_ID 替换为节点的四位字符 ID 字符串。

  3. 点击运行查询可查看所选时间范围内该节点的所有活动,或调整查询以进一步过滤。

  4. 根据需要重复上述步骤,以优化搜索。

监控节点指标

您可以从 AlloyDB 系统数据分析信息中心查看与各个节点关联的指标。如需详细了解可用节点指标,请参阅系统数据分析指标参考文档

如需了解哪些节点 ID 与特定读取池实例相关联,请参阅列出读取池节点的详细信息

如需查看这些指标及其他 AlloyDB 指标的完整参考文档,请参阅“Google Cloud 指标”中的 alloydb

关于节点暂时性的说明

虽然您可以出于临时调查或调试目的安全地连接到节点,但使用读取池的应用应始终使用集群在其实例列表中显示的 IP 地址在实例级别连接到这些池。

AlloyDB 会将读取池的节点视为短暂的可互换资源。该服务会根据需要更改读取池的节点名单,以确保该读取池实例能够实现负载均衡并保持响应速度。如果应用直接连接到读取池节点(而不是读取池实例),则每当 AlloyDB 更新实例的节点名单时,都有可能突然与数据库断开连接。

请始终让应用在实例级别连接到读取池,并让 AlloyDB 负责将查询高效路由到适当的节点。

后续步骤