暂无图片
暂无图片
2
暂无图片
暂无图片
1
暂无图片

PG 轻量级连接池 PgBouncer 1.20.0 发布,跟踪 PostgreSQL 设置更新

原创 通讯员 2023-07-21
561

2023年7月20日,PgBouncer 1.20.0 已发布。此版本不推荐使用该标志的在线重新启动功能-R,而so_reuseport应用于在线重新启动。它还引入了对使用新track_extra_parameters设置跟踪 PostgreSQL 设置的更好支持,可 search_path与 Citus 12.0+ 结合使用进行跟踪。它还添加了一些其他功能,例如默认使用 TLS 连接、在身份验证阶段转发错误代码以及对options启动参数的支持。最后它还修复了一些小错误。

PgBouncer 1.20.0下载:https://www.pgbouncer.org/downloads/files/1.20.0/pgbouncer-1.20.0.tar.gz


PgBouncer 是 PostgreSQL 的轻量级连接池。

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

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

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

1、会话连接池

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

2、事务连接池

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

3、语句连接池

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

另外支持其他特性包括:

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


PgBouncer常见问题解答

如何连接到 PgBouncer?

PgBouncer 充当 Postgres 服务器,因此只需将客户端指向 PgBouncer 端口即可。

如何在多台服务器之间实现负载平衡查询?

PgBouncer 没有内部多主机配置。可以通过外部工具实现:

  1. DNS 循环。在一个 DNS 名称后面使用多个 IP。PgBouncer 不会在每次启动新连接时查找 DNS。相反,它会缓存所有 IP 并在内部进行循环。注意:如果一个名称后面有超过8个IP,则DNS后端必须支持EDNS0协议。有关详细信息,请参阅自述文件。

  2. 使用 TCP 连接负载平衡器。LVS或 HAProxy似乎 都是不错的选择。server_lifetime在 PgBouncer 方面,缩小并打开可能是一个好主意server_round_robin:默认情况下,后进先出算法会重用空闲连接,当需要负载平衡时,该算法可能效果不太好。

如何进行故障转移

PgBouncer 没有内部故障转移主机配置或检测。可以使用外部工具:

  1. DNS 重新配置:当重新配置 DNS 名称后面的 IP 地址时,PgBouncer 将重新连接到新服务器。这一行为可以通过两个配置参数进行调整: dns_max_ttl调整一个主机名的生命周期,以及 dns_zone_check_period调整查询区域 SOA 更改的频率。如果区域 SOA 记录发生更改,PgBouncer 将重新查询该区域下的所有主机名。

  2. 将新主机写入配置并让 PgBouncer 重新加载它:发送 SIGHUP 或使用RELOAD控制台上的命令。PgBouncer 将检测更改的主机配置并重新连接到新服务器。

  3. 使用RECONNECT命令。这适用于上述两个选项都不适用的情况,例如,当您使用上述 HAProxy 从 PgBouncer 向下游路由连接时。 RECONNECT只是导致所有服务器连接重新打开。因此,在其他组件更改其连接路由信息后运行该命令。

如何将准备好的语句与会话池一起使用?

在会话池模式下,重置查询必须清除旧的准备好的语句。这可以通过server_reset_query = DISCARD ALL; 或至少实现DEALLOCATE ALL;

如何将准备好的语句与事务池结合使用?

要使准备好的语句在此模式下工作,需要 PgBouncer 在内部跟踪它们,但它并没有这样做。因此,在此模式下继续使用 PgBouncer 的唯一方法是禁用客户端中的预准备语句。

在 JDBC 中禁用准备好的语句

对于 JDBC 来说,正确的方法是将prepareThreshold=0 参数添加到连接字符串中。

禁用 PHP/PDO 中的预准备语句

要禁用服务器端准备好的语句,PDO 属性 PDO::ATTR_EMULATE_PREPARES必须设置为true在连接时:

$db = new PDO("dsn", "user", "pass", array(PDO::ATTR_EMULATE_PREPARES => true));
复制

或稍后:

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
复制

如何在不断开连接的情况下升级 PgBouncer?

[ 这无法通过 TLS 连接来完成。]

这就像使用交换机-R 和相同配置启动新的 PgBouncer 进程一样简单:

$ pgbouncer -R -d config.ini
复制

(reboot)开关-R使新进程通过 Unix 套接字连接到旧进程的控制台 (dbname=pgbouncer) 并发出以下命令:

SUSPEND;
SHOW FDS;
SHUTDOWN;
复制

之后,如果新连接发现旧连接已消失,它将恢复与旧连接的工作。魔法发生在 SHOW FDS将实际文件描述符传输到新进程的命令期间。

如果由于某种原因接管不起作用,则可以简单地终止新进程。旧的注意到了这一点并恢复了工作。

如何知道哪个客户端连接到哪个服务器?

使用控制台上的SHOW CLIENTS和命令。SHOW SERVERS

  1. 使用ptrlink将本地客户端连接映射到服务器连接。

  2. 使用客户端连接的addrport来识别来自客户端的 TCP 连接。

  3. 使用local_addrlocal_port来识别与服务器的 TCP 连接。

PgBouncer应该安装在Web服务器还是数据库服务器上?

这取决于。

当使用短期连接时,在 Web 服务器上安装 PgBouncer 是很好的选择。然后连接建立延迟就会最小化。(在连接可用之前,TCP 需要几次数据包往返。)当有许多不同的主机(例如,Web 服务器)连接到数据库服务器时,在数据库服务器上安装 PgBouncer 是很好的选择。然后可以一起优化它们的连接。

也可以在 Web 服务器和数据库服务器上安装 PgBouncer。其一个负面影响是每个 PgBouncer 跳跃都会给每个查询增加少量的延迟。

最后,您需要测试哪种模型最适合您的性能需求。您还应该考虑在 Web 服务器与数据库服务器发生故障时安装 PgBouncer 将如何影响应用程序的故障转移。



请参阅https://www.pgbouncer.org/2023/07/pgbouncer-1-20-0了解更多信息、详细变更日志和下载链接。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

november_rain
暂无图片
1年前
评论
暂无图片 0
PG 轻量级连接池 PgBouncer 1.20.0 发布,跟踪 PostgreSQL 设置更新
1年前
暂无图片 点赞
评论