PgBouncer持续出现IPv6本地连接失败警告的解决求助
PostgreSQL与PgBouncer连接警告问题排查与解决
问题描述
初始问题
使用PostgreSQL 12和PgBouncer 1.22-1时,pgbouncer.log里一直弹出这个警告:
WARNING sbuf_connect failed to connect to [::1]:5432: No route to host
我的PgBouncer databases配置是这样的:
* = host=localhost port=5432
而且/etc/hosts里已经把127.0.0.1和[::1]都映射到localhost了。想知道为啥PgBouncer非要用IPv6连PostgreSQL,怎么消掉这个警告?
更新排查结果
后来发现问题出在PostgreSQL没监听::1地址。我pg_hba.conf里明明加了这行配置:
host all all ::1/128 trust
但用psql --host ::1连PostgreSQL的时候,还是报错:
Is the server running on host "::1" and accepting TCP/IP connections on port 5432?
原因分析
为啥PgBouncer优先用IPv6?因为系统DNS解析时,会把localhost对应的IPv6地址(::1)排在IPv4(127.0.0.1)前面。PgBouncer解析localhost时,会先试第一个返回的地址也就是::1,可PostgreSQL没监听这个地址,自然连不上就出警告了。
解决办法
两种方案选一个就行:
方案1:让PostgreSQL开启IPv6监听
- 打开PostgreSQL的配置文件
postgresql.conf - 找到
listen_addresses参数,改成包含::1的地址,比如:listen_addresses = 'localhost, ::1' # 也可以直接设为'*'监听所有地址,根据自己的安全需求选 - 重启PostgreSQL服务,配置就生效了
- 验证一下:用
psql --host ::1测试连接,能连上就没问题
方案2:强制PgBouncer用IPv4连接
- 打开PgBouncer的配置文件(一般是
pgbouncer.ini) - 修改databases段的host参数,直接写IPv4地址127.0.0.1,别用localhost:
* = host=127.0.0.1 port=5432 - 重启PgBouncer服务,之后日志里的IPv6连接警告就没了
内容的提问来源于stack exchange,提问作者leas
相关产品推荐
相关产品推荐

