HAProxy 实验指南:从零开始搭建高可用负载均衡系统
引言
HAProxy(High Availability Proxy)是一款高性能的TCP/HTTP负载均衡器和代理服务器,广泛用于构建高可用、可扩展的Web架构。它由法国开发者Willy Tarreau于2000年开发,如今已成为开源社区和企业级应用中不可或缺的工具。HAProxy以其卓越的性能、灵活性和丰富的功能,被用于处理数百万并发连接的场景,例如大型网站、API网关、微服务架构等。
本文将通过一个完整的实验,带你一步步在RHEL 9系统上搭建HAProxy负载均衡环境,并深入探索其核心功能,包括七层和四层负载均衡、健康检查、访问控制、HTTPS配置、动态权重调整等。
HAProxy 简介
1. HAProxy 是什么?
HAProxy 是一个开源的高性能 TCP/HTTP 负载均衡器,主要用于分发网络流量到多个后端服务器。它支持基于 HTTP 和 TCP 协议的负载均衡,能够实现高可用性、会话保持、动态权重调整、健康检查等功能。HAProxy 的设计目标是提供一个可靠且高效的解决方案,以应对高并发、高流量的业务需求。
2. HAProxy 的核心特性
高性能:支持数万甚至数十万的并发连接。
灵活的负载均衡算法:支持轮询(Round Robin)、最少连接(LeastConn)、源地址哈希(Source Hash)、一致性哈希(Consistent Hash)等。
健康检查:自动检测后端服务器的健康状态,故障时自动切换。
会话保持:通过 Cookie 或源地址哈希实现会话粘性。
SSL/TLS 支持:支持 HTTPS 协议,提供加密通信。
动态配置:通过
socat
工具实现运行时动态调整后端服务器权重或状态。状态监控:提供 Web 状态页面,实时查看负载均衡器的运行状态。
3. HAProxy 的应用场景
Web 服务负载均衡:将流量分发到多个 Web 服务器,提高并发处理能力。
数据库负载均衡:分发数据库请求到多个 MySQL 或 PostgreSQL 实例。
API 网关:作为 API 请求的入口,实现流量控制、路由和安全策略。
微服务架构:在微服务中实现服务发现和负载均衡。
高可用架构:通过健康检查和故障转移,确保服务的持续可用性。
实验环境准备
1.机器角色分配:
HAProxy服务器(172.25.254.100)
后端服务器1(RS1)
后端服务器2(RS2)
客户端:172.25.254.103
2.所有机器基础配置
配置静态IP(根据上述分配)。
关闭防火墙(临时测试用,生产需配置规则)
关闭SELinxu
第一步:安装HAProxy和依赖
在HAProxy服务器(172.25.254.100)上执行:
1.安装HAProxy:
dnf install haproxy -y
2.启动并启用HAProxy服务:
systemctl start haproxy
systemctl enable haproxy
第三步: 配置HAProxy负载均衡
在HAProxy服务器(172.25.254.100)上执行:
1.编辑HAProxy配置文件:
vim /etc/haproxy/haproxy.cfg
2.配置内容
3.验证配置文件语法:
haproxy -c -f /etc/haproxy/haproxy.cfg-c:表示 "check"(检查)模式,仅验证配置文件的语法合法性,不会启动 HAProxy 服务
-f /etc/haproxy/haproxy.cfg:指定要检查的配置文件路径(这里是默认的配置文件路径)
如果提示 Configuration file is valid
,则配置正确。
4.重启HAProxy服务
systemctl restart haproxy
第四步:测试负载均衡
在客户端(192.168.0.103)上执行:
1.多次访问HAProxy服务器(172.25.254.100):
for i in {1..10}; do curl http://172.25.254.100; sleep 0.5; done
输出应交替显示RS和RS2,说明负载均衡生效。
第五步:配置健康检查
修改HAProxy配置文件:
1.编辑配置文件:
vim /etc/haproxy/haproxy.cfg
2.修改backend webcluster
部分,添加健康检查:
backend webclusterbalance roundrobinserver web1 192.168.0.101:80 checkserver web2 192.168.0.102:80 check
3.重启HAProxy:
systemctl restart haproxy
4.测试健康检查:
在RS1上停止Nginx服务:
systemctl stop nginx
再次运行客户端测试命令:
for i in {1..10}; do curl http://172.25.254.100; sleep 0.5; done
所有请求应只返回RS2 server - 192.168.0.102。
第六步:配置访问控制(ACL)
修改HAProxy配置文件:
1.编辑配置文件:
vim /etc/haproxy/haproxy.cfg
2.添加以下内容到defaults
段之后:
frontend webserverbind *:80acl block_curl hdr_sub(User-Agent) -i curlhttp-request deny if block_curldefault_backend webcluster
这将阻止使用curl
工具的访问。
3.重启HAProxy:
systemctl restart haproxy
4.测试ACL:
使用curl访问会失败:curl http://172.25.254.100
返回403 Forbidden。
将curl的请求头伪装为Firefox 128.0 浏览器,绕过基于User-Agent的拦截规则。
第七步:配置HTTPS
1.生成自签名证书:
1.1在HAProxy服务器上生成证书:
mkdir /etc/haproxy/certs
openssl req -newkey rsa:2048 -nodes -keyout /etc/haproxy/certs/haproxy.key -x509 -days 365 -out /etc/haproxy/certs/haproxy.crt
1.2合并证书和私钥:
cat /etc/haproxy/certs/haproxy.key /etc/haproxy/certs/haproxy.crt > /etc/haproxy/certs/haproxy.pem
2.修改HAProxy配置文件:
2.1编辑配置文件:
vim /etc/haproxy/haproxy.cfg
2.2添加以下配置:
3.重启HAProxy:
systemctl restart haproxy
4.测试
4.1HTTP请求测试:
HAproxy的80端口(HTTP)监听正常,触发了配置中的redirect scheme https code 301
规则。重定向逻辑正确,将 HTTP 请求强制导向 HTTPS 地址,符合预期。
4.2HTTPS请求测试:
HAProxy 的 443 端口(HTTPS)监听正常,SSL 证书配置有效(-k
参数跳过证书验证,适合测试环境)。
请求已成功转发到后端的 Nginx 服务器(172.25.254.101
或172.25.254.102
),后端服务器正常响应。
第八步:配置状态页
1.编辑配置文件:
vim /etc/haproxy/haproxy.cfg
2.在defaults
段之后添加状态页配置:
listen statsbind *:8888mode httpstats enablestats uri /haproxy-statusstats auth admin:admin123stats hide-versionstats refresh 2s
3.重启HAProxy:
systemctl restart haproxy
4.访问状态页:
浏览器访问
http://172.25.254.100:8888/haproxy-status
。用户名:
admin
,密码:admin123
。
第九步:动态调整后端服务器权重
通过 HAProxy 的 Unix 套接字(socket) 动态管理后端服务器(webcluster
组中的 web1
),无需重启 HAProxy 服务。
使用socat
工具:
1.安装socat
:
dnf install socat -y
2.修改HAProxy配置文件
授予socket管理员权限。(未修改前无法使用set weight
,是因为 HAProxy 默认对统计 socket 仅开放读取权限,限制了写入操作)
3.设置权重
# 查看 web1 权重
[root@haproxy ~]# echo "get weight webcluster/web1" | socat stdio /var/lib/haproxy/stats
1 (initial 1)
# 查看 web2 权重
[root@haproxy ~]# echo "get weight webcluster/web2" | socat stdio /var/lib/haproxy/stats
1 (initial 1)
# 设置 web2 权重
[root@haproxy ~]# echo "set weight webcluster/web2 2" | socat stdio /var/lib/haproxy/stats
# 验证 web2 权重
[root@haproxy ~]# echo "get weight webcluster/web2" | socat stdio /var/lib/haproxy/stats
2 (initial 1)
4.测试验证
5.禁用/启用后端服务器
# 禁用后端服务器 web1
echo "disable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
# # 启用后端服务器 web1
echo "enable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
第十步:配置四层负载均衡(TCP)
1.编辑配置文件:
vim /etc/haproxy/haproxy.cfg
2.添加以下内容:
listen mysql_portbind *:3306 # 监听所有IP的3306端口mode tcp # MySQL基于TCP协议balance leastconn # 最少连接数算法,适合数据库负载均衡server mysql1 172.25.254.101:3306 check inter 3s fall 3 rise 5 weight 2 # 后端服务器1,启动健康检查server mysql2 172.25.254.102:3306 check inter 3s fall 3 rise 5 weight 1 # 后端服务器2,启用健康检查
3.重启HAProxy:
systemctl restart haproxy
4.安装并启动mariadb:
在RS1和RS2上安装MySQL(或MariaDB)并配置监听3306端口。
# 两台机器都执行
dnf install mariadb-server -y # 安装
systemctl start mariadb # 启动
systemctl enable mariadb # 开机自启
5.配置数据库区分标识(方便验证负载均衡)
# (rs1):设置server-id=101
vim /etc/my.cnf
[mysqld]
server-id=101 # 唯一标识,区分不同服务器#(rs2):设置server-id=102
vim /etc/my.cnf
[mysqld]
server-id=102# 重启数据库使配置生效
systemctl restart mariadb
6.授权数据库访问(允许 HAProxy 转发的客户端连接)
# rs1和rs2都执行,授权用户admin(密码admin)从任何IP访问数据库
mysql -e "grant all on *.* to 'admin'@'%' identified by 'admin';"
mysql -e "flush privileges;" # 刷新权限
7.在Clinet上安装 MySQL 客户端(用于连接测试)
dnf install mariadb -y
8.在Client上测试 多次连接 HAProxy,查看分配结果
# 连接HAProxy服务器(IP为172.25.254.100),查询服务器标识
mysql -uadmin -padmin -h 172.25.254.100 -e "show variables like 'hostname'" # 查看主机名
mysql -uladmin -padmin -h 172.25.254.100 -e "select @@server_id" # 查看server-id
负载均衡配置已经成功生效:
多次访问
172.25.254.100
(HAProxy 节点)时,请求被交替分发到后端的 101(server_id=101
,主机名rs1
)和 102(server_id=102
,主机名rs2
)。admin
用户的权限配置正确,能够正常连接并执行查询命令(如show variables
和select @@server_id
)。结合之前的 HAProxy 配置(
balance leastconn
),这种交替返回的结果符合 “最少连接数” 负载均衡策略的预期(在连接数相近时会交替分配)。
总结
HAProxy 作为一款高性能、功能丰富的开源负载均衡器,是构建高可用架构的核心组件。通过本次实验,我们不仅掌握了其基础配置,还深入实践了动态管理、安全策略和四层负载均衡等高级功能。HAProxy 的灵活性和稳定性使其成为企业级应用的理想选择,未来可通过持续学习其高级特性(如 ACL 规则优化、SSL 终止加速等)进一步提升技能水平。