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
尝试操作后的异常:
- 执行
ALTER USER 'haproxy'@'%';后,认证错误依旧,但可通过mysql -u haproxy -p登录MySQL - 执行
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登录
问题原因
- MySQL 8默认采用
caching_sha2_password认证插件,而HAProxy的MySQL健康检查客户端不支持该协议,导致健康检查失败。 - 修改用户认证插件后出现权限错误,是因为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
相关产品推荐
相关产品推荐

