+ -
当前位置:首页 → 问答吧 → pgbouncer使用快速入门

pgbouncer使用快速入门

时间:2010-10-01

来源:互联网

本帖最后由 osdba 于 2010-10-01 22:33 编辑

pgbouncer是PostgreSQL的一个轻量的连接池软件。任何应用程序都可以把 pgbouncer 当作一个 PostgreSQL 服务器来连接,然后 pgbouncer 会处理与服务器连接,或者是重用已存在的连接。
    使用 pgbouncer 主要目的标是降低因为新建到 PostgreSQL 的连接而导致的性能损失。我们知道,对于每个新的连接,PostgreSQL都会建启动一个进程,连接数有多少,就会启动多少个后台服务进程,即使这些连接什么也不做,也会占用一个后台服务进程,每个服务进程都会占用系统资源,pgbouncer是一个连接池软件,可以实现连接复用的功能,降低实际到数据库的连接数目。
    为了协调事务语意和连接池的关系,pgbouncer 支持几种不同粗暴程度的连接轮转方式:
    Session pooling/会话连接池
    最礼貌的方法。在客户端连接的时候,将会给他分配一个服务器连接,并且在客户端连接的全程都分配给它。在客户端中断连接的时候,这个服务器连接将会放回连接池。这种方式不能降低数据库的连接数。
    Transaction pooling/事务连接池
    服务器连接只是在一个事务的过程里赋予客户端的。在 PgBouncer 注意到事务结束后,服务器就会放回连接池。
    Statement pooling/语句连接池
    最激进的模式。在每个查询结束之后,服务器的连接都会立即放回连接池。在这种模式下将不允许多语句的事务,因为它们的事务语意会被破坏。

    下面我们将简单介绍pgbouncer的使用方法:
    从网站http://pgfoundry.org/projects/pgbouncer下载,我下载的是pgbouncer-1.3.4.tgz,把这个文件解压到一个目录中,编译安装:
    tar zxvf pgbouncer-1.3.4.tgz
    cd pgbouncer-1.3.4
    ./configure
    make
    make install
   
    pgbouncer运行需要一个配置文件pgbouncer.ini,文件内容如下:
  1. [databases]
  2. osdba = host=127.0.0.1 port=5432 user=osdba dbname=osdba
  3.    
  4. [pgbouncer]
  5. listen_port = 6543
  6. listen_addr = 127.0.0.1
  7. auth_type = md5
  8. auth_file = users.txt
  9. logfile = pgbouncer.log
  10. pidfile = pgbouncer.pid
  11. admin_users = bntest
复制代码
其中[databases]小结中的格式为: <database> = xxxxxx,<database>指在pgbouncer中的要连接的后端数据库,后面的"host=127.0.0.1 port=5432 user=osdba dbname=osdba"是pgbouncer连接的后端数据库使用的连接串。我这里的数据库为osdba。
    [pgbouncer]小结中,主要设置pgbouncer的监听IP即端口。
    还需要一个用户验证文件users.txt,users.txt的内容如下:
  1. "bntest" "bnpass"
复制代码
内容格式为 "username" "password"。后面就可以使用这里面配置的用户名和密码连接pgbouncer。
    这里就可以启动pgbouncer了:

osdba@osdba-laptop:~$ pgbouncer -d pgbouncer.ini
2010-10-01 21:46:24.205 11484 LOG File descriptor limit: 1024 (H:1024), max_client_conn: 100, max fds possible: 130

这里就可以使用psql连接pgbouncer了:

osdba@osdba-laptop:~$ psql -h 127.0.0.1 -p 6543 -U bntest osdba
Password for user osdba:
psql (9.0.0)
Type "help" for help.

osdba=# \d
                 List of relations
Schema |          Name          |   Type   | Owner
--------+------------------------+----------+-------
public | pg_stat_statements     | view     | osdba
public | pgstatspack_database   | table    | osdba
public | pgstatspack_indexes    | table    | osdba
public | pgstatspack_sequences  | table    | osdba
public | pgstatspack_settings   | table    | osdba
public | pgstatspack_snap       | table    | osdba
public | pgstatspack_statements | table    | osdba
public | pgstatspack_tables     | table    | osdba
public | pgstatspack_version    | table    | osdba
public | pgstatspackid          | sequence | osdba
public | t                      | table    | osdba
(11 rows)

osdba=#

这里也可以连接到pgbouncer上的一个特殊的数据库pgbouncer上,这时就可以查看pgbouncer运行状态和关闭pgbouncer了:
osdba@osdba-laptop:~$ psql -h 127.0.0.1 -p 6543 -U bntest pgbouncer
Password for user bntest:
psql (9.0.0, server 8.0/bouncer)
WARNING: psql version 9.0, server version 8.0.
         Some psql features might not work.
Type "help" for help.

pgbouncer=# show help;
NOTICE:  Console usage
DETAIL:  
        SHOW HELP|CONFIG|DATABASES|POOLS|CLIENTS|SERVERS|VERSION
        SHOW STATS|FDS|SOCKETS|ACTIVE_SOCKETS|LISTS|MEM
        SET key = arg
        RELOAD
        PAUSE [<db>]
        SUSPEND
        RESUME [<db>]
        SHUTDOWN
SHOW

可以看到命令shutdown可以停止pgbouncer的运行,命令reload可以重新装载新的配置文件。
具体使用方法可见:http://www.pgsqldb.org/mwiki/index.php/Pgbouncer_%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C

上面的配置没的指定连接池的模式,如果没有指定,默认是session模式。
我们把连接模式改成statement,pgbouncer.ini配置文件如下:
  1. [databases]
  2. osdba = host=127.0.0.1 port=5432 user=osdba dbname=osdba
  3.    
  4. [pgbouncer]
  5. listen_port = 6543
  6. listen_addr = 127.0.0.1
  7. auth_type = md5
  8. auth_file = users.txt
  9. logfile = pgbouncer.log
  10. pidfile = pgbouncer.pid
  11. admin_users = bntest
  12. pool_mode = statement
复制代码
这时,如果我们使用"begin;"启动事务时就会报错:
osdba@osdba-laptop:~$ psql -h 127.0.0.1 -p 6543 -U bntest osdba
Password for user bntest:
psql (9.0.0)
Type "help" for help.
osdba=# begin;
ERROR:  Long transactions not allowed
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.

作者: osdba   发布时间: 2010-10-01

收藏,近期会用到

顺便问下,pg还有其他的连接池吗

作者: sunrace2000   发布时间: 2010-10-06