免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8953 | 回复: 8

pgbouncer使用快速入门 [复制链接]

论坛徽章:
3
数据库技术版块每日发帖之星
日期:2015-06-18 22:20:00数据库技术版块每日发帖之星
日期:2015-06-21 22:20:00数据库技术版块每日发帖之星
日期:2015-08-27 06:20:00
发表于 2010-10-01 22:31 |显示全部楼层
本帖最后由 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.

论坛徽章:
0
发表于 2010-10-06 00:09 |显示全部楼层
收藏,近期会用到

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

论坛徽章:
0
发表于 2010-10-07 01:22 |显示全部楼层
我的怎么会宕掉啊?

pgsql@debian:/usr/local/pgbouncer/bin$ ./pgbouncer  pgbouncer.ini
2010-10-06 16:18:29.591 7150 LOG File descriptor limit: 8192 (H:65536), max_clie
nt_conn: 100, max fds possible: 130
2010-10-06 16:18:29.591 7150 LOG Stale pidfile, removing
2010-10-06 16:18:29.592 7150 LOG listening on 127.0.0.1:6543
2010-10-06 16:18:29.592 7150 LOG listening on unix:/tmp/.s.PGSQL.6543
段错误

论坛徽章:
0
发表于 2010-10-07 23:53 |显示全部楼层
  1. Reading symbols from /lib/tls/i686/cmov/libc.so.6...done.
  2. Loaded symbols for /lib/tls/i686/cmov/libc.so.6
  3. Reading symbols from /lib/ld-linux.so.2...done.
  4. Loaded symbols for /lib/ld-linux.so.2
  5. Core was generated by `./pgbouncer ./pgbouncer.ini'.
  6. Program terminated with signal 11, Segmentation fault.
  7. #0  0xb7e0aeca in strcmp () from /lib/tls/i686/cmov/libc.so.6
  8. (gdb) bt
  9. #0  0xb7e0aeca in strcmp () from /lib/tls/i686/cmov/libc.so.6
  10. #1  0x0805be1a in tree_search (tree=0x8062730, value=-1080433028)
  11.     at src/aatree.c:300
  12. #2  0x0804c239 in find_user (name=0xbf99e67c "pgsql") at src/objects.c:408
  13. #3  0x0804dcf7 in add_user (name=0xbf99e67c "pgsql", passwd=0xbf99e63c "pgsql")
  14.     at src/objects.c:344
  15. #4  0x0804b271 in load_auth_file (fn=0x806d308 "users.txt") at src/loader.c:408
  16. #5  0x0804b346 in loader_users_check () at src/loader.c:444
  17. #6  0x0805921b in do_full_maint (sock=-1, flags=1, arg=0x0)
  18.     at src/janitor.c:558
  19. #7  0xb7f02c79 in event_base_priority_init () from /usr/lib/libevent-1.4.so.2
  20. #8  0xb7f02f65 in event_base_loop () from /usr/lib/libevent-1.4.so.2
  21. #9  0xb7f02dcb in event_loop () from /usr/lib/libevent-1.4.so.2
  22. #10 0x0805a917 in main_loop_once () at src/main.c:619
  23. #11 0x0805aedc in main (argc=1903388528, argv=0x6c) at src/main.c:740
  24. (gdb)
复制代码
看来是tree_search中引起的

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
发表于 2010-10-08 09:09 |显示全部楼层
支持JAVA连接吗?

论坛徽章:
3
数据库技术版块每日发帖之星
日期:2015-06-18 22:20:00数据库技术版块每日发帖之星
日期:2015-06-21 22:20:00数据库技术版块每日发帖之星
日期:2015-08-27 06:20:00
发表于 2010-10-09 18:53 |显示全部楼层
回复 5# renxiao2003


    连接到pgbouner下,基本上与连接到PostgreSQL数据库上是一样的,所以当然支持java的连接了。

论坛徽章:
0
发表于 2010-10-10 12:49 |显示全部楼层
支持JAVA连接吗?
renxiao2003 发表于 2010-10-08 09:09

跟语言无关的,就是以前直接连Pg,现在转到PgBouncer上,由它来管理和分配。

论坛徽章:
0
发表于 2010-10-10 16:09 |显示全部楼层
好东西
还没用过连接池
似乎pgpool也是?

论坛徽章:
10
数据库技术版块每日发帖之星
日期:2015-06-14 22:20:00数据库技术版块每日发帖之星
日期:2016-03-10 06:20:00数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00IT运维版块每日发帖之星
日期:2015-11-09 06:20:00IT运维版块每日发帖之星
日期:2015-11-02 06:20:00IT运维版块每日发帖之星
日期:2015-07-13 22:59:28IT运维版块每日发帖之星
日期:2015-06-23 22:20:00程序设计版块每日发帖之星
日期:2015-06-21 22:20:00每日论坛发贴之星
日期:2015-06-14 22:20:00IT运维版块每日发帖之星
日期:2016-08-02 06:20:00
发表于 2015-06-14 01:01 |显示全部楼层
最近在找数据库代理,关注中。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP