本文共 2460 字,大约阅读时间需要 8 分钟。
作者:王志斌,曾获得中国PostgreSQL数据库管理工程师(PGCE),是PostgreSQL官方认证讲师,盘古云课堂特邀金牌讲师。
PgBouncer作为PostgreSQL数据库的连接池中间件。与其他存在于PostgreSQL的连接池中间件不同,PgBouncer仅作为一个连接池和代理层为PostgreSQL和应用之间提供服务。
Pgbouncer具备例如连接池模式、连接类型、端口重用,应用场景以及用户认证、网络认证等多种重要特性,下面将逐一讲述,并期望为读者提供一份在实施过程中使用的配置指南。
数据库连接池在Pgbouncer中包括会话连接池、事务连接池、语句连接池三种方式。
1、会话连接池
官方解释为最有礼貌的方法。当客户端连接时,服务器连接将在其保持连接的整个过程中分配给它。当客户端断开连接时,服务器连接将重新放入池中。此模式支持所有PostgeSQL功能。2、事务连接池
服务器连接仅在事务期间分配给客户端。当PgBouncer发现事务已结束时,服务器连接将被放回池中。该模式破坏了PostgreSQL的一些基于会话的功能。仅当应用程序通过协作使用不中断功能时,才可以使用它。有关不兼容的功能。3、语句连接池
官方解释为最激进的方法。不允许多语句事务。本质上为了在客户端上强制执行“自动提交”模式,主要针对PL/Proxy。另外支持其他特性包括:
(注:文中未详细描述部分,请参见Pgbouncer[1]的官网相关文档,如配置手册、使用手册、FAQ等官方文档)。
前面大致介绍了Pgbouncer的一些特性,详细特性请查阅(Pgbouncer官网),下面将针对使用Pgbouncer时的一些配置注意事项进行说明,为Pgbouncer的使用用户提供一个指引,满足复杂业务需求情况下充分利用Pgbouncer的特性来实现特定业务场景需求。
在对Pgbouncer进行配置的过程中,需要特别关注连接池模式外,还需要明确数据连接数、连接方式,最后则是针对不同业务场景的Pgbouncer部署形式。
首先讨论一下为什么使用连接池[2],使用与不使用之间的性能差异,另外讨论连接池模式的工作流程、细节及一些注意事项进行阐述,最后提供一个适合的连接池建议。
在我们进行Postgresql入门的时候,通常会看到这段介绍“PostgreSQL服务器可以处理来自客户端的多个并发连接。为此,它为每个连接启动(“fork”)新进程,从那时起,客户端和新的服务器进程进行通信,而无需原始postgres进程进行干预。因此,主服务器进程始终在运行,等待客户端连接,而客户端及关联的服务器进程来来往往。”但是,这意味着每个新连接都会分叉一个新进程,保留在内存中,并可能在多个会话中变得过分繁忙。在业务量较小的情况下,这种方式基本可以满足要求,但是当业务量迅速激增,我们可能就需要不断去更改max_connections来满足客户端的需求。当时同样也带来了很大的问题,如频繁的关闭和创建连接造成的内存开销,管理已产生的大量连接等等,最终导致服务器响应缓慢而无法对外提供数据库服务。在这样一个背景下,数据库连接池就被提出来了,对于使用Postgresql数据库来说,一般分为客户端连接池,比如c3p0、druid等等;另外一种则是服务器端连接池,例如pgbouncer、odyssey、pgpoolII等。
图 1 直连数据库服务器这是没有连接池的PostgreSQL连接生命周期:
一个数据库会话包括所有通过单一连接的生命周期所做的工作。数据库会话的时间长度是可变的,并且在客户端和服务器上消耗的资源数量是可变的。
关键点在于:
一个的连接池位于客户端和服务器之间。客户端连接到池管理器,而池管理器连接到服务器。引入连接池程序会将连接模型更改为客户端代理服务器架构:
图 2 使用连接池连接数据库这使客户端连接生存期与服务器连接和进程生存期脱钩。连接池的作用:
特点:
显而易见使用连接池能够降低服务器的内存开销,并且有效复用数据库连接,提供了良好的数据库连接性能管理。
了解更多PostgreSQL热点资讯、新闻动态、精彩活动,请访问
解决更多PostgreSQL相关知识、技术、工作问题,请访问
下载更多PostgreSQL相关资料、工具、插件问题,请访问
转载地址:http://nmmxf.baihongyu.com/