Pgpool-II
1. 概述
Pgpool-II 是部署在数据库客户端与 IvorySQL 服务之间的中间件,提供后端长连接池、健康检查、流复制检查、只读查询负载均衡,以及实现自动故障转移所需的基础能力。
本文在 Ubuntu 22.04 x86_64 环境中使用 IvorySQL 5.4(PostgreSQL 18.4)和 Pgpool-II 4.7.2 完成验证。测试拓扑包含一个 IvorySQL 主库和一个流复制备库。
2. 已验证的兼容能力
| 能力 | 状态 | 验证结果 |
|---|---|---|
使用 IvorySQL 客户端库编译 |
支持 |
使用 IvorySQL 安装目录配置并成功编译 Pgpool-II |
后端连接池 |
支持 |
多个客户端会话能够复用 Pgpool-II 子进程中的后端连接池 |
流复制节点识别 |
支持 |
|
PostgreSQL 兼容语法的只读查询负载均衡 |
已验证所测试的查询 |
配置相同权重后,两个节点均收到所测试的 SELECT 查询;这不能证明 Oracle 专用语法支持负载均衡 |
Oracle 兼容会话 |
已验证连通性 |
会话切换到 |
Oracle 专用语法的负载均衡 |
未验证 |
在流复制模式下,Pgpool-II 解析器无法解析的语句会发送到主库,不参与负载均衡 |
3. 前提条件
-
所有数据库节点均已安装 IvorySQL 5.4。
-
IvorySQL 流复制已经正常工作,备库能够执行只读查询。
-
编译主机已安装 C 编译器、GNU make、Flex、Bison 和 OpenSSL 开发文件。
-
Pgpool-II 能够访问每个 IvorySQL 节点的 PostgreSQL 兼容端口。
| Pgpool-II 不负责创建或修复 IvorySQL 流复制。启用 Pgpool-II 前应独立验证复制状态。 |
4. 编译安装 Pgpool-II
curl -LO https://www.pgpool.net/source/pgpool-II-4.7.2.tar.gz
tar -xzf pgpool-II-4.7.2.tar.gz
cd pgpool-II-4.7.2
./configure \
--prefix=/usr/local/pgpool-II-4.7.2 \
--with-pgsql=/usr/local/ivorysql/ivorysql-5 \
--with-openssl
make -j"$(nproc)"
sudo make install
请将 IvorySQL 前缀替换为实际安装目录,该目录下应包含 bin/pg_config、include/postgresql 和 lib。
确认 Pgpool-II 版本:
/usr/local/pgpool-II-4.7.2/bin/pgpool --version
5. 创建监控角色
在主库创建以下登录角色,并确保角色定义已同步到备库。授予 pg_monitor 后,Pgpool-II 无需使用超级用户即可检查流复制状态。
CREATE ROLE pgpoolcheck LOGIN PASSWORD 'replace-with-a-strong-password';
GRANT pg_monitor TO pgpoolcheck;
生产环境应通过 pool_passwd 或操作系统密码文件保存密码,不要把明文密码直接写入 pgpool.conf。Pgpool-II 支持 SCRAM;请在 pool_hba.conf 和各 IvorySQL 节点的 pg_hba.conf 中配置相匹配的认证规则。
6. 配置 Pgpool-II
复制安装目录中的 pgpool.conf.sample 作为起点。以下片段包含双节点验证环境的必要设置:
backend_clustering_mode = 'streaming_replication'
listen_addresses = 'localhost'
port = 9999
unix_socket_directories = '/tmp'
backend_hostname0 = '10.0.0.11'
backend_port0 = 5333
backend_weight0 = 1
backend_data_directory0 = '/data/ivorysql/primary'
backend_flag0 = 'DISALLOW_TO_FAILOVER'
backend_application_name0 = 'ivory_primary'
backend_hostname1 = '10.0.0.12'
backend_port1 = 5333
backend_weight1 = 1
backend_data_directory1 = '/data/ivorysql/standby'
backend_flag1 = 'DISALLOW_TO_FAILOVER'
backend_application_name1 = 'ivory_standby'
load_balance_mode = on
sr_check_period = 10
sr_check_user = 'pgpoolcheck'
sr_check_database = 'postgres'
health_check_period = 10
health_check_user = 'pgpoolcheck'
health_check_database = 'postgres'
最小配置中使用 DISALLOW_TO_FAILOVER 是有意为之,避免不完整示例自动提升或摘除节点。改用 ALLOW_TO_FAILOVER 前,必须配置并测试 failover_command、备库提升、主库切换后的跟随流程、节点隔离,以及可选的 Watchdog。
验证配置时以前台模式启动 Pgpool-II:
/usr/local/pgpool-II-4.7.2/bin/pgpool \
-n -f /etc/pgpool-II/pgpool.conf
7. 验证集成
连接 Pgpool-II 端口,而不是直接连接后端节点:
psql -h pgpool-host -p 9999 -U application_user -d application_db
检查节点发现和查询分布:
SHOW POOL_NODES;
SELECT count(*) FROM application_table;
SHOW POOL_NODES;
SHOW POOL_PROCESSES;
IvorySQL 5.4 验证中,Pgpool-II 将两个节点状态均报告为 up,角色正确识别为 primary 和 standby,复制延迟为 0。配置相同权重后,首轮 21 个读查询中,主库执行 9 个,备库执行 12 个。这些结果仅适用于所测试的 PostgreSQL 兼容 SELECT 查询,不适用于 Oracle 专用语法。
8. Oracle 兼容模式
可以通过池化的 PostgreSQL 兼容连接启用 Oracle 兼容模式:
SET ivorysql.compatible_mode = oracle;
SELECT 'connected through Pgpool-II' AS status FROM dual;
该示例验证的是 Oracle 兼容会话的连通性和执行能力,而不是 Oracle 专用语法的负载均衡。SELECT … FROM dual 在语法形式上仍是引用关系的 PostgreSQL 兼容 SELECT。修改 ivorysql.compatible_mode 会改变后端行为,但不会改变 Pgpool-II 的 SQL 解析器。
|
Pgpool-II 4.7 使用 PostgreSQL 18 的 SQL 解析器,详见其 发行说明。根据 负载均衡规则,在本文采用的流复制模式下,Pgpool-II 无法解析的语句会发送到主库。因此,超出该解析器语法范围的 Oracle 专用语句即使配置了 这并不表示 Oracle 兼容会话中的每一条查询都必须走主库:Pgpool-II 能够解析的查询仍需满足其他负载均衡条件。不能仅凭会话模式或执行成功就判断路由能力。 |
8.1. 检查应用的实际路由
在测试环境中,在 pgpool.conf 中启用 log_per_node_statement 并重新加载配置:
log_per_node_statement = on
通过 Pgpool-II 分别执行应用中有代表性的 PostgreSQL 兼容查询和 Oracle 专用语句,再检查逐节点语句日志,确认实际发送目标。同时测试应用的事务及先写后读序列,因为语法解析并不是决定负载均衡资格的唯一条件。SHOW POOL_NODES 可辅助检查节点状态,但执行成功或已选定负载均衡节点,都不能证明某条语句实际在备库执行。
在完成应用级路由验证前,不要依赖备库分担 Oracle 专用 SQL 的读取负载。若 SQL 文本包含敏感数据,应在测试结束后关闭语句日志。
9. 运维注意事项
-
本文验证的是 IvorySQL PostgreSQL 兼容端点,不包括通过
ivorysql.port代理 Oracle 客户端协议。 -
遵守上述 Oracle 专用语法的路由限制,并将必须读取最新数据的语句路由到主库。
-
异步流复制可能从备库返回旧数据。应根据一致性要求配置延迟阈值或同步复制。
-
不要在对外服务中使用
trust认证。生产环境应启用 TLS、SCRAM、受限监听地址及最小权限监控账户。 -
自动故障转移属于独立的高可用设计。启用前必须测试节点提升、隔离、客户端重试和脑裂防护。
生产配置选项请参阅 Pgpool-II 4.7 官方文档。