libpq多IP主机搭配target_session_attrs=primary的连接异常咨询
问题分析与解决方案
1. 检查PostgreSQL客户端版本
target_session_attrs参数是PostgreSQL 10版本引入的,如果你的psql客户端版本低于10,这个参数会被客户端直接忽略,导致客户端只会连接DNS返回的第一个IP——如果该IP对应备库,就会触发"hot standby mode"错误。
验证命令:
psql --version
若版本低于10,需将客户端升级至10及以上版本。
2. 确认DNS解析返回完整的IP列表
检查共用主机名myapphost.home.network的解析结果,确保同时返回主备两个节点的IP:
验证命令:
nslookup myapphost.home.network # 或用dig工具 dig myapphost.home.network
如果只返回单个IP,需要修正DNS配置,确保两个节点的IP都被正确解析。
3. 验证主备切换后的节点状态
手动切换角色后,分别在两个节点上执行以下SQL,确认主库的pg_is_in_recovery()返回false,备库返回true:
SELECT pg_is_in_recovery();
如果切换后目标主库仍返回true,说明repmanager的角色切换未成功完成,需要检查repmanager的切换日志,排查切换失败原因。
4. 绕过DNS直接指定多节点测试
可以在连接串中显式指定两个节点的IP,排除DNS解析的影响:
psql "host=192.168.0.2,192.168.0.3 dbname=appdb sslmode=require target_session_attrs=primary"
如果这个连接串能正常连接到主库,说明问题出在DNS解析或客户端对DNS多IP的处理逻辑上。
5. 刷新客户端DNS缓存
若客户端缓存了旧的DNS记录,可能导致只解析到单个IP:
- Linux:重启
systemd-resolved服务,或清除本地hosts缓存 - Windows:执行命令
ipconfig /flushdns - macOS:执行命令
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
6. 检查连接串参数拼写
确认target_session_attrs=primary无拼写错误(比如遗漏末尾的s),错误的参数会被客户端忽略,无法触发主库筛选逻辑。
内容的提问来源于stack exchange,提问作者Sameer M. Deshpande
相关产品推荐
相关产品推荐

