本页面介绍了如何在 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_DATE、LOCALTIME、USER或CURRENT_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:如果启用了透明查询转发,则为查询处理。此标签记录以下值之一:
|