pgbouncer
在微服务架构中,每个微服务提供一项功能逻辑的处理,他们之间通过API交互,一般每个微服务或多或少需要与数据库交互,每个微服务配置了DAO连接池。如果后端微服务较多,数据库上默认创建的连接数量就有可能太多(微服务熟练×连接池配置的连接数量)。微服务的增加也会导致数据库的连接的增加,即便大多数情况连接池空闲,也会导致数据库端占用资源过多。
将连接池的配置迁移到数据库端统一管理,pgbouncer是postgreSQL的轻量级连接池管理工具,可以有效提高连接的利用率,避免过多无效连接占用资源过多的情况,同时也能对客户端连接进行限制,避免过多连接或恶意请求。
service1 -----> postgre <----- service3
^
|
service2
service1 ----->
service2 -----> pgbouncer -----> postgre
service3 ----->
pg是多进程结构,每增加一个session,pg会创建一个新建进程去处理会话,而pgbouncer能够预先缓存pg的连接,当有连接请求进来的时候,直接分配pgbouncer与pg之间的空闲连接去执行,而不需要pg创建新的连接,以节省创建新的进程所消耗的时间和资源。
另外pgbouncer是使用libevent进行socket通信,效率高,开销小,每个连接仅占用2kB内存。
pgbouncer支持三种连接池模式:
- session:这种模式和本质上直接与pg连接的方式基本一致。
- transaction:最常用的模式,一个连接的通道时分被事务所使用,当客户端发出事务请求后,pgbouncer会在与数据库之间的连接中找到一个连接是idle的去执行,当事务完成后,连接将重新被pgbouncer交给其他新事务去使用。
- sql:类似于autoconmiit,粒度较细,一条sql执行完就释放连接,这条连接可能会被其他会话占用掉,这种方式比较节约资源,但破坏了事务的逻辑,需要评估应用系统中是否需要事务连接。
pgbouncer的使用
# 安装
# centos7
yum install -y openssl openssl-devel libevent libevent-devel
wget http://www.pgbouncer.org/downloads/files/1.20.0/pgbouncer-1.20.0.tar.gz
tar -zxvf pgbouncer-1.20.0.tar.gz
cd pgbouncer-1.20.0
./configure --prefix=/usr/local/
make && make install
# 配置
mkdir -p /etc/pgbouncer
vi /etc/pgbouncer/pgbouncer.ini
[databases]
template1 = host=10.150.57.9 port=5432 dbname=postgres user=postgres
[pgbouncer]
listen_port = 6432
listen_addr = 10.150.57.9
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
logfile = /etc/pgbouncer/pgbouncer.log
pidfile = /etc/pgbouncer/pgbouncer.pid
admin_users = postgres
stats_users = pgmon
server_reset_query = DISCARD ALL
server_check_query = select 1
server_check_delay = 30
max_client_conn = 5000
default_pool_size = 20
reserve_pool_size = 5
dns_max_ttl = 15
vi /etc/pgbouncer/userlist.txt
"postgres" "Psswd@123"
"gaoyu" "Passwd@123"
# 启动
pgbouncer -d /etc/pgbouncer/pgbouncer.ini
# 使用
psql -h 10.150.57.9 -p 6432 -U postgres template1