使用 HAProxy 和 PGBouncer 的 PostgreSQL 高可用性/可扩展性

Nic*_*art 19 postgresql scalability high-availability pgbouncer load-balancing

我有多个用于 Web 应用程序的 PostgreSQL 服务器。通常在热备模式(异步流复制)下一个主多从。

我使用 PGBouncer 进行连接池:安装在每个 PG 服务器(端口 6432)上的一个实例连接到本地主机上的数据库。我使用事务池模式。

为了在从站上平衡我的只读连接,我使用 HAProxy (v1.5) 和 conf 或多或少像这样:

listen pgsql_pool 0.0.0.0:10001
        mode tcp
        option pgsql-check user ha
        balance roundrobin
        server master 10.0.0.1:6432 check backup
        server slave1 10.0.0.2:6432 check
        server slave2 10.0.0.3:6432 check
        server slave3 10.0.0.4:6432 check
Run Code Online (Sandbox Code Playgroud)

因此,我的 Web 应用程序连接到 haproxy(端口 10001),即在每个 PG 从站上配置的多个 pgbouncer 上的负载平衡连接。

这是我当前架构的表示图:

haproxy > pgbouncer > postgresql

这很有效,但我意识到有些人的实现方式完全不同:Web 应用程序连接到单个 PGBouncer 实例,该实例连接到 HAproxy,它在多个 PG 服务器上进行负载平衡:

pgbouncer > haproxy > postgresql

最好的方法是什么?第一个(我现在的)还是第二个?一种解决方案相对于另一种解决方案有什么优势吗?

谢谢

小智 11

您现有的 HAProxy -> PGBouncer -> PGServer 方法配置更好。这只有效。原因如下:HAProxy 将连接重定向到不同的服务器。这会导致数据库连接中的 MAC 地址发生变化。因此,如果 PGBouncer 高于 HAProxy,则每次池中的连接都会因 MAC 地址更改而失效。


don*_*llo 7

pgbouncer 使用 postgres 服务器维护池中的连接。TCP 连接建立时间在高容量环境中很重要。

发出大量数据库请求的客户端必须为每个请求设置与远程 PGBouncer 的连接。这比在本地运行 PgBouncer(因此应用程序在本地连接到 pgbouncer)更昂贵,并且 pgBouncer 维护与远程 PG 服务器的连接池。

因此,IMO,PGBouncer -> HAProxy -> PGServer 似乎比 HAProxy -> PGBouncer -> PGServer 更好,尤其是当 PGBouncer 位于客户端应用程序本地时。