【问题标题】:Load Balancing using HAProxy for Postgresql 9.4使用 HAProxy for Postgresql 9.4 进行负载平衡
【发布时间】:2015-12-29 12:48:46
【问题描述】:

我已经在 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

但在我的情况下一切都不起作用。

请帮我解决问题。在这种情况下我做错了什么?

提前致谢!

【问题讨论】:

    标签: load-balancing postgresql-9.3 database-replication haproxy multi-master-replication


    【解决方案1】:

    检查你的haproxy /stats,我猜所有的后端都被标记了,由于错误的检查-postgres 可能不会响应200 - option httpchk。使用pgsql-check

    option pgsql-check user healcheckuser
    

    我也不知道 BDR 要求/限制,但在从属设置中很常见,有一些 pooler,例如pgbouncer - 在客户端旁边,或者在每个后端之前,或者任何需要的地方。

    编辑

    要检查统计信息,您可以使用 stats socket:

    # 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。

    【讨论】:

    • 感谢您的回复。我也尝试了“选项 pgsql-check”,但我仍然面临同样的问题。并且 /stats 不适用于端口 5432 和“mode tcp”。请提出更多解决此问题的方法。
    【解决方案2】:

    谢谢大家。我已经通过执行以下命令解决了这个问题:

    sudo setsebool -P haproxy_connect_any=1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 2016-11-25
      相关资源
      最近更新 更多