zoukankan      html  css  js  c++  java
  • PgBouncer连接池工具

    PgBouncer是为PostgreSQL提供的轻量级连接池工具,作用如下:
    1,能够缓存和PostgreSQL的连接,当有连接请求进来的时候,直接分配空闲进程,而不需要PostgreSQL fork出新进程来建立连接,以节省创建新进程,创建连接的资源消耗。
    2,能够有效提高连接的利用率,避免过多的无效连接,导致数据库消耗资源过大,CPU占用过高。
    3,对客户端连接进行限制,预防过多或恶意的连接请求。
    支持三种连接池模型:
    1、Session pooling
    会话模式,当会话结束时,被会话占用的pgbouncer到PGDB的连接可以被其他会话复用。
    适用于短连接,或者其他模式不适用的场景。
    不能解决大并发场景连接打满或性能下降的问题(到后端的连接依旧会很多)。
    2、Transaction pooling
    事务模式,当事务结束时,被会话占用的pgbouncer到PGDB的连接可以被其他会话复用。
    适用于大并发、未使用(游标、绑定变量、消息队列、特殊参数)的场景。
    3、Statement pooling
    语句模式,当SQL执行完成后,被会话占用的pgbouncer到PGDB的连接可以被其他会话复用。
    适用于大并发、未使用(游标、绑定变量、消息队列、特殊参数),并且不需要多语句事务的场景(或者说autocommit的场景)。
    本例中使用postgresql版本:

    postgres=# select version();
                                                                   version                                                                
    --------------------------------------------------------------------------------------------------------------------------------------
     PostgreSQL 9.6.22 on x86_64-pc-linux-gnu (Debian 9.6.22-1.pgdg90+1), compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit
    (1 row)

    使用

    1、需要先安装libevent依赖。
    libevent安装
    下载地址:https://github.com/libevent/libevent/releases/tag/release-2.1.12-stable
    创建解压目录:

    mkdir /home/postgres/libevent

    解压安装:

    tar -zxvf libevent-2.0.21-stable.tar.gz
    cd libevent-2.0.21-stable
    ./configure --prefix=/home/postgres/libevent
    make
    make install

    环境变量.bashrc文件增加下面内容:

    export PKG_CONFIG_PATH=/home/postgres/libevent/lib/pkgconfig

    2、安装pgbouncer
    下载地址:https://github.com/pgbouncer/pgbouncer/tags
    创建解压目录:

    mkdir /home/postgres/pgbouncer

    解压:

    tar -xvf pgbouncer-1.15.0.tar.gzcd pgbouncer-1.15.0/

    安装:

    ./configure --prefix=/home/pg13/pgbouncer/
    make
    make install

    3、配置pgbouncer

    新建config目录和log目录:

    mkdir -p /home/postgres/pgbouncer/etc/
    
    mkdir -p /home/postgres/pgbouncer/log

    配置文件修改如下:

    #/home/postgres/pgbouncer/etc/pgbouncer.ini
    
    [databases]
    
    * = host=127.0.0.1
    
    port=5432
    
    pool_size=50
    
    [pgbouncer]
    
    reserve_pool_size=14
    
    logfile = /home/postgres/pgbouncer/log/pgbouncer.log
    
    pidfile = /home/postgres/pgbouncer/pgbouncer.pid
    
    listen_addr = 0.0.0.0
    
    listen_port = 4001
    
    unix_socket_dir = /home/postgres/pgbouncer
    
    unix_socket_mode = 0700
    
    auth_type = md5
    
    auth_file = /home/postgres/pgbouncer/etc/userlist.txt
    
    auth_user = jinliauth_query = select i_usename,i_passwd from get_shadow($1)
    
    admin_users = jinli
    
    stats_users = jinli
    
    pool_mode = transaction
    
    server_reset_query = DISCARD ALL
    
    server_check_query = select 1
    
    max_client_conn = 100
    
    default_pool_size = 20

    然后将需要用到的用户密码配置到userlist.txt文件中

    #userlist.txt
    
    "jinli" "jinli"

    4、启动pgbouncer
    启动前先修改环境变量:

    export LD_LIBRARY_PATH="/home/postgres/libevent/lib":$LD_LIBRARY_PATH
    
    export PATH="/home/postgres/pgbouncer/bin":$PATH

    然后启动:

    pgbouncer -d /home/postgres/pgbouncer/etc/pgbouncer.ini

    5、停止pgbouncer

    cat /home/postgres/pgbouncer/pgbouncer.pid | xargs kill -9

    6、连接pgbouncer

    pgbouncer对外提供了一个虚拟数据库pgbouncer,我们可以连接到该库中进行 相关的命令操作:

    export PGPASSWORD=jinli
    
    psql -h 127.0.0.1 -p 4001 -U jinli pgbouncer

    常用的命令:

    show clients: 用来查看客户端连接信息;
    show pools: 用来查看连接池信息;
    show databases:查看连接的数据库;
    show config:查看相关配置;
    被会话占用的pgbouncer到PGDB的连接被复用前,(通过pgbouncer.ini配置文件)可以设置重置命令(重置一些会话状态),使用discard即可(配置,执行计划缓存,序列,临时表等)。

    pgbouncer=# h discard
    
    Command: DISCARD
    
    Description: discard session state
    
    Syntax:DISCARD { ALL | PLANS | SEQUENCES | TEMPORARY | TEMP }

    参考:

    https://www.postgresql.org/docs/9.6/sql-discard.html

    https://github.com/pgbouncer/pgbouncer

    https://blog.csdn.net/weixin_39540651/article/details/117289028

    https://github.com/digoal/blog/blob/master/201005/20100511_03.md

  • 相关阅读:
    安装WebStorm
    Could not obtain transaction-synchronized Session
    Hibernate4 No Session found for current thread原因
    Spring3系列7- 自动扫描组件或Bean
    论坛角色
    firefox浏览器无法显示bootstrap图标问题总结
    express文件上传中间件Multer最新使用说明
    判断圆和矩形是否相交C
    转化为用欧几里得算法判断互质的问题D
    (记录前面算过的后面仍然会用的数减小复杂度)A
  • 原文地址:https://www.cnblogs.com/jinli1771/p/14998666.html
Copyright © 2011-2022 走看看