pgbouncer需单独安装,生产环境禁用trust认证且必须正确生成userlist.txt密码哈希;centos/rhel/almalinux/rocky 9推荐yum安装pgbouncer15,配置需显式定义[databases]、设auth_type为md5或scram-sha-256、选transaction池模式,并严格校验用户密码哈希格式与权限。

PgBouncer 不是 PostgreSQL 自带组件,必须单独安装;生产环境别直接用 trust 认证,也别跳过 userlist.txt 密码哈希步骤——否则连不上或被扫库。
怎么装 PgBouncer(CentOS/RHEL/AlmaLinux/Rocky 9)
YUM 安装最稳,源码编译只在需要定制 libevent 或打补丁时才用。当前主流发行版都已支持 pgbouncer15 包(适配 PostgreSQL 15+):
- 先装 PG 官方 YUM 源(若未装):
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm - 再装 PgBouncer:
sudo yum install -y pgbouncer15 - 验证:
pgbouncer --version应输出类似pgbouncer 1.21.0 - 配置文件默认在
/etc/pgbouncer/pgbouncer.ini,日志目录为/var/log/pgbouncer/
注意:CentOS 7 已 EOL,Rocky Linux 9 / AlmaLinux 9 是当前推荐基线,pgbouncer15 在这些系统上开箱即用。
关键配置项怎么设(pgbouncer.ini 核心段)
不改默认值就跑,大概率连不上、卡死或被绕过认证。重点调这三块:
-
[databases]段必须显式声明目标库,不能只靠*=...通配(尤其生产有多个库时):myapp = host=10.10.20.5 port=5432 dbname=myapp user=appuser -
[pgbouncer]中的auth_type生产必须是md5或scram-sha-256,绝不能是trust;auth_file必须指向/etc/pgbouncer/userlist.txt -
pool_mode选型直接影响行为:
—session:客户端连上来就占一个后端连接,直到断开(兼容性最好,但池子易耗尽)
—transaction:每个事务用一个连接,事务结束立刻归还(推荐 HTTP 短请求场景,吞吐高)
—statement:不支持事务,极少用,别碰
典型生产参数示例:max_client_conn = 1000default_pool_size = 20reserve_pool_size = 5log_connections = 1log_disconnections = 1
用户密码怎么配进 userlist.txt
这个文件不是明文存密码,而是存 MD5 哈希(格式:"username" "md5xxx..."),漏掉引号或哈希错一位都会认证失败:
- 生成哈希命令(注意
-n和拼接顺序):echo -n 'mypasswordmyuser' | md5sum | cut -d' ' -f1 - 写入文件:
echo '"myuser" "md5c1a5e7f9b3d2e1a0c4f5b6d7e8f9a0b1"' | sudo tee /etc/pgbouncer/userlist.txt - 权限必须收紧:
sudo chmod 600 /etc/pgbouncer/userlist.txt,否则 PgBouncer 启动报错 - PostgreSQL 用户需真实存在且有对应库访问权限,PgBouncer 不做权限代理,只做连接转发
启动后怎么验证和日常管理
启动服务只是第一步,没验证等于没配好:
- 启动:
sudo systemctl start pgbouncer,检查状态:sudo systemctl status pgbouncer - 连管理端口查实时状态:
psql -p 6432 -U pgbouncer pgbouncer(用户名必须是userlist.txt里有的) - 常用命令:
SHOW POOLS;— 看各库连接分配情况SHOW CLIENTS;— 查当前谁连着、空闲还是活跃SHOW SERVERS;— 看后端 PostgreSQL 连接是否建成功 - 改配置后 reload:
sudo pgbouncer -R /etc/pgbouncer/pgbouncer.ini(不是 restart,避免连接中断)
最容易忽略的是:应用连接字符串里的 host 要从 PostgreSQL 地址换成 PgBouncer 地址(比如 host=localhost port=6432),且用户名密码必须和 userlist.txt 一致——这里错一个字符,应用就报 password authentication failed,但日志里可能只写 login failed,得翻 /var/log/pgbouncer/pgbouncer.log 才能定位。











