当前位置: 首页 > news >正文

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.101172.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 variablesselect @@server_id)。

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

    总结

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

        http://www.lryc.cn/news/600272.html

        相关文章:

      1. sssss
      2. mybatis-plus从入门到入土(三):持久层接口之IService
      3. 嵌入式硬件篇---有线串口通信问题解决
      4. 如何创建或查看具有 repo 权限的 GitHub 个人访问令牌(PAT)
      5. 国内AI IDE竞逐:腾讯CodeBuddy、阿里通义灵码、字节跳动TRAE、百度文心快码
      6. 零弹窗干扰的贪吃蛇游戏,下载即玩
      7. 刷题日记0726
      8. 二次函数图像动画展示
      9. ESP32实战:5分钟实现PC远程控制LED灯
      10. 【MySQL 数据库】MySQL基本查询(第二节)
      11. AutoCAD_2025下载与保姆级安装教程
      12. 联表实现回显功能
      13. 速通python加密之AES加密
      14. 【AcWing 835题解】滑动窗口
      15. Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现沙滩小人检测识别(C#代码UI界面版)
      16. CT、IT、ICT 和 DICT区别
      17. Day 22: 复习
      18. Python 面向对象基础
      19. 【Android】相对布局应用-登录界面
      20. 基于 Claude Code 与 BrowserCat MCP 的浏览器自动化全链路构建实践
      21. Android 修改系统时间源码阅读
      22. 各种前端框架界面
      23. 【GoLang#3】:数据结构(切片 | map 映射)
      24. SAP ABAP的数据通过调用泛微Restful API同步数据到OA建模表
      25. 《基于雅可比矢量近似的EIT触觉传感灵敏度非均匀校正》论文解读
      26. Yocto 项目直播教学|今天晚上 21:30 直播!
      27. python---字典(dict)
      28. OpenCV图像梯度、边缘检测、轮廓绘制、凸包检测大合集
      29. 【Linux手册】操作系统如何管理存储在外设上的文件
      30. 2025牛客暑期多校第4场——G