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 webcluster
    balance roundrobin
    server web1 192.168.0.101:80 check
    server 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 webserver
    bind *:80
    acl block_curl hdr_sub(User-Agent) -i curl
    http-request deny if block_curl
    default_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.101172.25.254.102),后端服务器正常响应。

第八步:配置状态页

1.编辑配置文件:

复制代码
vim /etc/haproxy/haproxy.cfg

2.在defaults段之后添加状态页配置:

复制代码
listen stats
    bind *:8888
    mode http
    stats enable
    stats uri /haproxy-status
    stats auth admin:admin123
    stats hide-version
    stats 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_port
    bind *: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 variablesselect @@server_id)。

  • 结合之前的 HAProxy 配置(balance leastconn),这种交替返回的结果符合 "最少连接数" 负载均衡策略的预期(在连接数相近时会交替分配)。

总结

HAProxy 作为一款高性能、功能丰富的开源负载均衡器,是构建高可用架构的核心组件。通过本次实验,我们不仅掌握了其基础配置,还深入实践了动态管理、安全策略和四层负载均衡等高级功能。HAProxy 的灵活性和稳定性使其成为企业级应用的理想选择,未来可通过持续学习其高级特性(如 ACL 规则优化、SSL 终止加速等)进一步提升技能水平。

相关推荐
XXYBMOOO28 分钟前
Xilinx-FPGA-PCIe-XDMA 驱动内核兼容性问题修复方案
linux·运维·服务器
爱学习的狮王1 小时前
window10和ubuntu22.04双系统之卸载ubuntu系统
linux·运维·ubuntu
Deutsch.3 小时前
负载均衡Haproxy
运维·负载均衡·haproxy
不做无法实现的梦~4 小时前
mid360连接机载电脑,远程桌面连接不上的情况
运维·服务器·电脑
运维成长记4 小时前
关于linux运维 出现高频的模块认知
运维·职场和发展·云计算
IT成长日记5 小时前
【自动化运维神器Ansible】Ansible常用模块之archive模块详解
运维·自动化·ansible·常用模块·archive
晴天¥5 小时前
阶段1--域名服务器
运维·服务器·网络
禁默5 小时前
进程调度的艺术:从概念本质到 Linux 内核实现
linux·运维·服务器
Azure DevOps5 小时前
在Azure DevOps的工作项中使用markdown
运维·microsoft·flask·azure·devops
先做个垃圾出来………6 小时前
CI/CD与DevOps集成方法
运维·ci/cd·devops