You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动