ITPub博客

首页 > 数据库 > PostgreSQL > Pgbouncer最佳实践:系列一

Pgbouncer最佳实践:系列一

原创 PostgreSQL 作者:PostgreSQLChina 时间:2021-03-01 13:56:52 0 删除 编辑

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


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


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


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


1、 会话连接池

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


2、 事务连接池

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


3、 语句连接池

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


另外支持其他特性包括:

l 高性能,因为Pgbouncer 自身不需要查看整个数据包,所以在网络开销上仅为 2k (默认情况),对系统的内存要求小。

l 部署灵活:Pgbouncer 没有绑定到一台后端服务器。目标数据库可以驻留在不同的主机上。

l 可维护性强:支持大多数配置项的的在线重新配置;并且支持在线重启/ 升级,而不会断开客户端连接。

l 认证灵活:用户认证支持基于文件的验证方式外,还提供了数据库查询验证;网络连接认证与Postgresql 数据库一致,支持多种模式验证。

l 灵活连接数:支持全局、数据库、用户和客户端连接数组合形式设置。

(注:文中未详细描述部分,请参见Pgbouncer [1] 的官网相关文档,如配置手册、使用手册、FAQ 等官方文档)。


前面大致介绍了Pgbouncer 的一些特性 , 详细特性请查阅( ),下面将针对使用Pgbouncer 时的一些 配置注意 事项进行说明,为Pgbouncer 的使用用户提供一个指引, 满足复杂业务需求情况下 充分利用Pgbouncer 的特性来实现特定业务场景需求。


在对Pgbouncer 进行配置的过程中, 需要 特别关注 连接池模式 外,还需要明确 数据连接数 连接方式 最后则是 针对不同业务场景的Pgbouncer 部署形式


首先 讨论一下为什么使用连接池 [2] ,使用与不使用之间的性能差异,另外讨论 连接池模式的工作流程、细节及一些注意事项进行阐述 最后提供一个适合的连接池建议。


在我们进行Postgresql 入门的时候,通常会看到这段介绍“ P ostgreSQL 服务器可以处理来自客户端的多个并发连接。为此,它为每个连接启动( fork )新 进程, 从那时起,客户端和新 服务器进程进行通信,而无需原始postgres 进程进行干预。因此,主服务器进程始终在运行,等待客户端连接,而客户端及关联的服务器进程来来往往。 但是,这意味着每个新连接都会 分叉 一个新进程,保留 在内存中, 并可能在多个会话中变得过分繁忙。 在业务量较小的情况下,这种方式基本可以满足要求,但是当业务量迅速激增,我们可能就需要不断去更改 max_connections 来满足客户端的需求。当时同样也带来了很大的问题,如频繁的关闭和创建连接造成的内存开销,管理已产生的大量连接等等,最终导致服务器响应缓慢而无法对外提供数据库服务。在这样一个背景下,数据库连接池就被提出来了,对于使用Postgresql 数据库来说,一般分为客户端连接池,比如 c3p0 druid 等等;另外一种则是服务器端连接池,例如 pgbouncer odyssey pgpoolII 等。

1   直连数据库 服务器


这是 没有 连接池的PostgreSQL 连接生命周期:

1. 客户端通过请求并验证与服务器的连接来开始新会话。

2. 服务器 fork 一个新的系统进程来处理连接和工作会话。会话状态是通过服务器级,数据库级和用户级配置参数的组合 进行 初始化的。

3. 客户通过执行一个或多个事务来完成所需的工作。示例包括:

² 针对关系(表,视图等)执行读写

² 使用SET命令更改会话或事务状态

² 准备并执行 预编译 语句

4. 当客户端断开连接时,会话结束。

5. 服务器 销毁 会话进程。


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


关键点在于:

l 创建,管理和销毁连接过程会花费时间并消耗资源。

l 随着服务器的连接数增加,管理这些连接所需的资源也随之增加。 此外,随着客户端在服务器上进行处理,服务器的每 进程内存使用量将继续增长。

l 由于单个会话仅服务于单个客户端,因此客户端可以更改数据库会话的状态,并希望这些更改在后续的事务中继续存在。


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

2   使用连接池连接 数据库


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

l 接受和管理来自客户端的连接

l 建立和维护与服务器的连接

l 将服务器连接分配给客户端连接


特点

l 单个服务器连接可处理来自不同客户端的会话,事务和语句

l 单个客户端会话的事务和/或语句可在不同的服务器连接上运行


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


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


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


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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69978989/viewspace-2760224/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
开源是一种商业模式适合于中国

注册时间:2020-07-22

  • 博文量
    62
  • 访问量
    28104