使用pcp_recovery_node配置PostgreSQL 14备节点时数据丢失且命令挂起
问题排查与解决建议
核心问题定位方向
- PCP命令认证与通信阻塞
pcp_recovery_node挂起大概率是节点间PCP通信出现认证阻塞,主节点持续打印“Password:.”说明其在反复发起认证请求,但备节点或VIP路由的认证流程异常。- 检查
pgpool.conf中pcp_socket_dir的权限,确保postgres用户可读写;同时确认pcp.conf内的密码哈希正确(需用pg_md5生成,格式为username:md5hash),且所有节点的pcp.conf内容一致。
- 备节点$PGDATA丢失根源
pcp_recovery_node会触发备节点的基础备份恢复流程,若备份拉取过程中断,可能导致原有$PGDATA被清理后新数据未写入,最终全部丢失。- 检查备节点
pg_hba.conf,确认主节点到备节点的复制连接(replication用户)是否允许正确认证;查看备节点postgresql日志(pg_log目录),恢复过程的报错会被记录在此。
- VIP路由异常
- 执行PCP命令时指定了VIP(
-h vip-p),若VIP的ARP缓存异常,可能导致PCP请求路由错误,引发通信阻塞。尝试直接用备节点真实IP执行pcp_recovery_node,观察是否仍挂起。
- 执行PCP命令时指定了VIP(
分步排查操作
- 检查PCP配置正确性
在所有节点执行:
确保密码哈希是cat /etc/pgpool-II/pcp.conf | grep postgrespg_md5 'yourpassword'生成的正确值,且各节点配置一致。 - 查看备节点恢复日志
进入备节点$PGDATA/pg_log目录,查看最新日志文件,搜索recovery、backup关键词,定位是否有备份拉取失败、权限不足等报错。 - 验证节点间复制连接
在主节点执行:
若需输入密码或连接失败,说明psql -h <备节点真实IP> -U <复制用户> -d postgres -c "select 1"pg_hba.conf或复制用户配置存在问题,调整后再测试。 - 绕过VIP执行PCP命令
直接指定备节点真实IP执行:
若命令正常执行,说明VIP网络路由存在问题,需检查集群VIP绑定脚本或网络配置。pcp_recovery_node -h <备节点真实IP> -p 9898 -U postgres -n 2
临时恢复备节点方法
若备节点$PGDATA已丢失,可手动触发基础备份恢复:
- 在备节点创建空的$PGDATA目录并设置权限:
mkdir -p /var/lib/postgresql/14/main chown -R postgres:postgres /var/lib/postgresql/14/main - 切换至postgres用户,拉取主节点基础备份:
su - postgres pg_basebackup -h <主节点IP> -U <复制用户> -D /var/lib/postgresql/14/main -P -X stream - 配置备节点参数:
echo "primary_conninfo = 'host=<主节点IP> port=5432 user=<复制用户> password=<密码>'" >> /var/lib/postgresql/14/main/postgresql.conf echo "standby_mode = 'on'" >> /var/lib/postgresql/14/main/postgresql.conf - 启动备节点:
pg_ctl start -D /var/lib/postgresql/14/main
内容的提问来源于stack exchange,提问作者Remco Dhaenen
相关产品推荐
相关产品推荐

