PgBouncer: 常见问题

四月 13, 2024

摘要:本部分文档向您介绍 PgBouncer 中的常见问题。

如何连接到 PgBouncer?

PgBouncer 就像 PostgreSQL 服务器,所以只需简单的指定您的客户端到 PgBouncer 端口。

如何在几个服务器之间均衡的加载查询?

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

  1. DNS 循环。在一个 DNS 名称后面使用几个 IP。每次新的连接启动时,PgBouncer 都不会查找 DNS。 相反,它缓存所有IP并在内部循环。注意:如果一个名称后面有超过 8 个 IP, 则DNS后端必须支持 EDNS0 协议。详见 README。
  2. 使用TCP连接负载均衡器。LVS 或者 HAProxy是较好的选择。 在 PgBouncer 方面,最好让server_lifetime更小,也可以把server_round_robin打开 - 默认情况下,空闲连接由LIFO算法重用,当需要负载均衡时,这可能不太好。

如何进行故障转移

PgBouncer 没有内部的故障切换主机配置也没有检测。 可以通过一些外部工具实现:

  1. DNS 重新配置 - 当重新配置 DNS 名称后的 IP 时,pgbouncer 将重新连接到新服务器。 这个行为可以通过 2 个配置参数进行调整- 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 中禁用预备语句

要禁用服务器端的预备语句,PD0属性 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?

已弃用:可选的方案是,运行多个 pgbouncer 进程,以 so_reuseport 模式监听同一端口,这样就可以采用滚动重启了。

这和使用-R开关加载新的 PgBouncer 进程一样简单,并且配置相同:

$ pgbouncer -R -d config.ini

-R (reboot) 开关通过unix套接字让新的进程连接到老进程 (dbname=pgbouncer) 的控制台, 并发出下列命令:

SUSPEND;
SHOW FDS;
SHUTDOWN;

之后,如果新的进程发现旧进程已经结束了就恢复老的连接的工作。 魔法发生在SHOW FDS命令期间,该命令传送实际的文件描述符给新的进程。

如果接替工作不能正常进行,那么新的进程会被杀死,老的进程继续工作。

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

在控制台使用 SHOW CLIENTS 和 SHOW SERVERS 视图。

  1. 使用ptrlink映射本地客户端到服务器的连接。
  2. 使用客户端连接的addrport标识来自客户端的 TCP 连接。
  3. 使用local_addrlocal_port标识到服务器的 TCP 连接。

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

这要视情况而定。

当使用短连接时,在 Web 服务器上安装 PgBouncer 是很好的选择。然后,连接启动延迟可降至最低。因为 TCP 协议需要几次数据包往返才能使用连接。当有许多不同的主机(例如,Web 服务器)连接到数据库服务器时,在数据库服务器上安装 PgBouncer 是很好的选择。然后,它们的连接可以一起优化。

也可以同时在 Web 服务器和数据库服务器上安装 PgBouncer。带来的一个不利影响是,每次 PgBouncer 中转都会为每个查询增加少量延迟。

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