作者:王志斌,曾获得中国PostgreSQL数据库管理工程师(PGCE),是PostgreSQL官方认证讲师,盘古云课堂特邀金牌讲师。

PgBouncer作为PostgreSQL数据库的连接池中间件。与其他存在于PostgreSQL的连接池中间件不同,PgBouncer仅作为一个连接池和代理层为PostgreSQL和应用之间提供服务。

Pgbouncer具备例如连接池模式、连接类型、端口重用,应用场景以及用户认证、网络认证等多种重要特性,下面将逐一讲述,并期望为读者提供一份在实施过程中使用的配置指南。

数据库连接池在Pgbouncer中包括会话连接池、事务连接池、语句连接池三种方式。

1、会话连接池
官方解释为最有礼貌的方法。当客户端连接时,服务器连接将在其保持连接的整个过程中分配给它。当客户端断开连接时,服务器连接将重新放入池中。此模式支持所有PostgeSQL功能。

2、事务连接池
服务器连接仅在事务期间分配给客户端。当PgBouncer发现事务已结束时,服务器连接将被放回池中。该模式破坏了PostgreSQL的一些基于会话的功能。仅当应用程序通过协作使用不中断功能时,才可以使用它。有关不兼容的功能。

3、语句连接池
官方解释为最激进的方法。不允许多语句事务。本质上为了在客户端上强制执行“自动提交”模式,主要针对PL/Proxy。

另外支持其他特性包括:

  • 高性能,因为Pgbouncer自身不需要查看整个数据包,所以在网络开销上仅为2k(默认情况),对系统的内存要求小。
  • 部署灵活:Pgbouncer没有绑定到一台后端服务器。目标数据库可以驻留在不同的主机上。
  • 可维护性强:支持大多数配置项的的在线重新配置;并且支持在线重启/升级,而不会断开客户端连接。
  • 认证灵活:用户认证支持基于文件的验证方式外,还提供了数据库查询验证;网络连接认证与Postgresql数据库一致,支持多种模式验证。
  • 灵活连接数:支持全局、数据库、用户和客户端连接数组合形式设置。

