引言

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.pswp.cn/web/90664.shtml
        繁体地址,请注明出处:http://hk.pswp.cn/web/90664.shtml
        英文地址,请注明出处:http://en.pswp.cn/web/90664.shtml

        如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

        相关文章

        2.10DOM和BOM插入/移除/克隆

        1.DOM创建/插入/移除/克隆1.1创建元素前面我们使用过 document.write 方法写入一个元素:这种方式写起来非常便捷,但是对于复杂的内容、元素关系拼接并不方便;它是在早期没有 DOM 的时候使用的方案,目前依然被保留了下来&#xff1…

        华为仓颉编程语言的表达式及其特点

        华为仓颉编程语言的表达式及其特点 仓颉(Cangjie)语言的表达式有一个明显的特点,范围不再局限于传统算术运算,而是扩展到条件表达式、循环表达式等多种类型,每种表达式均有确定的类型和值。 传统基本表达式&#xff0…

        【linux】keepalived

        一.高可用集群1.1 集群类型LB:Load Balance 负载均衡 LVS/HAProxy/nginx(http/upstream, stream/upstream) HA:High Availability 高可用集群 数据库、Redis SPoF: Single Point of Failure,解决单点故障 HPC&#xff…

        Webpack配置原理

        一、Loader: 1、定义:将不同类型的文件转换为 webpack 可识别的模块2、分类: ① pre: 前置 loader (1)配置:在 webpack 配置文件中通过enforce进行指定 loader的优先级配置(2&#x…

        对比JS“上下文”与“作用域”

        下面从定义、特性、示例,以及在代码分析中何时侧重“上下文”(Execution Context/this)和何时侧重“作用域”(Scope/变量查找),以及二者结合的场景来做对比和指导。一、概念对比 | 维度 | 上下文&#xff0…

        如何做数据增强?

        目录 1、为什么要做数据增强? 2、图像数据增强? 3、文本与音频数据增强? 4、高级数据增强? 数据增强技术就像是一种“造数据”的魔法,通过对原始数据进行各种变换,生成新的样本,从而提高模型…

        Go by Example

        网页地址Go by Example 中文版 Github仓库地址mmcgrana/gobyexample:按示例进行 HelloWorld package mainimport ("fmt" )func main() {fmt.Println("Hello World") } Hello World 值 package mainimport ("fmt" )func main() {…

        ClickHouse高性能实时分析数据库-消费实时数据流(消费kafka)

        告别等待,秒级响应!这不只是教程,这是你驾驭PB级数据的超能力!我的ClickHouse视频课,凝练十年实战精华,从入门到精通,从单机到集群。点开它,让数据处理速度快到飞起,让你…

        电子电气架构 --- 车载软件与样件产品交付的方法

        我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

        C++:STL中vector的使用和模拟实现

        在上一篇中讲到了string类,string并不属于STL中因为string出现的比STL早,但是在使用方法上两者有相似之处,学习完string后再来看vector会容易的多,接着往下阅读,一定会有收获滴! 目录 vector的介绍 vect…

        仓库管理的流程、绩效和解决方案?

        什么是仓库管理? 仓库管理涉及对所有仓库运营的日常监督。一个全面、集成的仓库管理解决方案采用行业最佳实践,并涵盖使高效运营得以实现的所有基本要素。这些要素包括分销和库存管理、仓库劳动力管理以及业务支持服务。此外,由内部提供或与服…

        TIM 实现定时中断【STM32L4】【实操】

        使用定时器实现定时中断的功能:比如每1ms进入中断处理函数使用STM32CubeMX配置TIM初始化先了解每个参数的含义,在进行配置Counter Settings: 计数器基本设置Prescaler(PSC): 预分频器,设置预分频器系数Counter Mode: 技术模式,…

        Elasticsearch 的聚合(Aggregations)操作详解

        目录 1. 概述 2. 聚合类型分类详解 2.1 桶聚合(Bucket Aggregations) 2.1.1 基础桶聚合 2.1.2 特殊桶聚合 2.1.3 高级桶聚合 2.2 指标聚合(Metric Aggregations) 2.2.1 单值指标聚合(Single-value Metrics&am…

        电子电气架构 --- 高阶智能驾驶对E/E架构的新要求

        我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

        0.深度学习环境配置步骤

        0.深度学习环境配置步骤 这里介绍深度学习环境配置详细步骤,包括安装软件,每一步都有安装时的截图(后续持续更新,敬请关注) 目录如下: 1.安装anaconda 2.安装CUDA 3.安装CU_DNN 4.安装pytorch

        在 Azure 中配置 SMS 与 OTP

        1. Azure Active Directory B2C (AAD B2C) 中的 SMS/OTP 身份验证 1.1. 现状与原理:电话注册与登录 Azure Active Directory B2C (AAD B2C) 提供了将电话号码作为用户身份标识进行注册和登录的功能,旨在为用户提供一种便捷的替代传统电子邮件或用户名登录…

        简单实现支付密码的页面及输入效果

        干我们这行,风吹日晒不到,就怕甲方突发奇想。 今天客户要做一个安全密码前置校验,还要做成支付宝那种效果。ps:android端 心理吐槽了一万遍以后,还是得面对现实。 先用通义问一遍,给了两个方案,要么自己写&…

        proxmox 解决docker容器MongoDB创建报错MongoDB 5.0+ requires a CPU with AVX support

        目录 最简单直接的方式 测试MongoDB docker compose的安装shell脚本 验证访问 最简单直接的方式 让虚拟机直接使用宿主机的物理 CPU 功能标志。 打开 Proxmox Web UI。 选择你的 VM → 硬件 (Hardware) → CPU → 点击 编辑 (Edit)。 将 CPU 类型改为 host。 确认并重启…

        向前滚动累加SQL 实现思路

        一、业务背景在经营分析场景里,我们经常需要回答:“截至今天,过去 N 天/月/周累计发生了多少?”“把维度切到省、市、房型、项目经理、代理商等,结果又是什么?”本文用两个真实需求做演示:以天为…

        Spring AI(14)——文本分块优化

        RAG时,检索效果的优劣,和文本的分块的情况有很大关系。SpringAI中通过TokenTextSplitter对文本分块。本文对SpringAI提供的TokenTextSplitter源码进行了分析,并给出一些自己的想法,欢迎大家互相探讨。查看了TokenTextSplitter的源…