排查读取池查询问题

本页面介绍了一些方法,可用于调查和调试 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 地址,以便您可以连接到该节点。
  • 执行进一步的日志查询,详细了解节点的近期活动。

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

如果您知道某个读取池在处理长时间运行的查询,那么 Logs Explorer 可以帮助您确定处理该查询的特定节点的 ID。

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

  1. 访问 Logs Explorer:

    转到日志浏览器

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

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

  4. 点击运行查询

  5. 使用 Logs Explorer 的控件,根据需要调整和重新运行查询,以将结果过滤为仅包含最相关的内容。

  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 添加到 Logs Explorer 查询构建器,并将 NODE_ID 替换为节点的四字符 ID 字符串。

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

  4. 根据需要重复上一步,以便进一步缩小搜索范围。

监控节点指标

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

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

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

关于节点短暂性的说明

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

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

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

后续步骤