(注:文中未详细描述部分,请参见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连接生命周期:

  1. 客户端通过请求并验证与服务器的连接来开始新会话。
  2. 服务器fork一个新的系统进程来处理连接和工作会话。会话状态是通过服务器级,数据库级和用户级配置参数的组合进行初始化的。
  3. 客户通过执行一个或多个事务来完成所需的工作。示例包括:
  • 针对关系(表,视图等)执行读写
  • 使用SET命令更改会话或事务状态
  • 准备并执行预编译语句
  1. 当客户端断开连接时,会话结束。
  2. 服务器销毁会话进程。

一个数据库会话包括所有通过单一连接的生命周期所做的工作。数据库会话的时间长度是可变的,并且在客户端和服务器上消耗的资源数量是可变的。

关键点在于:

  • 创建,管理和销毁连接过程会花费时间并消耗资源。
  • 随着服务器的连接数增加,管理这些连接所需的资源也随之增加。此外,随着客户端在服务器上进行处理,服务器的每个进程内存使用量将继续增长。
  • 由于单个会话仅服务于单个客户端,因此客户端可以更改数据库会话的状态,并希望这些更改在后续的事务中继续存在。

一个的连接池位于客户端和服务器之间。客户端连接到池管理器,而池管理器连接到服务器。引入连接池程序会将连接模型更改为客户端代理服务器架构:

图 2 使用连接池连接数据库

这使客户端连接生存期与服务器连接和进程生存期脱钩。连接池的作用:

  • 接受和管理来自客户端的连接
  • 建立和维护与服务器的连接
  • 将服务器连接分配给客户端连接

特点:

  • 单个服务器连接可处理来自不同客户端的会话,事务和语句
  • 单个客户端会话的事务和/或语句可在不同的服务器连接上运行

显而易见使用连接池能够降低服务器的内存开销,并且有效复用数据库连接,提供了良好的数据库连接性能管理。

了解更多PostgreSQL热点资讯、新闻动态、精彩活动,请访问中国PostgreSQL官方网站

解决更多PostgreSQL相关知识、技术、工作问题,请访问中国PostgreSQL官方问答社区

下载更多PostgreSQL相关资料、工具、插件问题,请访问中国PostgreSQL官方下载网站

Pgbouncer最佳实践:系列一相关推荐

  1. 最佳实践系列:前端代码标准和最佳实践

    最佳实践系列:前端代码标准 @窝窝商城前端(刘轶/李晨/徐利/穆尚)翻译于2012年 版本0.55 @郑昀校对 isobar的这个前端代码标准和最佳实践文档,涵盖了Web应用开发的方方面面,我们翻译了 ...

  2. 最佳实践系列丨Docker EE 服务发现参考架构(二)

    出品丨Docker公司(ID:docker-cn) 编译丨小东 每周一.三.五晚6点10分 与您不见不散 服务发现对服务进行注册并发布其连接信息,以使其他服务了解如何连接到服务.随着应用向微服务和面向 ...

  3. 深度学习最佳实践系列——权重w初始化

    摘要: 本文是深度学习最佳实践系列博客之权重初始化,主要介绍权重初始化的相关问题及方法,文中提及的权重初始化方法均可以应用于普通的神经网络.卷积神经网络和递归神经网络之中. 作为深度学习的初学者,我有 ...

  4. 信创办公–基于WPS的PPT最佳实践系列 (将幻灯片组织成节的形式)

    信创办公–基于WPS的PPT最佳实践系列 (将幻灯片组织成节的形式) 目录 应用背景 操作步骤 1.创建节 2.节的功能 应用背景 当在处理一份内容较多的演示文稿时,为了更好的整理和查阅,我们可以将幻 ...

  5. 天云大数据_【案例分享】天云大数据最佳实践系列之——信用评分模型

    本文为天云大数据原创 大数据能力特有的性质,使其正在成为大型银行真正的核心竞争力.银行大数据能力表现在多方面,但大数据思维和数据挖掘能力是最关键.也是最重要的.天云大数据自成立以来,一直深耕于金融领域 ...

  6. 信创办公–基于WPS的EXCEL最佳实践系列 (筛选重要数据)

    信创办公–基于WPS的EXCEL最佳实践系列 (筛选重要数据) 目录 应用背景 操作步骤 1.筛选 2.高级筛选 应用背景 在WPS里,筛选有两种,一种是筛选,另外一种则是高级筛选. 操作步骤 1.筛 ...

  7. 信创办公--基于WPS的Word最佳实践系列(使用智能图形丰富表达内容)

    信创办公–基于WPS的Word最佳实践系列(使用智能图形丰富表达内容) 应用背景 在日常的工作中,我们经常会需要直观形象的表达出我们想要表达的内容,这个时候用图形的形式表达是最有力的方式,我们可以通过 ...

  8. 信创办公--基于WPS的Word最佳实践系列(目录的插入及更新)

    信创办公–基于WPS的Word最佳实践系列(目录的插入及更新) 1.项目背景 长文档都需要相应的标题,这就需要我们学习如何去规范排版插入目录及更新. 2.相关知识 目录与标题是相辅相成的 3.操作步骤 ...

  9. 信创办公--基于WPS的Word最佳实践系列(汇总目录)

    信创办公–基于WPS的Word最佳实践系列(汇总目录) 本系列基于WPS的Word进行最佳实践讲解,欢迎大家学习查看哦~ 信创办公–基于WPS的Word最佳实践系列(目录的插入及更新) 信创办公–基于 ...

  10. 信创办公--基于WPS的Word最佳实践系列(快速自定义访问工具栏)——以添加“输出为PPTX”命令为例

    信创办公–基于WPS的Word最佳实践系列(快速自定义访问工具栏)--以添加"输出为PPTX"命令为例 项目背景 工作中,我们通常需要在word中提炼出内容,再用PPT将内容呈现出 ...

最新文章

  1. 谈谈eclipse使用技巧一
  2. 国际青年日,神策数据召唤优(有)质(志)青年
  3. 3高并发服务器:多路IO之epoll
  4. .NET Conf 2019 今天在上海开幕,图片直播地址
  5. 禹洲:我们这一代人的困惑
  6. Public Key Retrieval is not allowed(已解决)
  7. MongoDB学习day10--数据库导入导出
  8. static使用之静态变量
  9. Unity基础知识结构总结
  10. ICode python 3级训练场判断能量状态第19关
  11. 为什么说c语言是关键字,为什么说C语言既有高级语言又有低级语言的特点
  12. 远程重启h3c路由器_H3C路由器远程登陆命令 -192.168.0.1 路由器怎么设置|192.168.1.1登陆|路由器设置密码-路由器网...
  13. 考研英语 长难句训练day12
  14. 帆软 ---- 单元格显示固定大小
  15. MTK: LSK,RSK的标签与响应
  16. 泰康人寿付刚:IT规划 SOA是目标
  17. 手机数据线种类有哪些
  18. 飞书开放平台Java-Sdk
  19. centos7虚拟机安装elasticsearch5.0.x-安装篇
  20. Android开发--构建项目安装包APK(debug版)

热门文章

  1. 2016年10月1日--国庆日晚上
  2. php switch(0) 的相关问题原因
  3. 制作水印的srt文件
  4. sass揭秘之@if,@for,@each
  5. 2020年Android应届生秋招技术面试题补充(飞猪、阿里云、小米、有赞)
  6. ORACLE中的rowid用法
  7. 1.2 选择组网模式
  8. 菜鸟实习——如何做一个PHP自动安装程序install.php
  9. 使用贝塞尔曲线算法实现毛笔签名效果
  10. redhat 7中配置与管理WEB服务器