postgresql pgsql 连接池 pgBouncer(详细)

适用连接池可以有效的降低反复连接造成的损耗
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

安装完成后提示相关文件位置如下:
postgresql pgsql 连接池 pgBouncer(详细)_第1张图片

二、模式和原理

(一)会话模式

实际使用第二级的比较多

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

postgresql pgsql 连接池 pgBouncer(详细)_第2张图片

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数据库
只需要修改连接地址即可,无需调整后端逻辑(除非变成第三种模式,不推荐)

你可能感兴趣的:(数据库,postgresql,数据库)