适用连接池可以有效的降低反复连接造成的损耗
2023.9.28更新,演示:1.20.1版本
没有安装pgsql的可以参考:pgsql编译安装
一、编译安装
包安装更简单,就是不能选版本
1.pgBouncer下载地址
链接:github项目地址
链接:pgbouncer官网
2.下载
进入目录
cd /usr/local
官网下载
wget https://www.pgbouncer.org/downloads/files/1.20.1/pgbouncer-1.20.1.tar.gz
或者
github下载
wget https://github.com/pgbouncer/pgbouncer/releases/download/pgbouncer_1_20_1/pgbouncer-1.20.1.tar.gz
3.解压
tar -zxvf pgbouncer-1.20.1.tar.gz && cd pgbouncer-1.20.1
4.依赖安装
apt-get install libevent-dev libsystemd-dev
5.编译安装
更多参数参考官方文档:官方文档
./configure --prefix=/usr/local --with-systemd --with-pam
make && make install
安装完成后提示相关文件位置如下:
二、模式和原理
(一)会话模式
实际使用第二级的比较多
1.Session pooling/会话连接池
这种方式和不用连接池差不多,效果不明显
session,会话级连接,在客户端连接的生命周期内,连接池分配一个连接给它,直到客户端断开连接,分配的连接才会回到连接池中。
2.Transaction pooling/事务连接池(推荐)
服务器连接只有在一个事务里的时候才赋予客户端。在 PgBouncer 注意到事务结束的时候,服务器将会放回连接池中。这是一个 hack,因为它打破了应用对后段连接的看法。只有在应用配合这样的使用模式,没有使用会破坏这种使用模式的时候才能用这个连接方式。参阅下标获取会破坏 这种模式的特性。
3.Statement pooling/语句连接池
最激进的模式。这是事务连接池的一个扭曲的变种 - 不允许多语句的事务。这就意味着是在客户端强制“autocomit”模式,主要是给 PL/Proxy 用的。
三、配置、管理
(一)配置文件
1.建立配置文件
个人习惯将配置文件存放到/etc目录下
mkdir /etc/pgbouncer
复制配置文件
cp /usr/local/share/doc/pgbouncer/pgbouncer.ini /etc/pgbouncer
2.创建需要的目录
创建日志目录和日志文件
mkdir -p /var/pgbouncer
移交所有权给postgres用户(linux的pgsql,习惯上用这个用户)
chown postgres:postgres /var/pgbouncer
3.编辑配置文件
vi /etc/pgbouncer/pgbouncer.ini
添加数据库连接[database]下
账号密码是pgsql的账号密码,用于连接已有的pgsql数据库
这里的最前面的名称main_pg,就是关联的后面的源数据库的postgres库,连接时用main_pg作为虚拟的数据库,代替后面的localhost:5432的postgres数据库,相当于一个别名,到时候连接的时候就连接这个main_pg虚拟的数据库
main_pg = host=localhost port=5432 dbname=postgres user=postgres password=abc123456
修改log和pid地址
允许外部访问
listen_addr = *
修改admin_users
如果没有认证,这个参数就失效了
admin_users = postgres
修改每个池最大连接数
找到max_client_conn,修改为1000,删除前面的;
max_client_conn = 1000
修改连接池数
找到default_pool_size ,修改为200,删除前面的;
default_pool_size = 200
修改连接池模式
找到pool_mode = session,修改为下面的,并删除前面的;
pool_mode = transaction
设置ignore_startup
删除前面的;
ignore_startup_parameters = extra_float_digits
(二)连接文件配置
1.复制认证文件
cp /usr/local/share/doc/pgbouncer/userlist.txt /etc/pgbouncer
2.编辑数据库账号密码文件
vi /etc/pgbouncer/userlist.txt
改成类似如下的形式,前面是pgsql的用户名,postgres是默认的账号名,密码为明文密码,
形如以下部分
"postgres" "abc123456"
这个密码是连接pgbouncer的密码,可以和pgsql源库的密码不一致,这样也是相当于多了一层保护
(三)systemctl管理
1.复制systemctl文件
cp /usr/local/share/doc/pgbouncer/pgbouncer.service /lib/systemd/system
2.编辑文件
vi /lib/systemd/system/pgbouncer.service
修改ExecStart地址(编译完成后会提示)
按照我的目录是/usr/local/bin
3.启动程序
systemctl daemon-reload && systemctl start pgbouncer
4.查看状态
systemctl status pgbouncer
(四)连接测试
1.进入pgBouncer的psql
su postgres
psql -p 6432 pgbouncer
密码为上面设定的连接文件里的密码
2.pgbouncer自带的命令
显示所有配置
show config;
显示所有客户连接
show clients;
显示所有的源数据库
show servers;
四、使用
1.连接原理
使用psql连接pgbouncer的main_pg数据库(pgbouncer此时连接main_pg的源数据库)
通过这种方式实现了pgsql的池。
psql -h localhost -p 6432 -U postgres -d main_pg
此时在源数据库中输入命令即可查询到pgbouncer的连接
select * from pg_stat_activity;
2.后端程序中调用
在这个案例中,后端连接6432端口的main_pg数据库,即可对应原来的5432端口的postgres数据库
只需要修改连接地址即可,无需调整后端逻辑(除非变成第三种模式,不推荐)