如何连接到 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. 使用ptr和link映射本地客户端到服务器的连接。
- 2. 使用客户端连接的addr和port标识来自客户端的 TCP 连接。
- 3. 使用local_addr和local_port标识到服务器的 TCP 连接。
PgBouncer 应该安装在 webserver 还是数据库服务器上?
这要视情况而定。
当使用短连接时,在 Web 服务器上安装 PgBouncer 是很好的选择。然后,连接启动延迟可降至最低。因为 TCP 协议需要几次数据包往返才能使用连接。当有许多不同的主机(例如,Web 服务器)连接到数据库服务器时,在数据库服务器上安装 PgBouncer 是很好的选择。然后,它们的连接可以一起优化。
也可以同时在 Web 服务器和数据库服务器上安装 PgBouncer。带来的一个不利影响是,每次 PgBouncer 中转都会为每个查询增加少量延迟。
最后,您需要测试哪种模型最适合您的性能需求。您还应该考虑在 Web 服务器与数据库服务器异常时,安装 PgBouncer 会怎样影响应用程序的故障转移。