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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:12:45