我有一个简单的配置,即 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
回答最初的问题:为什么该示例不起作用?有两点显而易见:
- 关键字
check
未添加到server
声明中,这告诉 haproxy 在该服务器上使用健康检查指令。 - 该
httpchk
关键字最好与port
onserver
指令一起使用,以定义 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 访问。否则,后端将处于离线状态。
为了解决健康检查服务的问题,您可以使用 rubygem 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(使用活动待机)配合使用。