/ 云数据库 rds/ / rds for postgresql/ pgbouncer使用最佳实践
更新时间:2024-12-25 gmt 08:00

pgbouncer使用最佳实践-九游平台

pgbouncer介绍

pgbouncer是为postgresql提供的轻量级连接池工具,作用如下:

  • 能够缓存和postgresql的连接,当有连接请求进来的时候,直接分配空闲进程,而不需要postgresql fork出新进程来建立连接,以节省创建新进程,创建连接的资源消耗。
  • 能够有效提高连接的利用率,避免过多的无效连接,导致数据库消耗资源过大,cpu占用过高。
  • 对客户端连接进行限制,预防过多或恶意的连接请求。

轻量级体现在:

  • 使用libevent进行socket通信,通信效率高。
  • c语言编写,效率高,每个连接仅消耗2kb内存。

pgbouncer目前支持三种连接池模型:

  • session会话级连接。只有与当客户端的会话结束时,pgbouncer才会收回已分配的连接。
  • transaction事务级连接。当事务完成后,pgbouncer会回收已分配的连接。也就是说客户端只是在事务中才能独占此连接,非事务请求没有独享的连接。
  • statement语句级连接。任何数据库请求完成后,pgbouncer都会回收连接。此种模式下,客户端不能使用事务,否则会造成数据的不一致。

pgbouncer默认选项是session,建议修改为transaction。

安装配置

在云上部署pgbouncer连接池,需要先。建议选择与后端rds实例相同vpc、相同子网创建,降低网络通信时延。购买成功后登录ecs进行环境搭建。

  1. 由于pgbouncer是基于libevent开发,需要安装libevent-devel openssl-devel两个依赖包。命令如下:
    yum install -y libevent-devel
    yum install -y openssl-devel
  2. 依赖包安装后,在pgbouncer九游平台官网下载源码,以普通用户身份进行编译、安装。
    su - pgbouncer
    tar -zxvf pgbouncer-1.19.0.tar.gz
    cd  pgbouncer-1.19.0
    ./configure --prefix=/usr/local 
    make
    make install
  3. 创建如下目录,用于保存pgbouncer的生成文件(日志、进程标识等)。
    mkdir -p /etc/pgbouncer/
    mkdir -p /var/log/pgbouncer/
    mkdir -p /var/run/pgbouncer/
  4. 启动pgbouncer前,需要构建配置文件“pgbouncer.ini”。
    [databases]
    * = host=127.0.0.1 port=5432
    [pgbouncer]
    logfile = /var/log/pgbouncer/pgbouncer.log
    pidfile = /var/run/pgbouncer/pgbouncer.pid
    listen_addr = *
    listen_port = 6432
    auth_type = md5
    auth_file = /etc/pgbouncer/userlist.txt
    admin_users = postgres
    stats_users = stats, postgres                            
    pool_mode = transaction                     
    server_reset_query = discard all              
    max_client_conn = 100
    default_pool_size = 20
    ;; resolve: unsupported startup parameter: extra_float_digits
    ;;ignore_startup_parameters = extra_float_digits

    配置文件中各参数含义可参考。

启动pgbouncer

pgbouncer不能以root身份启动,需要基于普通用户身份进行启动。

pgbouncer -d /etc/pgbouncer/pgbouncer.ini

启动后,可通过netstat -tunlp | grep pgbouncer查看连接池的监听端口,而后进行连接:

psql -u root -d postgres -h 127.0.0.1 -p 6432 
password for user root: 
psql (12.13)
type "help" for help.
postgres=> \l
                                   list of databases
   name    |   owner   | encoding |   collate   |    ctype    |    access privileges    
----------- ----------- ---------- ------------- ------------- -------------------------
 postgres  | pgbouncer | utf8     | en_us.utf-8 | en_us.utf-8 | 
 template0 | pgbouncer | utf8     | en_us.utf-8 | en_us.utf-8 | =c/pgbouncer           
           |           |          |             |             | pgbouncer=ctc/pgbouncer
 template1 | pgbouncer | utf8     | en_us.utf-8 | en_us.utf-8 | =c/pgbouncer

停止pgbouncer

可以直接通过kill命令停止。

kill `cat /var/run/pgbouncer/pgbouncer.pid`
cat /var/run/pgbouncer/pgbouncer.pid | xargs kill -9

pgbouncer管理

pgbouncer对外提供了一个虚拟数据库pgbouncer,之所以称为虚拟数据库,是因为它可以提供像postgresql那样的数据库操作界面,但是这个数据库却并不是真实存在的,而是pgbouncer虚拟出来的一个命令行界面。登录虚拟数据库:

psql -p 6432 -d pgbouncer

如果修改了一些配置参数,可以不用重启pgbouncer而是reload使其生效。

pgbouncer=# reload;
reload

登录后可以通过show help查看命令帮助,通过show clients查看客户端连接信息,通过show pools查看连接池信息。

实现读写分离示例

pgbouncer并不支持自动解析读写请求,并进行读写分离路由,需要业务侧对读写操作进行区分。

  1. 首先,修改配置文件“pgbouncer.ini”配置的数据库信息,添加主库、只读库连接配置。本例中参数设置如下:
    [databases]
    ;; * = host=127.0.0.1 port=5432
    #配置只读库的连接信息
    mydb_read:host=10.7.131.69 port=5432 dbname=postgres user=root password=***
    # 配置主库的连接信息
    mydb_write:  host=10.8.115.171 port=5432 dbname=postgres user=root password=***
    [pgbouncer]
    logfile = /var/log/pgbouncer/pgbouncer.log
    pidfile = /var/run/pgbouncer/pgbouncer.pid
    listen_addr = *
    listen_port = 6432
    auth_type = md5
    auth_file = /etc/pgbouncer/userlist.txt
    admin_users = postgres
    stats_users = stats, postgres                            
    pool_mode = transaction                     
    server_reset_query = discard all 
    max_client_conn = 100
    default_pool_size = 20                    
    ;; resolve: unsupported startup parameter: extra_float_digits
    ;;ignore_startup_parameters = extra_float_digits
  2. 验证是否能连接主库和只读数据库。通过psql成功连接只读、主库,可支持业务读写分离。
    psql -u root -d mydb_write -h 127.0.0.1 -p 6432
    password for user root:
    psql  (14.6)
    mydb_write=>  select pg_is_in_recovery();
      pg_is_in_recovery
    ----------------------
      f
    (1 row)
    psql -u root -d mydb_read -h 127.0.0.1 -p 6432
    password for user root:
    psql  (14.6)
    mydb_read=>  select pg_is_in_recovery();
    pg_is_in_recovery
    ----------------------
      t
    (1 row)

相关文档

网站地图