通过透明查询转发优化资源并隔离读取查询

本页面介绍了如何在 AlloyDB for PostgreSQL 实例中启用、配置和监控透明查询转发。透明查询转发是一项智能资源优化功能,可让主节点拦截只读查询,并有选择地将其转发到未充分利用的读取池实例,同时保持读己所写一致性。转发到读取池的查询会生成与主节点执行一致的结果。

透明查询转发

透明查询转发最适合以下情况:

  • 混合工作负载 (HTAP):您在处理事务的同一数据库上运行报告或分析查询,并保持读己所写一致性,并且您希望防止开销高昂的读取操作影响写入延迟时间。
  • 单体应用:您希望使用读取池容量,而无需重构应用以使用单独的读取器和写入器端点,同时仍需要严格的读己所写一致性。
  • 动态负载管理:您会遇到不可预测的读取流量高峰,并且您希望在主节点负载过重时,数据库能够自动将工作分流到读取池节点,同时保持读己所写一致性。

准备工作

  • 确保您的 AlloyDB 集群与 PostgreSQL 17 或 18 兼容。

  • 您必须在 AlloyDB 集群中配置至少一个活跃的读取池实例。如需了解如何创建或验证读取池实例,请参阅在集群中创建读取池实例查看实例详细信息

所需角色

  • 确保您拥有 alloydbsuperuser 数据库角色,或者以默认 postgres 用户身份登录。

启用透明查询转发

透明查询转发默认处于停用状态。您可以在会话级或数据库级动态启用它,而无需重启数据库。

在会话级启用

如需为当前会话启用透明查询转发,请运行以下 SQL 命令:

SET alloydb.enable_query_forwarding = TRUE;

在数据库级启用

如需为特定数据库启用透明查询转发,请运行以下 SQL 命令:

ALTER DATABASE DATABASE_NAME SET alloydb.enable_query_forwarding = ON;

DATABASE_NAME 替换为您的数据库的名称。

查询资格条件

  • 透明查询转发仅适用于只读 SELECT 语句。
  • 查询不得采用任何行级锁,例如 SELECT ... FOR UPDATE 中使用的锁。
  • 透明查询转发对多语句事务中的 SELECT 语句的支持有限。
  • 查询不能引用临时表、未记录的表或目录表。
  • 查询必须遵守以下函数约束:
    • 查询不得包含易失性函数或任何用户定义函数 (UDF)。
    • 查询不得包含 SQL 值函数,例如 CURRENT_DATELOCALTIMEUSERCURRENT_SCHEMA
    • 查询不得包含 NEXTVAL() 表达式。
    • 查询不能包含任何 SQL 过程或 SQL 函数。
  • 所有结果列都必须使用实现二进制发送和接收函数的数据类型。
  • 只有当查询的开销成本相对于查询的总成本而言极低时,查询才有资格进行转发。这意味着,使用索引扫描的查询通常会被排除在外,因为它们的开销通常会超过查询本身的成本。
  • 不支持转发到 AlloyDB 热备节点。AlloyDB 热备节点是高可用性 (HA) 主实例的专用次要节点。

使用 EXPLAIN 验证查询资格

在以下示例中,large_table 是一个包含许多行的数据库中的表。如需检查特定查询在当前配置下是否有资格进行转发,请运行 EXPLAIN 命令:

EXPLAIN SELECT count(*) FROM large_table t1, large_table t2;

如果查询符合条件,输出会在标准 Postgres 执行计划后包含查询转发状态语句。如果缺少此语句,则查询不符合查询转发的条件,并且会在主实例上本地执行。

Aggregate  (cost=25000.00..25000.01 rows=1 width=8)
  ->  Nested Loop  (cost=0.00..20000.00 rows=1000000 width=0)
        ... [Standard Postgres Plan Steps] ...
Query Forwarding: Eligible. (overhead=1250.02)

在输出响应中,Eligible 表示查询符合标准只读 SQL 条件,并且成本效益分析倾向于将其路由到读取池实例。overhead 参数表示将查询转发到读取池实例的计算规划器成本,包括建立连接和在副本上恢复快照的开销。

监控查询转发指标

如需验证透明查询转发是否适用于您的工作负载,您可以在 Cloud Monitoring 中跟踪以下指标:

指标 说明 详细信息
alloydb.googleapis.com/internal/database/postgresql/workload/distributed/tqf_query_count 透明查询转发处理的查询的累计数量。 显示名称: TQF 查询数量
指标种类: CUMULATIVE
值类型: INT64
标签
status:如果启用了透明查询转发,则为查询处理。此标签记录以下值之一:
  • completed:在读取池实例上执行。
  • fallback:在主实例上执行。
  • disqualified:无法转发。

后续步骤