`
varsoft
  • 浏览: 2508919 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

[转]PostgreSQL数据库连接池Pgbouncer的搭建

阅读更多

作者:何伟平
来源:http://www.pgsqldb.org/mwiki/index.php/Pgbouncer%E6%90%AD%E5%BB%BA%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%E6%B1%A0

最近有些项目我们是采用PostgreSQL进行后端数据库,由于要对客户端的连接使用类型和连接数进行控制,因此我们采用PgBouncer来进行实施。

PgBouncer相关的基本文档pgsqldb中文站已经有不少文档,这里我就不再作过多的说明,我将集中对其中的几个要点和我实践中遇到的问题和大家分享一下。

OK,肺话也不多少,开始正题吧;D

gBouncer介绍

  • 什么是PgBouncer?

PgBouncer是一个轻量级的数据库连接池。download

  • PgBouncer的作用
  1. PgBouncer可以在后端数据库和前端应用间建立连接的桥梁,由PgBouncer去处理和后端数据库的连接关系。
  2. 对客户端连接进行限制,预防过多或者恶意的连接请求。
  • PgBouncer的特点
  1. 内存消耗低(默认为2k/连接),因为Bouncer不需要每次都接受完整的数据包
  2. 可以把不同的数据库连接到一个机器上,而对客户端保持透明
  3. 支持在线的重新配置而无须重启
  4. 仅支持V3协议,因此后端版本须>=7.4

开始使用PgBouncer

  • 基本ini文件配置(假设我们创建了新的ini文件/usr/local/pgsql/conf/pgbouncer.ini)

1. 添加目标数据库的连接字符串,这个表示PgBouncer将会在哪些后端数据库中建立连接,比如:

template1 = host=127.0.0.1 port=5432 dbname=template1

2. 设定PgBouncer的监听端口, port=5555,默认为6000

3. 创建用户列表文件并添加用户信息,此用户为允许客户端使用的连接用户名,比如:

A. zhaoyi@zhaoyi-laptop:[~]$ echo "user" "password" > /usr/local/pgsql/user.txt
B. 在ini设定:auth_file = /usr/local/pgsql/user.txt

4. 创建admin用户,在配置中添加:admin_users = user,用户可以使用此用户名连接pgbouncer并查看运行状况等,注意:此用户必须为user.txt文件中已经存在的用户。

  • 启动并测试连接/查看运行状况

1. 启动:pgbouncer -d pgbouncer.ini

2. 测试连接:psql -h 127.0.0.1 -p 6000 -U user template1

3. 通过admin用户连接pgbouncer查看配置:

psql -h 127.0.0.1 -p 6000 -U user pgbouncer
pgbouncer=# show config;

3. 通过admin用户连接pgbouncer查看运行情况:

pgbouncer=# show stats;
pgbouncer=# show lists; 
pgbouncer=# show pools;
pgbouncer=# show databases;
#其余运行参数可以通过如下命令查看
pgbouncer=# show help;

4. 参数修改:如果修改了ini文件中相关参数,需要通过命令告知bouncer重新读取配置内容:

pgbouncer=# reload;


PgBouncer连接类型

  1. 会话池连接:即以一个session为生命期,当客户端断开的时候,才断开并释放连接回连接池
  2. 事务连接:服务器连接只是在一个事务的过程里赋予客户端的
  3. 语句连接:在每个查询结束之后,服务器的连接都会立即放回连接池。在这种模式下将不允许多语句的事务。否则,会给出如下提示,比如
test=# 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.


客户端连接方式

这里我简单说明一下客户端不同连接方式时服务器端的处理方式,以perl中为例:

$dbh = DBI -> connect('dbi:Pg:dbname=test;host=127.0.0.1;port=6000', 'postgres', ' ' ) or die $DBI::errstr;
  1. 客户端为AutoCommit时,transaction类型 = statements类型
  2. pool类型为transaction类型,如果客户端不为AutoCommit时,必须显示Commit,否则连接不释放
  3. pool类型为statements类型时,连接不支持长语句,因此客户端必须AutoCommit,否则依然会报错

AutoCommit配置为:

{'AutoCommit' => 0}


连接参数配置及客户端状态

  • max_client_conn
  1. 这个为允许客户端连接的最大数目
  2. 你可以通过show clients进行查看,当客户段连接大于此设置时,客户端会得到类似如下信息:
 psql: ERROR:  no more connections allowed
  • default_pool_size
  1. 这个为当前连接池中允许的最大处理连接
  2. 比如default_pool_size=3,如果在连接池没有空余连接的情况下,如果已经连接的客户端尝试通过PgBouncer向后端执行查询请求,则客户端会一直处理等待状态,当有空余的连接释放时,比如其他的客户端断开连接时,PgBouncer才会把此请求放如连接池中,向后端提出服务请求,后端收到请求后,才执行请求返回结果,比如
 template1=# select * from test;
 --no result

以上测试都是基于 pgbouncer version 1.1.1 + psql (PostgreSQL) 8.3.3

相关文档

<!-- Saved in parser cache with key pgwiki:pcache:idhash:473-0!1!0!!zh-cn!2 and timestamp 20081103160112 -->
<!-- end content -->
分享到:
评论

相关推荐

    pgbouncer-1.5.4

    pgBouncer 是一个轻量级的数据库连接池管理器,专为 PostgreSQL 数据库设计。它可以在客户端和数据库服务器之间提供一个中间层,有效地管理和复用数据库连接,从而减少数据库服务器的压力,提高系统性能。pgBouncer ...

    基于Go语言优化的PostgreSQL连接池ZQPool设计源码

    ZQPool是一款由中启乘数科技推出的开源PostgreSQL连接池软件,主要针对pgbouncer连接池的局限性进行优化。项目包含43个文件,涵盖Go、Java、Shell、C等多种编程语言。ZQPool旨在解决以下问题:首先,它能够有效减少...

    sm-postgresql:SM Postgresql扩展集(PostgreSQL,pgpool,pgbouncer,slony,扩展)

    提供连接池,复制,负载平衡,超出限制的连接,并行查询。 阅读pgpool / README.md以获得更多详细信息。 pgbouncer 提供会话池,事务池,语句池。 阅读pgbouncer / README.md以获得更多详细信息。 邮政 将对地理...

    pgbouncer-1.12.0.tar.gz

    pgbouncer是postgresql数据库的一种轻量级数据库连接池。 什么是数据库连接池? 数据库连接池负责连接,管理,释放数据库连接,允许连接复用。 为什么要有数据库连接池? 摘自gitbub,解决网友因为公司网络问题不能...

    藏经阁-PostgresChina2018_权宗亮_基于odyssey连接池实现企业级PostgreSQL数据分布中间件.pdf

    PgBouncer是PostgreSQL的连接池管理工具,能够提供负载均衡和读写分离的功能。但是,PgBouncer存在单进程性能瓶颈问题,限制了其在大规模应用中的使用。 Odyssey连接池项目能够解决这个问题,提供高性能和高可靠性...

    PostgresChina2018权宗亮基于odyssey连接池实现企业级PostgreSQL数据分布中间件.pdf

    在文档中提到了 PgBouncer,这是一个常被用在PostgreSQL中的连接池,但文档也指出了它作为单进程存在性能瓶颈。多进程或线程处理方式可以解决这一问题,而Odyssey连接池正是支持多线程的。多线程的连接池通常可以更...

    pgbouncer:PostgreSQL轻量级连接池

    PgBouncer PostgreSQL轻量级连接池。 主页: : 漏洞跟踪的来源: : 建造PgBouncer依赖于几件事来进行编译: 3.81+ 2.0+ 支持TLS的 1.0.1+ (可选) 替代Libevent的evdns (可选)PAM库安装依赖项后,只需运行: $ ....

    数据库连接示例程序二

    错误处理可以帮助我们检测和解决可能出现的问题,而连接池(如Java的C3P0或HikariCP,Python的pgbouncer)则可以复用已建立的连接,减少频繁创建和销毁连接的开销。 在“Two”这个压缩包文件中,可能包含了具体的...

    pgbconsole:pgbConsole是Pgbouncer的顶级控制台-PostgreSQL连接池

    pgbConsole是Pgbouncer的顶级控制台-PostgreSQL连接池。 特征: 类顶界面 显示有关客户端/服务器连接,池/数据库信息和统计信息的信息。 能够执行管理命令,例如暂停,恢复,重新加载等。 在本地pgbouncers中...

    docker-pgbouncer:易于配置的最小PgBouncer映像

    PgBouncer是一款开源的轻量级数据库连接池管理工具,主要用于优化PostgreSQL数据库的性能和稳定性,通过减少与数据库服务器的直接交互来提高系统的并发处理能力。 【描述】提到"易于配置",意味着该Docker映像设计...

    PostgreSQL性能优化最佳综合案例实践

    优化过程可能包含多个方面,比如调整连接池设置,优化查询计划,选择合适的硬件资源,以及进行定期的数据库维护。这需要深入理解PostgreSQL的工作原理和性能监控工具,以便根据监控数据调整优化策略。 在整个优化...

    POSTGRESQL_9_HIGH_AVAILABILITY_COOKBOOK 高清pdf加原书代码

    此外,了解PostgreSQL的高可用性方案也意味着要熟悉相关的工具和组件,如pgAdmin、pgBouncer、pgPool II等,它们在监控、连接池管理、读写分离等方面起到关键作用。 总的来说,《POSTGRESQL_9_HIGH_AVAILABILITY_...

    pgbouncer-rr-patch:向pgbouncer添加查询路由和重写扩展

    项目基于 (一个开源的PostgreSQL连接池)。 它增加了两个新的重要功能: 路由:将查询从一个客户端连接智能地发送到不同的数据库服务器; 使用它在多个服务器/集群之间进行分区或负载平衡。 重写:在将客户端...

    PostgreSQL.High.Availability.Cookbook.2nd.Edition.2017.2.pdf

    - **连接池技术**:使用连接池可以有效管理客户端与数据库之间的连接,避免频繁创建和销毁连接带来的开销。 - **硬件选择**:合理选择服务器硬件配置对于提升性能同样至关重要。 ##### 4.4 监控与管理 - **监控工具...

    django-dbconn-retry:修补Django,以在失败的数据库连接上重新连接一次,然后再失败。 例如,通过HAProxy帮助运行Django ORM

    2. **数据库连接池**:虽然`django-dbconn-retry`不直接涉及数据库连接池,但它与连接池(如pgbouncer)配合使用,可以更有效地管理数据库连接,防止过多的短连接创建和销毁。 3. **配置与集成**:将`django-dbconn...

    heroku-buildpack-pgbouncer:与您的应用程序一起在dyno中运行pgbouncer

    该buildpack的主要用途是允许dyno中多个工作程序之间的PostgreSQL数据库连接的事务池化。 例如,10名独角兽工作者可以共享一个数据库连接,从而避免了Postgres服务器上的连接限制和内存不足错误。常问问题问:为...

    Go-Stolon是一个cloudnative的PostgreSQL高可用管理工具

    PGBouncer可以减轻PostgreSQL服务器的负载,同时提供连接池功能,提高系统效率。此外,它还能够实现读写分离,将读操作分发到从节点,进一步提升系统性能。 Go-Stolon的核心组件包括Sentinel、Proxy和Keeper: 1. ...

    allas:PostgreSQL“监听通知”连接池

    allas是的连接池,仅支持LISTEN / NOTIFY。 这个想法是允许应用程序在事务池模式下使用pgbouncer,而仅通过allas接收通知。 allas仅使用单个PostgreSQL连接,并在该连接上适当地进行LISTENing和UNLISTENing的处理,...

Global site tag (gtag.js) - Google Analytics