PgBouncer: PostgreSQL 的轻量级连接池

四月 14, 2024

摘要:PgBouncer 是 PostgreSQL 的一个轻量级连接池程序。

描述

pgbouncer 是一个 PostgreSQL 连接池。任何目标应用程序都可以连接到 pgbouncer,就像它是 PostgreSQL 服务器一样,pgbouncer 将创建到实际服务器的连接,或者它将重用其中一个现有的连接。

pgbouncer 的目的是为了降低打开 PostgreSQL 新连接时的性能影响。

为了不影响连接池的事务语义,pgbouncer 在切换连接时支持多种类型的池:

  • 会话连接池

    最礼貌的方法。当客户端连接时,将在客户端保持连接的整个持续时间内分配一个服务器连接。当客户端断开连接时,服务器连接将放回到连接池中。这是默认的方法。

  • 事务连接池

    服务器连接只有在一个事务里的时候才赋予客户端。在 PgBouncer 注意到事务结束的时候,服务器连接将会放回连接池中。

  • 语句连接池

    最激进的模式。在查询完成后,服务器连接将立即被放回连接池中。这个模式中不允许多语句的事务,因为它们会中断。

pgbouncer 的管理接口,由连接到特殊“虚拟”数据库pgbouncer时,一些新的可用的SHOW命令组成。

主要特性

  • 支持几种不同的连接模式:

    • 会话级连接池

      最礼貌的方法。在客户端连接的时候,在它的连接生命期内, 会给它赋予一个服务器连接。在客户端断开的时候,服务器连接会放回到连接池中。

    • 事务级连接池

      仅在事务期间将服务器连接分配给客户端。当 PgBouncer 注意到该事务结束时, 服务器将被放回到池中。它打破了应用程序对后端连接的期望。 只有在应用配合这样的使用模式,没有使用会破坏这种使用模式的时候才能用这个连接方式。 参阅下表获取会破坏这种模式的特性。

    • 语句级连接池

      最积极的方法。这是一个事务池的一个扭曲的变种,不允许执行多语句事务。 这意味着在客户端上强制 “autocommit” 模式,主要针对 PL/Proxy。

  • 内存需求低(默认是每个连接 2K)。这是因为 PgBouncer 不需要一次性查看所有包。

  • 它不绑定到一个后端服务器,目标数据库可以位于不同的主机上。

  • 支持在线重新配置大部分设置。

  • 支持在线重启/升级,而不用删除客户端连接。

池模式的 SQL 功能图

下面的表列出了各种 PostgreSQL 特性,和它们是否能与 PgBouncer 池模式一起共用。请注意,“事务”池打破了客户端对服务器的期望, 只有在应用程序不使用非工作功能的情况下才能使用。

特性 会话池 事务池
启动参数 [1] 支持 支持
SET/RESET 支持 从不支持
LISTEN 支持 从不支持
NOTIFY 支持 支持
WITHOUT HOLD CURSOR 支持 支持
WITH HOLD CURSOR 支持 从不支持
协议级预备计划 支持 支持 [2]
PREPARE / DEALLOCATE 支持 从不支持
ON COMMIT DROP 临时表 支持 支持
PRESERVE/DELETE ROWS 临时表 支持 从不支持
重置缓存的计划 支持 支持
LOAD 语句 支持 从不支持
会话级咨询锁 支持 从不支持

[1]. 启动参数有:client_encodingDateStyleIntervalStyleTimezonestandard_conforming_stringsapplication_name。PgBouncer 会检测它们的更改,因此可以保证它们对客户端保持一致。如果您需要 PgBouncer 支持更多功能,请查看track_extra_parametersignore_startup_parameters

[2]. 您需要将max_prepared_statements更改为一个非零值,以启用此支持。