Pgpool无法连接PostgreSQL Standby服务器问题求助
首先,从你给出的日志和配置来看,核心问题分为两部分:Pgpool无法连接Standby备库的认证问题,以及故障切换脚本的参数缺失问题。咱们一步步拆解解决:
一、解决Standby备库的连接认证问题
日志里的ERROR: 认证失败和无效的认证消息响应类型,期望接收'R',实际收到'E'是关键——这说明Pgpool作为客户端连接备库时,备库直接返回了错误响应,拒绝了连接。
1. 先手动验证基础连通性
在Pgpool所在服务器上,直接用psql尝试连接备库,确认备库本身是否允许外部连接:
psql -h 192.168.2.104 -U postgres -p 5432
输入密码P0stgres,如果连不上,问题出在PostgreSQL备库的配置,而非Pgpool:
- 检查备库的
pg_hba.conf:必须添加允许Pgpool服务器IP连接的规则,比如:
添加后执行host all postgres <Pgpool服务器IP>/32 md5pg_ctl -D /var/lib/pgsql/9.4/data reload生效。 - 检查备库的
postgresql.conf:确保listen_addresses = '*'(或包含Pgpool的IP),允许远程连接;同时确认password_encryption = on(9.4默认开启,保证密码是MD5加密格式)。 - 防火墙/SELinux检查:备库的防火墙要开放5432端口;如果是CentOS/RHEL系统,临时关闭SELinux测试:
setenforce 0,如果能连上,再永久配置SELinux规则:setsebool -P postgresql_can_network_connect on。
如果手动psql能连上备库,再看Pgpool的配置:
2. 确认Pgpool的健康检查配置
你的pgpool.conf里health_check_user = 'postgres'和health_check_password = 'P0stgres'是正确的,但要确保备库的postgres用户密码和主库完全一致(流式复制会同步pg_authid表,正常情况下是一致的,但如果主库后来改了密码,备库没同步的话需要手动更新)。
另外,确认master_slave_sub_mode = 'stream'配置正确,这个是适配PostgreSQL内置流式复制的必要设置。
二、修复故障切换脚本的参数缺失问题
日志提到“执行故障切换脚本时因参数缺失而挂起”,你的failover_command已经传递了%d %P %H %R四个参数,需要确保脚本正确接收并使用这些参数:
1. 检查脚本的参数接收逻辑
对应Pgpool 3.4.3的参数定义:
%d: 故障节点的ID%P: 旧主节点的ID%H: 新主节点的主机名%R: 新主节点的端口
一个简单的示例脚本可以是这样:
#!/bin/bash FAILED_NODE=$1 OLD_PRIMARY=$2 NEW_PRIMARY_HOST=$3 NEW_PRIMARY_PORT=$4 # 提升备库为主库 ssh $NEW_PRIMARY_HOST "pg_ctl -D /var/lib/pgsql/9.4/data promote" # 通知Pgpool重新连接故障节点(如果需要) pcp_attach_node -h localhost -p 9898 -U postgres $FAILED_NODE
2. 确保脚本权限与依赖
- 给脚本添加执行权限:
chmod +x /var/lib/pgsql/9.4/failover.sh - 确保Pgpool运行用户(通常是postgres)能免密SSH登录到备库,否则
ssh命令会卡住等待输入密码;或者如果备库和Pgpool在同一机器,直接执行本地命令即可。 - 确认
pcp.conf里配置了postgres用户的密码,因为pcp_attach_node需要认证。
三、验证主备切换后的一致性
你提到切换Master和Standby后,新的Standby仍无法连接,这说明问题不是特定服务器的硬件/系统问题,而是配置层面的通用问题——只要解决了上述认证和脚本问题,这个现象自然会消失。
内容的提问来源于stack exchange,提问作者Viettel Solutions

