使用HAProxy进行Postgresql 9.4的负载均衡

4

我已经使用BDR技术在4个节点(虚拟机)上进行了PostgreSQL的多主复制设置。

现在我想为高可用性添加负载均衡器。为此,我在另一台虚拟机上安装并配置了“HAProxy”,它监听5432/tcp以进行连接。 haproxy的配置如下:

listen pgsql_bdr *:5432
    mode tcp
    option  httpchk
    balance roundrobin
    server master 192.168.123.1:5432 check backup
    server slave1 192.168.123.2:5432 check
    server slave2 192.168.123.3:5432 check
    server slave3 192.168.123.4:5432 check

HAProxy服务器的IP地址是192.168.123.5。

我在我的应用程序中使用了HAproxy服务器的IP地址来连接数据库(必须将连接重定向到实际的数据库服务器)。但是此时我遇到了以下错误:

连接服务器时出错:服务器意外关闭了连接。这可能意味着在处理请求之前或期间服务器异常终止。

请注意,我尝试通过两种方式解决问题。第一,我在所有服务器上禁用了防火墙(HAProxy和所有postgres服务器),并尝试以以下配置替换:

listen pgsql_bdr 0.0.0.0:5432

或者

listen pgsql_bdr 127.0.0.1:5432

或者

listen pgsql_bdr localhost:5432

但在我的情况下,一切都不起作用。
请帮我解决问题。我在这种情况下做错了什么?
提前致谢!
2个回答

4

请检查您的Haproxy /stats,我猜测所有的后端都被标记为已下线,这可能是由于错误的检查方式导致的 - Postgres 可能不会响应200 - option httpchk。使用pgsql-check

option pgsql-check user healcheckuser

此外,我不了解BDR的要求/限制,但在从服务器设置中很常见,需要一些池管理器,例如pgbouncer - 它在客户端旁边或每个后端前面或者任何必要的地方。 编辑 要检查统计信息,您可以使用统计套接字:
# stats about all frontents and backends in a csv format
echo "show stat" | socat unix-connect:/run/haproxy/admin.sock stdio

# version, PID, current connections, session rates, tasks, etc
echo "show info" | socat unix-connect:/run/haproxy/admin.sock stdio

# sessions with the used backend/frontend, the source
echo "show sess" | socat unix-connect:/run/haproxy/admin.sock stdio

# informations about errors if there are any
echo "show errors" | socat unix-connect:/run/haproxy/admin.sock stdio

我测试了Postgres 9.4(一些从服务器,没有BDR),使用haproxy 1.5.14,没有检查。

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

listen pgsql *:15432
    mode tcp
    balance roundrobin
    server master dev1.db.fed:5432
    server slave1 dev2.db.fed:5432

我能够轻松连接无需任何问题:

root@lb:/# echo "show sess" | socat unix-connect:/run/haproxy/admin.sock stdio
0x20d89f0: proto=tcpv4 src=10.163.74.109:46815 fe=pgsql be=pgsql srv=slave1 ts=08 age=3m8s calls=3 rq[f=848202h,i=0,an=00h,rx=,wx=,ax=] rp[f=048202h,i=0,an=00h,rx=,wx=,ax=] s0=[7,8h,fd=1,ex=] s1=[7,8h,fd=2,ex=] exp=
0x20e11a0: proto=unix_stream src=unix:1 fe=GLOBAL be=<NONE> srv=<none> ts=09 age=0s calls=2 rq[f=c08200h,i=0,an=00h,rx=30s,wx=,ax=] rp[f=008002h,i=0,an=00h,rx=,wx=,ax=] s0=[7,8h,fd=3,ex=] s1=[7,0h,fd=-1,ex=] exp=30s

查询正在运行,数据正在到来,看起来还不错。

但是,目前我无法测试BDR。


1
谢谢您的回复。我也尝试了“option pgsql-check”,但仍然面临同样的问题。并且在端口5432和“mode tcp”下,/stats无法工作。请建议更多解决此问题的方法。 - Devesh Dashora

2
感谢大家。我通过执行以下命令解决了问题:
sudo setsebool -P haproxy_connect_any=1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接