PgBouncer是为PostgreSQL,数据库提供的一个轻量级连接池工具,它的作用如下:
如果应用程序直接与PostgreSQL连接,则每次连接时PostgreSQL都会克隆(Linux及unix下通过 fork 系统调用)出一个服务进程来为应用程序服务,在关闭连接后PostgreSQL 则会自动把服务进程停掉。但频繁地创建和销毁进程,会耗费比较多的资源。
使用PgBouncer后,PgBouner会把与后端PostgreSQL数据库的连接缓存住,当有前端请求来时,只是分配一个空闲的连接给前端程序使用,这样就降低了资源的消耗。
允许前端创建多个连接,把前端的连接聚合到适量的数据库连接上。从理论上来说后台的服务进程数与这台主机上的CPU核数相同时,其CPU有效利用率是最高的因为这时CPU不需要在多个进程中来回切换。
通常的机器其CPU的核数在4~32个之间,很明显,限制用户的数据库连接数与CPU核数相同是不现实的。从经验看如果连接数超过CPU核数4倍时,CPU有效利用率会大大下降。
而即使允许的连接数是CPU核数的4倍,对多数应用来说,连接数还是不够的,所以这时使用连接池是一个很明智的选择。
=============================================
数据库版本
psql (15.10)
安装依赖 libevent
银河麒麟 V10 需要单独下载编译安装
下载地址:
https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
tar zxf libevent-2.1.8-stable.tar.gz
cd libevent-2.1.8-stable
./configure --prefix=/usr/local/
make && make install
安装pgbouncer
下载地址:http://www.pgbouncer.org/page3/

su - postgres
解压到到 /home/postgres 下
su - postgres
tar -zxvf /soft/pgbouncer-1.19.1.tar.gz -C /home/postgres
cd pgbouncer-1.19.1
./configure --prefix=/home/postgres/app/pgbouncer

如果在安装了 libevent 后仍然遇到相同的错误,可能是因为 pkg-config 无法找到 libevent 的路径。你可以手动指定 libevent 的路径,重新编译安装:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
./configure --prefix=/home/postgres/app/pgbouncer
make && make install
安装完成需要改一个配置信息
su - postgres
sed -i "s;:\$PATH:;:/postgresql/app/pgbouncer/bin:\$PATH:;g" ~/.bash_profile
source ~/.bash_profile
cat ~/.bash_profile
修改的是这个环境变量

看下安装的版本
pgbouncer -V

复制配置文件模版
cd /home/postgres/pgbouncer-1.19.1/etc/
cp pgbouncer.ini /home/postgres/app/pgbouncer/
添加参数
vim /home/postgres/app/pgbouncer/pgbouncer.ini
[databases]
pool_dba = host=192.168.2.204 port=1622 user=postgres password=1 dbname=postgres connect_query='select 1'
mydb = host=192.168.2.204 port=1622 user=myuser password=2 dbname=mydb connect_query='select 1'
[pgbouncer]
logfile = /home/postgres/app/pgbouncer/pgbouncer.log
pidfile = /home/postgres/app/pgbouncer/pgbouncer.pid
listen_addr = *
listen_port = 21622
auth_type = md5
auth_file = /home/postgres/app/pgbouncer/userlist.txt
admin_users = postgres
pool_mode = transaction
max_client_conn = 3000
default_pool_size = 128
认证文件userlist.txt生成方式
方法1
将pg_shadow中的用户名和密码导出到 userlist.t文档中,最后需要手动修改成标准格式;
postgres ># copy (select usename,passwd from pg_shadow) to '/home/postgres/app/pgbouncer/user.txt';
复制到 userlist.txt 中修改格式
cp user.txt userlist.txt
格式如下:
"user" "passwd

