暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

银河麒麟V10 SP3 部署 pgbouncer

原创 Dale 2025-02-07
113

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的连接池信息,这个界面称为PgBouncerconsole 控制界面。一般使用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修炼之道从小工到专家

最后修改时间:2025-02-28 15:42:49
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论