我已经在4个节点(虚拟机)中使用BDR(双向复制)设置了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地址来连接数据库(必须将连接重定向到实际的数据库服务器)。但那时我得到了以下错误:
连接到服务器时出错:服务器意外关闭了连接。这可能意味着服务器在处理请求之前或处理时异常终止。
请注意我尝试使用2种方式解决问题。第一,我在所有服务器(HAProxy和所有postgres服务器)上禁用防火墙,并且我尝试用以下内容替换配置:
listen pgsql_bdr 0.0.0.0:5432
或
listen pgsql_bdr 127.0.0.1:5432
或
listen pgsql_bdr localhost:5432
但在我的情况下,一切都不起作用。
请帮我解决问题。我在这种情况下做错了什么?
提前致谢!
答案 0 :(得分: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 :(得分:2)
感谢所有人。我通过执行以下命令解决了这个问题:
sudo setsebool -P haproxy_connect_any=1