You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HAProxy的mysql-check选项在MySQL 8中失效,后端状态全DOWN

解决HAProxy对接MySQL 8的认证与健康检查失败问题

问题场景

使用以下HAProxy配置对接MySQL 8集群:

global
    user haproxy
    group haproxy
defaults
    mode http
    log global
    retries 2
    timeout connect 3000ms
    timeout server 5000ms
    timeout client 5000ms
listen stats
    bind 192.168.1.101:9999
    stats enable
    stats hide-version
    stats uri /stats
    stats auth statadmin:statadminpass
listen mysql-cluster
    bind 192.168.1.101:3306
    mode tcp
    option mysql-check user haproxy
    balance roundrobin
    server mysql-1 192.168.1.40:3306 check
    server mysql-2 192.168.1.41:3306 check

出现以下问题:

  • HAProxy统计页面中所有后端MySQL服务器状态均为DOWN
  • 错误日志显示:Layer7 wrong status: #08004Client does not support authentication protocol requested by server; consider upgrading MySQL client

尝试操作后的异常:

  1. 执行ALTER USER 'haproxy'@'%';后,认证错误依旧,但可通过mysql -u haproxy -p登录MySQL
  2. 执行ALTER USER 'haproxy'@'%' IDENTIFIED WITH mysql_native_password BY 'password';后,出现Access denied for user 'haproxy'@'192.168.1.41' (using password: NO),且无法通过无密码方式mysql -u haproxy -p登录

问题原因

  1. MySQL 8默认采用caching_sha2_password认证插件,而HAProxy的MySQL健康检查客户端不支持该协议,导致健康检查失败。
  2. 修改用户认证插件后出现权限错误,是因为HAProxy的option mysql-check user haproxy默认使用无密码方式连接,而修改后的用户设置了密码,触发无密码登录拒绝。

解决方案

1. 配置MySQL健康检查专用用户

在每个后端MySQL节点上执行以下SQL:

-- 先删除原有用户(若存在)
DROP USER IF EXISTS 'haproxy'@'%';
-- 创建无密码、使用mysql_native_password认证的健康检查用户
CREATE USER 'haproxy'@'%' IDENTIFIED WITH mysql_native_password;
-- 授予最小权限(仅需连接权限)
GRANT USAGE ON *.* TO 'haproxy'@'%';
FLUSH PRIVILEGES;

2. 调整HAProxy配置(可选)

如果需要给健康检查用户设置密码,需在mysql-cluster监听段中添加密码参数(与MySQL用户密码一致):

listen mysql-cluster
    bind 192.168.1.101:3306
    mode tcp
    option mysql-check user haproxy password your_password_here
    balance roundrobin
    server mysql-1 192.168.1.40:3306 check
    server mysql-2 192.168.1.41:3306 check

推荐使用无密码的专用健康检查用户,简化配置并降低风险。

3. 验证修复效果

  • 重启HAProxy:systemctl restart haproxy
  • 访问统计页面http://192.168.1.101:9999/stats,确认后端服务器状态变为UP
  • 测试代理连接:mysql -h 192.168.1.101 -u your_mysql_user -p,确认能正常访问后端节点

关键注意事项

  • HAProxy的MySQL健康检查仅支持mysql_native_password认证,不兼容MySQL 8默认的caching_sha2_password。
  • 健康检查用户只需USAGE权限,遵循最小权限原则,避免赋予不必要的权限。
  • 若使用带密码的健康检查用户,必须在HAProxy配置中同步指定密码,否则会触发无密码登录拒绝错误。

内容的提问来源于stack exchange,提问作者Arthem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:16:19