如何连接到 PgBouncer?
PgBouncer 就像 PostgreSQL 服务器,所以只需简单的指定您的客户端到 PgBouncer 端口。
如何在几个服务器之间均衡的加载查询?
PgBouncer 没有内部多主机配置。 可以通过一些额外的工具实现:
如何进行故障转移
PgBouncer 没有内部的故障切换主机配置也没有检测。 可以通过一些外部工具实现:
会话池如何使用预备语句?
在会话池模式,重置查询必须清理老的预备语句。这可以通过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 视图。
PgBouncer 应该安装在 webserver 还是数据库服务器上?
这要视情况而定。
当使用短连接时,在 Web 服务器上安装 PgBouncer 是很好的选择。然后,连接启动延迟可降至最低。因为 TCP 协议需要几次数据包往返才能使用连接。当有许多不同的主机(例如,Web 服务器)连接到数据库服务器时,在数据库服务器上安装 PgBouncer 是很好的选择。然后,它们的连接可以一起优化。
也可以同时在 Web 服务器和数据库服务器上安装 PgBouncer。带来的一个不利影响是,每次 PgBouncer 中转都会为每个查询增加少量延迟。
最后,您需要测试哪种模型最适合您的性能需求。您还应该考虑在 Web 服务器与数据库服务器异常时,安装 PgBouncer 会怎样影响应用程序的故障转移。