什么是pgbouncer
PgBouncer是PostgreSQL的数据库提供的一个轻量级连接池工具,PgBouncer在数据库和应用端建立连接,由PgBouncer处理与后端数据库连接关系。
通过对应用端的连接限流,减少对数据库的连接请求,避免恶意连接。其工作是每一个数据节点对数据的存取,pgbouncer只是提供给客户端数据节点的
分配和链接以及限制客户端连接的数量。整体上实现了对数据的负载均衡。能够缓存和PostgreSQL的连接,当有连接请求进来的时候,直接分配空闲进程,
而不需要PostgreSQL fork出新进程来建立连接,以节省创建新进程,创建连接的资源消耗。能够有效提高连接的利用率,避免过多的无效连接,导致数据库消耗资源过大,CPU占用过高。
目前支持以下3中连接池模型:
Session:会话级别,在session生命周期内,连接池分配给该会话一个数据库连接,断开会话后,数据库连接会放回连接池中;
Transaction:事务级别,开启一个事务,从连接池中获取一个连接,事务结束后,连接会释放到连接池中;
Statement:语句级别,执行一个SQL,开启一个连接,SQL执行完成,连接会释放到连接池中。
Pgbouncer的优劣势
优点
连接数利用率提高
由于PostgreSQL是进程模型,连接数也是很宝贵的资源,当连接长时间空闲时, 可以释放掉,只保留部分连接即可,一定程度上提高了连接的利用率(主要表现为idle的数量减少)。降低高并发对PostgreSQL的冲击
客户端无连接池或弱连接池(php 或 python 脚本等,Pgbouncer 可以提供一个轻量级连接池,应用与pgbouncer建立连接的开销远小于直接与DB建立的开销, 一定程度上可以提高数据库的响应时间(主要表现为缓解大量连接时降低load)。
缺点
- 需要对Pgbouncer进行额外的监控和维护成本.
PostgreSQL 14版本对大量连接做了优化,如果不想额外维护Pgbouncer, 又有大量连接数,升级PostgreSQL 14是一个不错的选择。
Pgbouncer安装
编译Pgbouncer需要提前安装如下依赖包:
| 依赖包 | 版本 | 必选 |
|---|---|---|
| GNU Make | 3.81+ | 是 |
| Libevent | 2.0+ | 是 |
| pkg-config | 是 | |
| OpenSSL for TLS support | 1.0.1+ | 是 |
| c-ares | 否 | |
| PAM libraries | 否 |
下载
Pgbouncer对应的下载地址为 https://github.com/pgbouncer/pgbouncer , 通常选择最新一个版本即可。
1 | |
解压
1 | |
configure选项
除了常规选项,主要有如下可选内容:
1 | |
通常情况下只需要选择默认方式, 定制安装路径即可:
1 | |
输出如下:
1 | |
编译 && 安装
只需执行make即可完成源码编译。
1 | |
输出如下:
1 | |
执行make install 即可完成安装:
1 | |
输出如下:
1 | |
配置
新建配置文件和日志保留路径
1 | |
拷贝默认配置文件pgbouncer.ini,userlist.txt到新建配置文件路径下:
1 | |
按需求修改配置pgbouncer.ini, 主要参数如下:
1 | |
用户密码userlist.txt配置文件修改:
1 | |
需要注意的是如果database配置选项中没有配置数据库用户密码时,要求userlist.txt中对应的帐号密码与数据库中的保持一致。
启动
加上选项 -d ,以后台方式运行Pgbouncer
1 | |
重新加载(reload)
当修改了某些参数时如pool_size等时,不需要重新启动Pgbouncer,只需reload即可, 只需增加选项 -R 即可,完整命令如下:
1 | |
输出如下:
1 | |
Pgbouncer三种pool_mode下的测试
| 连接池模式 | 连接数 | 协议 | tps |
|---|---|---|---|
| session 模式 | 100 | simple | |
| session 模式 | 500 | simple | |
| session 模式 | 1000 | simple | |
| session 模式 | 100 | prepared | |
| session 模式 | 500 | prepared | |
| session 模式 | 1000 | prepared | |
| transaction | 100 | simple | |
| transaction | 500 | simple | |
| transaction | 1000 | simple | |
| transaction | 100 | prepared | |
| transaction | 500 | prepared | |
| transaction | 1000 | prepared | |
| statement | 100 | simple | |
| statement | 500 | simple | |
| statement | 1000 | simple | |
| statement | 100 | prepared | |
| statement | 500 | prepared | |
| statement | 1000 | prepared |
1 | |


