如何在Pgpool中自动将故障主节点恢复为备节点?
Pgpool双节点故障恢复后主节点自动转备的配置步骤
一、配置pgpool.conf核心参数
编辑pgpool.conf,根据实际环境调整以下关键参数:
- 启用主从模式:
master_slave_mode = on master_slave_sub_mode = stream - 配置恢复用户及脚本路径:
recovery_user = 'recovery' # 需提前在PostgreSQL中创建该用户 recovery_password = 'recovery_pass' # 推荐用.pgpass免密替代明文密码 recovery_1st_stage_command = '/etc/pgpool/recovery_1st_stage' # 自定义恢复脚本路径 - 确保故障转移命令能记录当前主节点信息(方便恢复脚本读取):
failover_command = '/etc/pgpool/failover_script %d %h %p %D %m %H %M %P'
二、编写第一阶段恢复脚本(recovery_1st_stage)
创建脚本文件/etc/pgpool/recovery_1st_stage,执行chmod +x /etc/pgpool/recovery_1st_stage赋予权限,脚本示例如下(需替换为你的环境路径、服务名等):
#!/bin/bash # 停止恢复节点的PostgreSQL服务 systemctl stop postgresql-14 # 备份并清空旧数据目录 mv /var/lib/pgsql/14/data /var/lib/pgsql/14/data_backup_$(date +%Y%m%d%H%M) mkdir -p /var/lib/pgsql/14/data # 读取故障转移后记录的当前主节点地址(需在failover脚本中实现写入逻辑) MASTER_HOST=$(cat /var/lib/pgpool/current_master) # 从当前主节点拉取基础备份 pg_basebackup -h $MASTER_HOST -U recovery -p 5432 -D /var/lib/pgsql/14/data -Fp -Xs -P # 配置备节点参数 cat >> /var/lib/pgsql/14/data/postgresql.conf << EOF hot_standby = on primary_conninfo = 'host=$MASTER_HOST port=5432 user=recovery password=recovery_pass' EOF # 创建standby标记文件 touch /var/lib/pgsql/14/data/standby.signal # 修复数据目录权限 chown -R postgres:postgres /var/lib/pgsql/14/data # 启动PostgreSQL服务 systemctl start postgresql-14 # 通知Pgpool节点已恢复 pcp_attach_node -h localhost -U pgpool -p 9898 -n 0 # 0为恢复节点的序号,按需修改
三、配置权限与免密登录
- 创建PostgreSQL恢复用户:
在主节点执行SQL:
CREATE USER recovery WITH REPLICATION LOGIN PASSWORD 'recovery_pass';
- 配置pg_hba.conf:
在主备节点的pg_hba.conf中添加连接规则:
host replication recovery <pgpool_ip>/32 scram-sha-256 host all pgpool <pgpool_ip>/32 scram-sha-256
重启PostgreSQL使配置生效。
3. 配置.pgpass免密:
在Pgpool运行用户(如pgpool)的家目录创建.pgpass文件:
*:5432:*:recovery:recovery_pass *:9898:*:pgpool:pgpool_pass
设置权限:chmod 600 ~/.pgpass
四、测试验证
- 手动停止原主节点的PostgreSQL服务,查看Pgpool日志确认备节点成功升为主节点。
- 启动原主节点服务,验证恢复流程:
- 执行
psql -h <原主节点IP> -U postgres -c "SELECT pg_is_in_recovery();",返回true则说明已转为备节点。 - 用
pcp_node_info -h localhost -U pgpool -p 9898查看节点状态,确认原主节点状态为up且角色为standby。
- 执行
内容的提问来源于stack exchange,提问作者Pomme
相关产品推荐
相关产品推荐

