HAProxy 的“备份”失败

HAProxy 的“备份”失败

我有一个简单的配置,即 2 个 MySQL,由 HAProxy 进行负载平衡。出于一个不幸的原因,我需要在被动\主动模式下使用它们。所以我想将一个数据库配置为“备份”并进入休眠状态。但我错了。每当我将“备份”添加到服务器行时,HAProxy 都会抛出一个通信链接错误(本质上说“没有可用的数据库”(使用“备份”效果很好)。它只是不再将该服务器视为有效选项...

我尝试过这种配置:

听 mysql 10.0.0.109:3307

    mode tcp
    balance roundrobin
    option httpchk
    server db01 10.0.0.236:3306
    server db02 10.0.0.68:3306 backup

还有这个配置:

前端 mysql_proxy

    bind 10.0.0.109:3307
    default_backend mysql

后端mysql

mode tcp
balance roundrobin
option httpchk
server db01 10.0.0.236:3306  
server db02 10.0.0.68:3306 backup

什么都没起作用!

有人能给我指出正确的方向吗?

答案1

回答最初的问题:为什么该示例不起作用?有两点显而易见:

  1. 关键字check未添加到server声明中,这告诉 haproxy 在该服务器上使用健康检查指令。
  2. httpchk关键字最好与portonserver指令一起使用,以定义 HTTP 健康检查服务运行的位置。此方法假设您已在某处设置了报告主服务器健康状况的服务。

例如,我认为这样的事情会起作用(未经测试)

backend mysql
  mode tcp
  balance roundrobin
  option  httpchk GET /master_status
  server db01 10.0.0.236:3306 weight 100 check port 3305 inter 1s rise 3 fall 2
  server db02 10.0.0.68:3306 weight 100 check port 3305 inter 1s rise 3 fall 2 backup

/master_status在这个例子中,haproxy 会在每个 的 3305 端口上查询url server。如果服务器返回 2xx 状态码,则表示后端可以通过 haproxy 访问。否则,后端将处于离线状态。

为了解决健康检查服务的问题,您可以使用 ruby​​gem mysql_health。您将在参与 haproxy 集群的每个数据库服务器上运行此服务。

https://github.com/osterman/mysql_health

要启动健康检查服务,您可以运行以下命令:

/usr/bin/mysql_health --server:pid-file=/var/run/mysql_health.pid \
                      --log:file /var/log/mysql_health.log \
                      --server:daemonize \
                      --server:port 3305 \
                      --check:master \
                      --check:database mysql

还有更多可用的命令行选项。使用--help参数获取更多详细信息。

答案2

你使用的 haproxy 版本是哪个?如果你使用的是 1.4 版本,它支持 mysql 健康检查“option mysql-check”例如:

mode tcp
balance roundrobin
option tcplog
option mysql-check user haproxy
server svr1 svr1:3306 check inter 2s rise 2 fall 2
server svr2 svr2:3306 check backup inter 2s rise 2 fall 2

我的设置,它可以与 mysql master - master(使用活动待机)配合使用。

相关内容