HAProxy出现MySQL连接超时但Stats页面显示服务器正常的问题求助
从你的日志和配置来看,核心问题是HAProxy没有正确将TCP请求转发到MySQL后端,日志里的<NOSRV>标记说明HAProxy未能选择任何可用的后端服务器处理请求,尽管健康检查显示正常。下面是具体的排查和解决步骤:
1. 修复MySQL后端的Mode配置(最可能的根源)
你的defaults块默认设置了mode http,而MySQL相关的frontend已经显式声明mode tcp,但所有MySQL的backend(mysql_rw_back、mysql_r_back、mysql_w_back)都没有同步设置mode tcp,这会导致后端继承默认的HTTP模式。HAProxy在HTTP模式下无法正确解析MySQL的TCP协议请求,自然无法建立有效连接。
解决方法:在每个MySQL后端块中添加mode tcp,与前端的TCP模式匹配,示例如下:
backend mysql_r_back mode tcp # 新增该行,明确指定TCP模式 option tcpka option mysql-check user haproxy_check server db01 192.168.202.82:3306 check port 3306 server db02 192.168.196.13:3306 check port 3306 server db03 192.168.137.135:3306 check port 3306 backup
2. 验证MySQL健康检查的有效性
虽然Stats页面显示服务器状态正常,但需要确认haproxy_check用户的权限配置是否正确:
- 确保所有MySQL服务器上都创建了
haproxy_check用户,并且允许HAProxy服务器的IP无密码连接:CREATE USER 'haproxy_check'@'你的HAProxy服务器IP' IDENTIFIED BY ''; FLUSH PRIVILEGES; - 如果
haproxy_check用户设置了密码,需要在option mysql-check中补充密码参数:option mysql-check user haproxy_check password '你的检查用户密码'
3. 调整连接超时设置
日志中的50001表示连接超时达到了50秒,而你的defaults中timeout connect仅设置为5秒,这可能是应用服务器的连接超时设置更长,导致HAProxy等待超时。建议在MySQL相关的frontend/backend中单独调整超时:
backend mysql_r_back mode tcp timeout connect 10000 # 调整为10秒,可根据实际场景微调 # 其他配置项...
4. 验证配置语法并重启HAProxy
修改配置后,先检查语法是否合法:
haproxy -c -f /etc/haproxy/haproxy.cfg
如果没有报错,重启HAProxy服务使配置生效:
systemctl restart haproxy
额外验证步骤
- 从应用服务器(192.168.195.230)执行
telnet HAProxy_IP 3308,确认端口可达; - 查看HAProxy Stats页面,观察MySQL后端的
CurrConns数值是否有变化,验证连接是否成功建立。
内容的提问来源于stack exchange,提问作者Keith Kraemer
相关产品推荐
相关产品推荐

