我准备开始使用 PGBouncer,但我不确定它应该用在数据库服务器上还是应用服务器上。如果用在应用服务器上,必然会有多个连接池,而应用服务器共享一个中央连接池,但这样一来,TCP 连接就必须为每个新查询重新创建,而不是也加入到池中,大概如此。哪种方式才是使用 PGBouncer 这样的连接查看器的“正确”方式,我对每种方式的论述是否正确?
笔记:
对于那些偶然遇到这个问题的人,请参阅PgBouncer 常见问题解答(最后一个问题)。
答案1
就我个人而言,我会将其放在应用服务器上。原因如下。
PGBouncer 基本上实现了连接池,这是一个很有用的功能(尽管有时很烦人),它通过消除建立新数据库连接的成本来减少总体应用程序延迟。在许多情况下,这是由数据库连接驱动程序本身完成的 - 请参阅 Windows 上的 ADO.NET MSSQL 驱动程序、PHP 上的 PDO 等。主要目的是最大限度地减少代码说“我需要与数据库对话”和真正开始发出 SQL 命令之间的时间成本。
上面提到的驱动程序实现了连接池,因此在数据库可以接收 SQL 命令之前代码几乎不需要做任何操作。
PGBouncer 的情况比较奇怪,因为您仍然需要打开与 PGBouncer 守护进程的连接,无论它位于何处。由于您试图最小化连接时间,因此将守护进程尽可能靠近应用程序代码是合理的。理想情况下,您可以通过同一台机器上的套接字进行连接,这样您就不必经过繁琐的 TCP 流程才能到达连接池。
不过,就像所有事情一样,YMMV。测试,测试,然后再测试。