pgbouncer 是PostgreSQL数据库的一个轻量连接池,客户端连接pgbouncer可以像直接数据库服务端一样使用,其作用是减少业务频繁创建短链接对数据库服务器资源消耗及性能影响。
连接池管理
pgbouncer有三种管理数据库连接的方式,分别是session pooling、transaction pooling和Statement pooling,默认是session pooling。
- session pooling(最礼貌的方法):当客户端连接的整个时间段内,将保持连接的整个持续时间内为其分配服务器连接,直到客户端断开连接后,服务器连接将放回池中。此模式支持所有PostgeSQL功能。
- transaction pooling:服务器连接仅在事务期间分配给客户端,事物结束后将被放回池中。这种模式破坏了PostgreSQL的一些基于会话的功能。仅当应用程序通过不使用中断的功能进行协作时,才能使用它。
- Statement pooling(最激进的方法):这是带有转折的事务池:查询完成后,服务器连接将立即放回池中,所以不允许多语句事务。这是为了在客户端上强制实施“自动提交”模式,主要针对PL / Pr代理

权限认证
PgBouncer 有自己的客户端身份验证方式,并且可以设置自己的用户数据库,验证方式可以通过设置配置文件中的auth_type参数来设置,支持cert、md5、scram-sha-256、plain、trust、any、pam 和hba 几种方式,默认参数是md5;md5、scram-sha-256、plain、trust、any、pam 这几种方式需要配合auth_file参数使用,而hba需要配合auth_hba_file参数使用。
控制台管理
pgbouncer 提供了一个控制台,可以在配置文件中通过参数admin_users设置管理员用户来执行所有命令,也可以通过参数stats_users设置一些用户来控制台执行只读查询,如果设置auth_type=any则表示任何用户都可以登录console。
可以执行psql -p port pgbouncer 命令访问控制台,其中pgbouncer为访问控制台指定的数据库,访问数据库的用户必须是在配置文件中admin_users or stats_users参数设置的,如果使用pgbouncer用户可以免密码访问,控制台目前仅支持简单的查询协议。
程序管理
pgbouncer支持后台运行程序,支持在线重启,当配置文件修改后还支持reload。
启动
pgbouncer -d pgbouncer.ini
重启
pgbouncer -d -R pgbouncer.ini
加载
--先登陆控制台
psql -p port pgbouncer
--再执行加载命令
pgbouncer=# reload;
安装部署
pgbouncer 可以单独部署,也可以和PostgreSQL数据库安装部署放到同一台服务器上,但在生产环境中分开部署会多一些。
安装系统依赖包
GNU Make 3.81+
Libevent 2.0+
pkg-config
OpenSSL 1.0.1+ for TLS support
yum -y install make make-devel libevent libevent-devel pkgconfig pkgconfig-devel openssl openssl-devel
下载并编译安装
--下载源码包,这里以1.18为例
wget https://www.pgbouncer.org/downloads/files/1.18.0/pgbouncer-1.18.0.tar.gz
--解压
tar -zxvf pgbouncer-1.18.0.tar.gz && cd pgbouncer-1.18.0
--编译安装
./configure --prefix=/opt/pgbouncer
make && make install
编辑配置文件
--配置文件模版在 /opt/pgbouncer/share/doc/pgbouncer 目录下
# cat pgbouncer.ini
[databases]
* = host=192.168.xxx.xxx port=5432 pool_size=20
[pgbouncer]
logfile = /opt/pgbouncer/log/pgbouncer.log
pidfile = /opt/pgbouncer/pgbouncer.pid
listen_addr = *
listen_port = 16432
auth_type = md5
auth_file = /opt/pgbouncer/userlist.txt
admin_users = postgres
stats_users = stats, root
pool_mode = session
server_reset_query = DISCARD ALL
server_check_query = select 1
max_client_conn = 3000
default_pool_size = 50
min_pool_size = 10
reserve_pool_size = 10
reserve_pool_timeout = 5
max_db_connections = 100
max_user_connections = 100
编辑auth_file
"u1" "u1@12345"
"u2" "u2@12345"
"postgres" "postgres"
启动并访问数据库
--以后台运行的方式启动
/opt/pgbouncer/bin/pgbouncer -d /opt/pgbouncer/pgbouncer.ini
--登录控制台
$ psql -p 16432 pgbouncer pgbouncer
psql (15.0, server 1.18.0/bouncer)
WARNING: psql major version 15, server major version 1.18.
Some psql features might not work.
Type "help" for help.
pgbouncer=# show help;
NOTICE: Console usage
DETAIL:
SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|USERS|VERSION
SHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM
SHOW DNS_HOSTS|DNS_ZONES
SHOW STATS|STATS_TOTALS|STATS_AVERAGES|TOTALS
SET key = arg
RELOAD
PAUSE [<db>]
RESUME [<db>]
DISABLE <db>
ENABLE <db>
RECONNECT [<db>]
KILL <db>
SUSPEND
SHUTDOWN
WAIT_CLOSE [<db>]
SHOW
--登录数据库
$ psql -p 16432 postgres
Password for user postgres:
psql (15.0)
Type "help" for help.
postgres=# select version();
version
---------------------------------------------------------------------------------------------------------
PostgreSQL 15.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
(1 row)
postgres=#
问题汇总
查看客户端ip
通过pgbouncer连接数据库后,从数据库的pg_stat_activity视图看到的client_addr都是pgbouncer的地址,看不到真实的业务ip,在运维方面不够方便,需要去pgbouncer控制台通过show clients语句(psql -p 16432 pgbouncer pgbouncer -c “show clients”)查看客户端的真实映射关系,可以考虑将其添加到监控里。
prepared 语句支持
session连接池模式可以支持prepared;
transaction 连接池模式不支持prepared,常会遇见‘prepared statement “S_1” already exists’报错。
若要禁用prepare,可以在程序端介入:
JDBC 增加 prepareThreshold=0 参数;
PDO 属性 PDO::ATTR_EMULATE_PREPARES 设置为 true




