HAProxy 配置 TCP 模式转发 MySQL 数据库连接怎么做?
HAProxy 通过 TCP 模式(mode tcp)转发 MySQL 连接时,配置端口通常为 3307 或 3333,超时时间建议设置为 connect 10s、client/server 各 1m,可支持 3000-8000 并发连接。
原因分析
HAProxy 支持两种工作模式:TCP 模式(4 层)和 HTTP 模式(7 层)。对于 MySQL 数据库连接,必须使用 TCP 模式,因为 MySQL 协议是二进制协议而非 HTTP 协议。根据 2024 年 5 月 6 日的实测记录,配置 mode tcp 后,HAProxy 可以正确透传 MySQL 握手包和数据包,客户端通过命令 mysql -uhaproxy -p123456 -P 3307 -h192.168.147.131 成功连接,返回 Server version: 5.5.60-MariaDB-wsrep。
TCP 模式的核心优势在于:不解析应用层协议,仅做连接转发,延迟更低。配置文件中的 key 参数包括 mode tcp、balance roundrobin/leastconn、timeout connect/client/server 等。
解决方案
步骤 1:安装 HAProxy
在 Ubuntu 系统上使用 APT 包管理器安装(2023 年 9 月 1 日记录):
sudo apt update
sudo apt install haproxy
或从源码编译(2025 年 12 月 21 日记录,版本 haproxy-2.1.4):
tar zxvf haproxy-2.1.4.tar.gz
cd haproxy-2.1.4
make TARGET=linux3100 ARCH=x86_64
make install PREFIX=/opt/haproxy
编译时可能遇到报错:more undefined references to `clock_gettime' follow,解决方法是在 Makefile 的 OPTIONS_LDFLAGS 中添加 -lrt 链接实时库。
步骤 2:配置 haproxy.cfg
编辑配置文件 /etc/haproxy/haproxy.cfg,以下是 2024 年 5 月 6 日实测可用的配置:
defaults
mode tcp
log global
option tcplog
timeout connect 10s
timeout client 1m
timeout server 1m
maxconn 3000
frontend mysql
bind 0.0.0.0:3307
mode tcp
default_backend mysql_server
backend mysql_server
balance roundrobin
server mysql1 192.168.147.132:3306 check inter 5s rise 2 fall 3
server mysql2 192.168.147.133:3306 check inter 5s rise 2 fall 3
不同来源的超时设置存在差异:2022 年 1 月 24 日的配置使用 timeout client 360m、timeout server 360m,适用于长连接场景;2021 年 1 月 19 日的配置使用 timeout connect 5000ms、timeout client 30000ms,适用于短连接高频访问场景。
步骤 3:配置 MySQL 服务器
在 MySQL 服务器上执行(2024 年 5 月 6 日记录):
create database haproxydb;
grant all on haproxydb.* to 'haproxy'@'%' identified by '123456';
flush privileges;
修改 /etc/mysql/my.cnf,将 bind-address=127.0.0.1 改为服务器实际 IP 地址,允许远程连接(2023 年 9 月 1 日记录)。
步骤 4:重启服务并测试
重启 HAProxy 服务:
systemctl restart haproxy
ss -ntl | grep 3307
验证监听状态应显示:LISTEN 0 128 *:3307 *:*
客户端测试连接(2024 年 5 月 6 日实测):
mysql -uhaproxy -p123456 -P 3307 -h192.168.147.131
show databases;
select user();
步骤 5:配置监控页面(可选)
添加统计页面配置(2026 年 4 月 14 日资料):
listen stats
mode http
bind 0.0.0.0:1080
stats enable
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth admin:admin
访问 http://HAProxy_IP:1080/haproxyadmin?stats 可查看后端服务器状态。
注意事项
1. 健康检查配置:HAProxy 默认支持 option mysql-check,但 2025 年 12 月 21 日的资料指出,对于 MySQL 组复制 (MGR) 或 Galera 集群,默认检查无法验证主从复制状态,需要使用外部脚本配合 httpchk,健康结果用 HTTP 200 表示,不健康用 HTTP 503 表示。
2. 端口冲突:如果 MySQL 默认使用 3306 端口,HAProxy 前端建议绑定 3307 或 3333 端口避免冲突(2022 年 1 月 24 日资料使用 3333 端口)。
3. 最大连接数设置:不同场景推荐值不同,默认 3000,高并发场景可设为 8000 或 20000(2022 年 1 月 24 日资料),但需同时调整 ulimit-n 参数。
4. 负载均衡算法:roundrobin 适用于服务器性能相近场景,leastconn 适用于连接时长差异大的场景(2024 年 5 月 6 日资料使用 leastconn)。
5. SSL 透传:如需加密连接,可配置 bind *:443 ssl crt /etc/ssl/certs/haproxy.pem,但 2023 年 9 月 11 日资料提醒,客户端连接命令需改为 mysql -u username -p -h haproxy-server -P 443。
参考来源
来源:CSDN - HAProxy 实现 TCP 负载均衡与 MySQL 连接(2023 年 9 月 1 日)
来源:博客园 - haproxy tcp 转发配置(2024 年 5 月 6 日)
来源:51CTO - HAProxy 端口转发到 Mysql(2022 年 1 月 24 日)
来源:GitHub/Gitee - haproxy 代理 mysql galera 编译与健康检查(2025 年 12 月 21 日)