方法2
实际上,在PgBouncer的源码包中有一个Python 脚本“./etc/mkauth.py”,可以执行上述命令从“pg_shadow”表中读取数据自动生成的密码文件。
find / -name mkauth*
/home/postgres/pgbouncer-1.19.1/etc/mkauth.py
mkauth脚本使用格式方法:
./mkauth.py密码文件名 连接参数
/home/postgres/pgbouncer-1.19.1/etc/mkauth.py /home/postgres/app/pgbouncer/userlist.txt "host=192.168.2.204 port=1622 user=postgres password=1 dbname=postgres"
启停
启动
pgbouncer -d /home/postgres/app/pgbouncer/pgbouncer.ini
重启
pgbouncer -R /home/postgres/app/pgbouncer/pgbouncer.ini
停止
kill `cat /home/postgres/app/pgbouncer/pgbouncer.pid`
日志信息
tail -200f /home/postgres/app/pgbouncer/pgbouncer.log

查看连接池信息
PgBouncer提供了类似连接到虚拟数据库pgbouncer,然后执行一些 PgBouncer特殊命令的功能,这些特殊命令就像是执行一个真正的SQL命令,让管理者能查询和管理PgBouncer的连接池信息,这个界面称为PgBouncer的console 控制界面。一般使用psgl命令连接到这个虚拟的数据库pgbouncer上,就能执行PgBouncer的这些管理命令,如下:
psql -h 192.168.2.204 -p 21622 -U postgres -d pgbouncer
pgbouncer=# show help;
NOTICE: Console usage
DETAIL:
SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|USERS|VERSION
SHOW PEERS|PEER_POOLS
SHOW FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM|STATE
SHOW DNS_HOSTS|DNS_ZONES
SHOW STATS|STATS_TOTALS|STATS_AVERAGES|TOTALS
SET key = arg
RELOAD
PAUSE [<db>]
RESUME [<db>]
DISABLE <db>
ENABLE <db>
RECONNECT [<db>]
KILL <db>
SUSPEND
SHUTDOWN
WAIT_CLOSE [<db>]
SHOW
查看客户端连接情况的命令为 show clients,示例如下
show clients;
pgbouncer=# show clients;
type | user | database | state | addr | port | local_addr | local_port | connect_time | request_time | wait | wait_us | close_needed | ptr | link | remote_pid |
tls | application_name
------+----------+-----------+--------+---------------+-------+---------------+------------+-------------------------+-------------------------+------+---------+--------------+----------+------+------------+-
----+---------------------
C | myuser | mydb | active | 192.168.2.203 | 36982 | 192.168.2.204 | 21622 | 2025-02-07 04:09:18 CST | 2025-02-07 04:09:18 CST | 0 | 0 | 0 | 0xf46490 | | 0 |
| psql
C | myuser | mydb | active | 192.168.2.1 | 65529 | 192.168.2.204 | 21622 | 2025-02-07 04:06:52 CST | 2025-02-07 04:29:20 CST | 0 | 0 | 0 | 0xf46230 | | 0 |
| pgAdmin 4 - DB:mydb
C | postgres | pgbouncer | active | 192.168.2.204 | 37026 | 192.168.2.204 | 21622 | 2025-02-07 04:28:41 CST | 2025-02-07 04:29:23 CST | 38 | 445520 | 0 | 0xf45fd0 | | 0 |
| psql
(3 rows)
查看连接池的命令为“show pools”,示例如下
pgbouncer=# show pools;
database | user | cl_active | cl_waiting | cl_active_cancel_req | cl_waiting_cancel_req | sv_active | sv_active_cancel | sv_being_canceled | sv_idle | sv_used | sv_tested | sv_login | maxwait | maxwait
_us | pool_mode
-----------+-----------+-----------+------------+----------------------+-----------------------+-----------+------------------+-------------------+---------+---------+-----------+----------+---------+--------
----+-------------
mydb | myuser | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
0 | transaction
pgbouncer | pgbouncer | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | statement
(2 rows)
连接
psql -h 192.168.2.204 -p 21622 -U myuser -d mydb

客户端连接

==================================================
文章参考:唐成老师PostgreSQL修炼之道从小工到专家




