Mariadb主备集群搭配HAProxy时进程宕机无法自动故障转移的问题排查
Mariadb主备集群搭配HAProxy时进程宕机无法自动故障转移的问题排查
嗨,我来帮你捋捋这个问题!你的核心困扰是MySQL进程挂了但HAProxy没触发故障转移,这是因为当前的检测配置没精准触达MySQL服务的可用性,只是做了基础的TCP端口检测,或者检测逻辑的敏感度没调整到位。
问题根源分析
你已经配置了option mysql-check user haproxy,但默认的check参数行为存在局限:
- 默认检测间隔偏长(默认是5秒),且没设置连续失败的阈值,导致HAProxy没能快速识别MySQL进程已挂掉
- 可能
haproxy用户在MySQL中没有足够权限,导致mysql-check检测失效,HAProxy fallback到TCP端口检测——如果进程僵死导致端口仍被占用,就会误判节点正常
解决方案步骤
1. 优化HAProxy的MySQL检测配置
修改你的Mariadb-cluster监听块,给每个server添加更明确的检测参数:
listen Mariadb-cluster bind 0.0.0.0:3306 mode tcp option mysql-check user haproxy balance roundrobin # 主节点:每2秒检测一次,连续2次失败标记为不可用,连续2次成功恢复 server server1-DB1 1.1.1.1:13306 check inter 2s fall 2 rise 2 # 备节点:同样检测规则,backup标记为备用 server server2-2002-DB2 1.1.1.2:13306 check inter 2s fall 2 rise 2 backup
参数解释:
inter 2s:每2秒执行一次可用性检测fall 2:连续2次检测失败,就将节点标记为down状态rise 2:连续2次检测成功,恢复节点为up状态
2. 确保haproxy用户在MySQL中有检测权限
mysql-check本质是HAProxy用指定用户连接MySQL并执行SELECT 1查询,所以需要确保该用户存在且有基础权限:
-- 创建haproxy用户(允许从任何IP连接,密码可留空或设简单密码) CREATE USER 'haproxy'@'%' IDENTIFIED BY ''; -- 仅授予CONNECT权限(足够用于检测) GRANT USAGE ON *.* TO 'haproxy'@'%'; -- 刷新权限 FLUSH PRIVILEGES;
如果HAProxy和MySQL在同一机器,可将%改为localhost提升安全性。
3. 验证检测逻辑是否生效
手动停掉主节点的MySQL进程,然后访问HAProxy的统计页面(你的webinterface在9000端口),查看主节点是否被标记为down,流量是否自动切换到备节点。
额外建议
- 检查主节点MySQL进程挂掉后,13306端口是否真的释放:如果是进程僵死(比如OOM后未彻底退出),TCP端口可能仍被监听,此时TCP检测会误判,但
mysql-check会准确识别服务不可用,所以一定要依赖mysql-check而非纯TCP检测 - 你的Keepalived配置是保障HAProxy自身的高可用,和MySQL故障转移无关,当前配置无问题,可保留
备注:内容来源于stack exchange,提问作者Badb0y




