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 终止加速等)进一步提升技能水平。

相关推荐
七夜zippoe1 天前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy6481 天前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满1 天前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠1 天前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
主机哥哥1 天前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
Harvey9031 天前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技1 天前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀1 天前
Linux环境变量
linux·运维·服务器
zzzsde1 天前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º1 天前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann