HAProxy 和 postgres

HAProxy 和 postgres

我的 haproxy 配置如下,后端有 pg_autoctl 集群,另一台 VM(bunty4)托管监视器并在其上安装了 haproxy。

global
    maxconn 100

defaults
    log global
    mode tcp
    retries 2
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s

listen stats
    mode tcp
    bind *:7000
    stats enable
    stats uri /

listen ReadWrite
    bind *:5000
    option httpchk
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server bunty1 bunty1:6001 maxconn 100 check port 23267
    server bunty2 bunty2:6002 maxconn 100 check port 23267
    server bunty3 bunty3:6003 maxconn 100 check port 23267

listen ReadOnly
    bind *:5001
    option httpchk
    http-check expect status 206
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server bunty1 bunty1:6001 maxconn 100 check port 23267
    server bunty2 bunty2:6002 maxconn 100 check port 23267
    server bunty3 bunty3:6003 maxconn 100 check port 23267

运行良好:

postgres@bunty4:~$ psql -h bunty2 -p 6002
psql (14.6 (Ubuntu 14.6-1.pgdg22.04+1))
Type "help" for help.

postgres=# \q
postgres@bunty4:~$ psql -h bunty1 -p 6001
psql (14.6 (Ubuntu 14.6-1.pgdg22.04+1))
Type "help" for help.

当我尝试连接前端端口 7000(通过 pgadmin 或 cli)时出现错误:

postgres@bunty4:~$ psql -h localhost -p 7000
psql: error: connection to server at "localhost" (127.0.0.1), port 7000 failed: server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.

psql -h 192.168.5.129 -p 7000   ## this also fails with same error.

不知道为什么,haproxy.log 没有抛出任何东西。

答案1

在此配置中,平衡器上的 haproxy 端口 7000 监听器没有后端,而是有stats enable。这意味着它被保留用于显示haproxy 统计数据。但是,它被错误地配置为 tcp 模式;统计页面需要 http。因此,将其设置为mode http并尝试使用 Web 浏览器连接到 bunty4:7000。它将显示一个不错的统计网页。

似乎 psql 或其他 PostgreSQL 客户端应该连接到 haproxy (bunty4) 端口 5000 进行写入和读取,或连接到端口 5001 进行读取。但是,这些端口背后的确切逻辑隐藏在端口 23267 上的服务中,该服务以某种方式决定其实例是只读还是读写,并报告相应的状态 206 或 200;从您展示的内容来看,这些端口的作用并不明显。它们的名称是唯一的提示。

另外,我不明白为什么不同的服务器在不同的端口上托管服务。这使得后端配置不太对称,因此很糟糕,因为它们理想情况下应该是彼此的精确克隆。对我来说,如果 PostgreSQL 是机器上唯一的服务,那么在默认端口 5432 上托管它是很自然的,这似乎对所有三个后端服务器都是如此。

相关内容