> 技术文档 > HAProxy 实验指南:从零开始搭建高可用负载均衡系统

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 haproxysystemctl 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/certsopenssl 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/stats1 (initial 1)# 查看 web2 权重[root@haproxy ~]# echo \"get weight webcluster/web2\" | socat stdio /var/lib/haproxy/stats1 (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/stats2 (initial 1)

    4.测试验证

    5.禁用/启用后端服务器

    # 禁用后端服务器 web1echo \"disable server webcluster/web1\" | socat stdio /var/lib/haproxy/stats# # 启用后端服务器 web1echo \"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=101vim /etc/my.cnf[mysqld]server-id=101 # 唯一标识,区分不同服务器#(rs2):设置server-id=102vim /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 终止加速等)进一步提升技能水平。