pgbouncer 是一个 PostgreSQL 连接池。任何目标应用程序都可以像连接 PostgreSQL 服务器一样连接到pgbouncer,并且 pgbouncer 将创建到实际服务器的连接,或者重用其现有的连接。pgbouncer 的目的是降低打开新连接到 PostgreSQL 的性能影响。
PostgreSQL允许我们通过参数max_connections来控制最大连接数 ,但是如果为前端应用的每次请求都分配一个新的DB连接,那么DB服务端可能在链接风暴到来时需要一次性提供大量的连接插槽,这会严重消耗服务端的内存,并且会导致性能急剧下降。
在高并发请求的应用场景,为了保护DB,取而代之的我们可以利用连接池的连接复用特性,来避免DB被突然到来的连接洪峰淹没。这样,当应用程序一次性发送成千上万个查询的时候,如果超过了DB的处理能力,请求将在会连接池中排队,而不会导致后端PostgreSQL崩溃。
与突然分配大量DB连接相比,这种在连接池中配置固定数量的连接处理来接收请求,查询的性能要好得多。另外,客户端的连接非常轻巧,除了文件描述符外基本没有其他消耗。但我们服务端连接却很重,需要适当配置。用较少的服务器连接来支持大量的客户端连接,是我们在PostgreSQL使用pgouncer的主要用
能够缓存和PostgreSQL的连接,当有连接请求进来的时候,直接分配空闲进程,而不需要PostgreSQL fork出新进程来建立连接,以节省创建新进程,创建连接的资源消耗。
能够有效提高连接的利用率,避免过多的无效连接,导致数据库消耗资源过大,CPU占用过高。
对客户端连接进行限制,预防过多或恶意的连接请求。
C语言编写,效率高,内存消耗低(默认为2k/连接),因为Bouncer不需要每次都接受完整的数据包
可以把不同的数据库连接到一个机器上,而对客户端保持透明
支持在线的重新配置而无须重启
仅支持V3协议,因此后端版本须>=7.4
使用libevent进行socket通信,通信效率高。
http://www.pgbouncer.org/downloads/
GNU Make 3.81+
Libevent 2.0+
pkg-config
OpenSSL 1.0.1+ for TLS support
(optional) c-ares as alternative to Libevent’s evdns
(optional) PAM libraries
yum install -y libevent libevent-devel
yum install -y openssl-devel
/configure --prefix=/usr/local/pgbouncer
* 如果 openssl 安装失败,可以不带 openssl 选项
/configure --prefix=/usr/local/pgbouncer --without-openssl
make && make install
echo 'export PATH=/usr/local/pgbouncer/bin:$PATH' >>/etc/profile
source /etc/profile
[root@localhost pgbouncer-1.17.0]# pgbouncer -V
pgbouncer: /usr/local/lib/libssl.so.10: no version information available (required by pgbouncer)
PgBouncer 1.17.0
libevent 2.0.21-stable
adns: c-ares 1.10.0
tls: OpenSSL 1.0.2k-fips 26 Jan 2017
mkdir -p /etc/pgbouncer
cat >> /etc/pgbouncer/userlist.txt <<"EOF"
"postgres" :"md55305adaac499dbbc6865a44e4aa5d8b4"
EOF
cat >> /etc/pgbouncer/pgbouncer.ini <<"EOF"
[databases]
*= host=207.207.35.100 port=5432 dbname=postgres user=postgres
[pgbouncer]
listen_port = 6432
listen_addr = 207.207.35.100
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
logfile = /etc/pgbouncer/pgbouncer.log
pidfile = /etc/pgbouncer/pgbouncer.pid
admin_users = postgres
stats_users = postgres
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
pool_mode=transaction
EOF
chown postgres.postgres -R /etc/pgbouncer
注意事项: 上面的 userlist.txt 中格式为 “用户名“ “加密之后在的密码“
对于md5 加密的密码, 可以从 PG 中获取
postgres=# select usename,passwd from pg_shadow ;
usename | passwd
----------+-------------------------------------
postgres | md55305adaac499dbbc6865a44e4aa5d8b4
(1 row)
su - postgres
pgbouncer -d /etc/pgbouncer/pgbouncer.ini
[root@localhost ~]# /home/postgres/pgsql/bin/psql -U postgres -h 207.207.35.100 -p 6432 -d postgres -c "select version()"
Password for user postgres:
version
------------------------------------------------------------------------------------------------------------
PostgreSQL 11.8 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 7.5.0, 64-bit
(1 row)
参考:
https://www.modb.pro/db/104414
https://www.cnblogs.com/haha029/p/15626042.html