Haproxy搭建Web集群

article/2025/7/19 22:52:20

目录

Haproxy概述

Haproxy调度算法

静态调度算法

动态调度算法

其他调度算法

案例环境

配置网站

配置Haproxy

Haproxy日志

MySQL负载均衡调度模式

Nginx负载均衡算法


Haproxy概述

Haproxy是一款开源、高性能的负载均衡和代理服务器,支持TCP和HTTP协议,广泛应用于Web服务、高并发场景和需要会话保持的场景。其核心特性包括:

  • 高并发支持
    • 采用事件驱动、单进程模型,能够处理数万级并发连接,性能优于多进程/多线程模型。
    • 支持TCP加速、零复制技术(类似mmap机制),减少资源浪费。
  • 负载均衡功能
    • 支持四层(TCP)和七层(HTTP)负载均衡,可根据IP、端口、URL、Cookie等维度分配请求。
    • 提供多种调度算法(如轮询、最少连接、源IP哈希等),适应不同场景需求。
  • 会话保持
    • 支持基于源IP、Cookie、URL参数等维度的会话保持,确保同一客户端的请求始终转发到同一后端服务器。
  • 健康检查
    • 支持端口、URI等多种状态检测方式,自动剔除故障节点,提升系统可靠性。
  • 安全与透明性
    • 支持连接拒绝、全透明代理等功能,保护后端服务器不被暴露。
    • 提供ACL(访问控制列表)支持,用于精细化的流量控制。
  • 统计与监控
    • 提供详细的统计数据接口,通过Web界面展示后端集群的接收、发送、拒绝、错误等数据。

Haproxy调度算法

Haproxy支持多种调度算法,分为静态算法和动态算法两大类

静态调度算法

静态算法不关心后端服务器的实时状态,调度规则固定,无法动态调整权重。

  • roundrobin(轮询)
    • 基于权重进行轮询,保持均匀分布,是最平衡、最公平的算法。
    • 权重可在运行时动态调整,支持慢启动(新服务器逐渐增加转发数)。
    • 每个后端服务器最多支持4095个连接。
  • static-rr(静态轮询)
    • 基于权重的轮询调度,但权重无法在运行时动态调整。
    • 适用于后端服务器负载相对稳定的场景。
  • first(首次分配)
    • 始终将请求发送到第一个可用后端服务器,当第一台服务器连接数达到上限时,新请求才会分配给下一台。
    • 忽略权重设置,适用于简单测试环境或特殊配置。

动态调度算法

动态算法会根据后端服务器的实时状态(如连接数、响应速度)进行调度,权重可动态调整。

  • leastconn(最少连接)
    • 将新的连接请求分发给当前连接数最少的后端服务器。
    • 适用于长连接场景(如聊天服务、在线游戏、MySQL等)。
    • 支持权重运行时调整和慢启动。
  • source(源IP哈希)
    • 根据客户端IP地址进行哈希计算,确保同一IP的请求始终发送到同一台后端服务器。
    • 适用于需要会话保持的场景(如电商购物车、在线支付等)。
  • uri(URI哈希)
    • 根据用户请求的URI进行哈希计算,确保相同URI的请求被发送到同一台后端服务器。
    • 适用于需要将特定URI映射到特定后端服务器的场景(如静态资源缓存)。
  • url_param(URL参数哈希)
    • 根据URL中的参数进行哈希计算,确保相同参数的请求被发送到同一台后端服务器。
    • 适用于需要根据URL参数进行路由的场景(如多租户系统)。
  • hdr(HTTP头哈希)
    • 根据HTTP请求头进行哈希计算,确保具有相同请求头的请求被发送到同一台后端服务器。
    • 适用于需要根据请求头进行路由的场景(如API网关)。
  • rdp-cookie(Cookie哈希)
    • 根据Cookie进行哈希计算,确保具有相同Cookie的请求被发送到同一台后端服务器。
    • 适用于需要基于Cookie进行会话保持的场景(如Web应用)。
  • random(随机)
    • 随机选择一台后端服务器。
    • 支持权重动态调整,适用于大型服务器场或经常添加/删除服务器的场景

其他调度算法

  • 一致性哈希(Consistent Hashing)
    • 通过哈希环实现负载均衡,减少节点增减时的数据迁移量。
    • 适用于分布式缓存、分布式存储等场景。

案例环境

一台Haproxy服务器、两台Web服务器、宿主机用来访问

配置网站

 关闭防火墙及内核

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

 下载Web服务

[root@localhost ~]# dnf -y instal httpd

配置网站内容

[root@localhost ~]# echo "22222222">/var/www/html/index.html        #02
[root@localhost ~]# echo "333333333333">/var/www/html/index.html    #03

启动服务

[root@localhost ~]# systemctl start httpd

测试本机是否可以访问到

[root@localhost ~]# curl 127.0.0.1
22222222[root@localhost ~]# curl 127.0.0.1
22222222

配置Haproxy

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
global                                  #全局log         127.0.0.1 local2        #日志/日志设备chroot      /var/lib/haproxy        #限制haproxy运行时的路径pidfile     /var/run/haproxy.pid    #pid文件user        haproxy                 #haproxy的程序用户group       haproxy                 #haproxy的程序组daemon                              #守护进程maxconn     4000                    #最大连接数defaults                                #默认(默认比全局优先级高 所以默认策略会比全局先生效)mode                    http        #所处理的类别(7层代理http,4层代理tcp)log                     global      #定义日志的格式option                  httplog     #日志格式为http日志格式option                  dontlognull #不记录空请求的日志retries                 3           #重试3次连接timeout http-request    5s          #发送的http请求超时时间timeout queue           1m          #队列(又称消息队列)超时时间timeout connect         5s          #连接超时时间(haproxy和服务器之间的连接时间)timeout client          1m          #客户端连接超时时间timeout server          1m          #服务器连接超时时间timeout http-keep-alive 5s          #保持存活的时间timeout check           5s          #超时的检查时间maxconn                 3000        #最大连接数#将末尾信息清空、添加以下信息
listen aaa                              #监听bind 0.0.0.0:80                     #监听地址及端口option httpchk GET /index.html      #配置健康检查balance roundrobin                  #负载均衡算法(leastconn最小连接、source源ip-->hash-->哈希值)server web1 192.168.10.102:80 check inter 2000 fall 3               #server:真实服务器 web1:名称 ip check inter:检查心跳间隔 fall 次数server web2 192.168.10.103:80 check inter 2000 fall 3

启动haproxy并关闭防火墙

[root@localhost ~]# systemctl start haproxy        #启动haproxy
[root@localhost ~]# systemctl stop firewalld        #关闭防火墙
[root@localhost ~]# setenforce 0                #关闭系统内核

宿主机访问

 

Haproxy日志

 修改配置文件

[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
global                                  #全局log         127.0.0.1 local2        #日志/日志设备log         127.0.0.1 local3	#添加新的日志设备    这个!!!!!chroot      /var/lib/haproxy        #限制haproxy运行时的路径pidfile     /var/run/haproxy.pid    #pid文件user        haproxy                 #haproxy的程序用户group       haproxy                 #haproxy的程序组daemon                              #守护进程maxconn     4000                    #最大连接数

 创建日志路径

vim /etc/rsyslog.d/haproxy.conf	#日志路径
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log
&~

重启生效

systemctl restart haproxy	#重启生效
systemctl restart rsyslog	#重启生效

宿主机访问会被记录到日志中

 

MySQL负载均衡调度模式

  1. 轮询(Round Robin)
    • 原理:按顺序将请求分配至后端服务器,循环执行。
    • 优势:简单公平,适用于服务器性能相近的场景。
    • 局限:未考虑服务器实时负载,可能导致负载不均。
  2. 加权轮询(Weighted Round Robin)
    • 原理:根据服务器性能分配权重,权重高者处理更多请求。
    • 优势:合理利用资源,适用于异构服务器环境。
    • 示例:高配服务器权重设为3,低配服务器权重设为1,按3:1比例分配请求。
  3. 最少连接(Least Connections)
    • 原理:将请求分配至当前连接数最少的服务器。
    • 优势:动态平衡负载,适用于长连接场景。
    • 局限:未考虑服务器处理能力差异。
  4. 加权最少连接(Weighted Least Connections)
    • 原理:结合权重与连接数,优先分配至权重高且连接数少的服务器。
    • 优势:兼顾性能与负载,适用于复杂场景。
    • 示例:权重高但连接数少的服务器优先处理请求。
  5. IP哈希(IP Hash)
    • 原理:根据客户端IP计算哈希值,固定分配至特定服务器。
    • 优势:保证会话一致性,适用于需持久连接的场景。
    • 局限:服务器故障时,该服务器上的会话会中断。
  6. 源地址哈希(Source Hash)
    • 原理:基于客户端源地址分配请求,确保同一客户端始终连接同一服务器。
    • 优势:适用于需要会话保持的场景。
  7. 响应时间优先(Fastest Response Time)
    • 原理:根据服务器实时响应时间分配请求,优先分配至响应最快的服务器。
    • 优势:优化用户体验,适用于高实时性场景。

Nginx负载均衡算法

算法名称原理适用场景
轮询(Round Robin)按顺序将请求分配至后端服务器,循环执行。服务器性能相近、无特殊负载需求的场景(默认算法)。
加权轮询(Weighted Round Robin)根据服务器权重分配请求,权重越高处理越多请求。服务器性能差异较大(如高配服务器权重设为 3,低配为 1)。
最少连接(Least Connections)将请求分配至当前连接数最少的服务器。长连接、会话持续时间长的场景(如 WebSocket、实时通信)。
IP哈希(IP Hash)根据客户端 IP 计算哈希值,固定分配至特定服务器。需要会话保持的场景(如购物车、登录状态)。

 

 

 

 


    http://www.hkcw.cn/article/EjlXSNHhDi.shtml

    相关文章

    中联教育 - 嵌入式BI助力财经数据分析服务

    “借助Wyn商业智能软件嵌入式BI工具强大的嵌入式能力,我们实现了与已有的财经教育教学实训平台的深度融合,大幅提升了平台的数据分析服务能力。同时,产品简单易用的特性,也让我们的学员能够快速上手,进行财务报表的设计…

    Qt实现csv文件按行读取的方式

    Qt实现csv文件按行读取的方式 场景:我有一个保存数据的csv文件,文件内保存的是按照行保存的数据,每行数据是以逗号为分隔符分割的文本数据。如下图所示: 现在,我需要按行把这些数据读取出来。 一、使用QTextStream文本流的方式读取 #include <QFile>void readfil…

    VMware Workstation虚拟系统设置双网口

    一.设置windows11系统VMware Network Adapter VMnet1。 1.进入到网络和Internet -> 高级网络设置 2.找到VMware Network Adapter VMnet1&#xff0c;进入到“更多配置选项”并“编辑”。 3.进入到属性&#xff0c;双击“Interenet协议版本4&#xff08;TCP/IPv4&#xff…

    CppCon 2014 学习:Lock-Free Programming

    你这段文字讲的是“为什么要使用无锁&#xff08;Lock-Free&#xff09;代码”&#xff0c;我帮你总结并解释一下&#xff1a; 为什么选择无锁代码&#xff1f; 并发性和可扩展性&#xff08;Concurrency and scalability&#xff09; 无锁算法允许多个线程同时操作共享数据&a…

    MFA多因素认证与TOTP算法核心解析(含Java案例)

    目录 一、多因素认证(MFA)概述MFA基本概念MFA与2FA的区别MFA的重要性 二、TOTP算法原理TOTP基本概念时间变量T的计算TOTP生成过程TOTP验证过程 三、TOTP在MFA中的应用绑定流程认证流程TOTP的优势 四、TOTP的安全考虑哈希算法选择密钥管理防暴力破解时间同步通信安全 五、TOTP的…

    openssl-aes-ctr使用openmp加速

    openssl-aes-ctr使用openmp加速 openssl-aes-ctropenmp omp for openssl-aes-ctr 本文采用openssl-1.1.1w进行开发验证开发&#xff1b;因为aes-ctr加解密模式中&#xff0c;不依赖与上一个模块的加/解密的内容&#xff0c;所以对于aes-ctr加解密模式是比较适合进行并行加速的…

    git查看commit属于那个tag

    1. 快速确认commit原始分支及合入tag # git describe 213b4b3bbef2771f7a1b8166f6e6989442ca67c8 查看commit合入tag # git describe 213b4b3bbef2771f7a1b8166f6e6989442ca67c8 --all 查看commit原始分支 2.查看分支与master关系 # git show --all 0.5.67_0006 --stat 以缩…

    怎么在window上打开ubuntu虚拟机?

    怎么在window上打开ubuntu虚拟机&#xff1f; 1.先下载ubuntu镜像包并解压&#xff08;VM-ubuntu18-202304.7z&#xff09;,下载地址在本文档中有链接&#xff0c;自行查找。&#xff08;解压路径不要有中文&#xff09; 2.打开VMware软件&#xff0c;&#xff08;软件下载地址…

    中国移动咪咕助力第五届全国人工智能大赛“AI+数智创新”专项赛道开展

    第五届全国人工智能大赛由鹏城实验室主办&#xff0c;新一代人工智能产业技术创新战略联盟承办&#xff0c;华为、中国移动、鹏城实验室科教基金会等单位协办&#xff0c;广东省人工智能与机器人学会支持。 大赛发布“AI图像编码”、“AI增强视频质量评价”、“AI数智创新”三大…

    第十三章 MQTT消息

    系列文章目录 系列文章目录 第一章 总体概述 第二章 在实体机上安装ubuntu 第三章 Windows远程连接ubuntu 第四章 使用Docker安装和运行EMQX 第五章 Docker卸载EMQX 第六章 EMQX客户端MQTTX Desktop的安装与使用 第七章 EMQX客户端MQTTX CLI的安装与使用 第八章 Wireshark工具…

    国芯思辰| 16通道12位模数转换器SC1425高性价比SGM5200替代方案,专为数字电源优化

    与传统的模拟电源相比&#xff0c;数字电源的主要区别是控制与通信部分。在复杂的多系统业务中&#xff0c;数字电源是通过软件编程来实现多方面的应用&#xff0c;数字电源广泛应用于在可控因素较多、实时反应速度更快、需要多个模拟系统电源管理的、复杂的高性能系统应用中。…

    Java 大数据处理:使用 Hadoop 和 Spark 进行大规模数据处理

    Java 大数据处理&#xff1a;使用 Hadoop 和 Spark 进行大规模数据处理 在当今数字化时代&#xff0c;数据呈现出爆炸式增长&#xff0c;如何高效地处理大规模数据成为企业面临的重要挑战。Java 作为一门广泛使用的编程语言&#xff0c;在大数据处理领域同样发挥着关键作用。本…

    深度学习复习笔记

    深度前馈神经网络 卷积神经网络 Advanced卷积神经网络 Lightweight CNN dwconv squeezenet 这边右侧的e3是3x3卷积吧 SENet 在通道维度压一下&#xff0c;强迫各维度混合学习&#xff0c;再还原 ShuffleNet Group Convolution在 AlexNet 中引入&#xff0c;用于将模型分布到…

    Linux系统编程收尾(35)

    文章目录 前言一、读写锁二、自旋锁总结 前言 大家好&#xff0c;这是我们Linux系统编程的最后一节课了&#xff01;   大家请再撑住一会儿~ 一、读写锁 提到读写锁&#xff0c;我们就不得不提到 读者写者模型 &#xff0c;跟 生产者消费者模型 不同的是&#xff0c;本模型的…

    C文件操作1

    一、为什么使用文件 如果没有文件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失 了&#xff0c;等再次运行程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进行持久化的保存&am…

    基于 AUTOSAR 的域控产品软件开发:从 CP 到 AP 的跨越

    基于 AUTOSAR 的域控产品软件开发&#xff1a;从 CP 到 AP 的跨越 一、AUTOSAR AP 架构解析&#xff1a;面向智能汽车的自适应框架 &#xff08;一&#xff09;引言 随着汽车智能化向 L3 演进&#xff0c;传统 AUTOSAR CP&#xff08;经典平台&#xff09;在实时性、动态性和…

    解密震颤背后的神经隐情

    在人体精密运行的神经世界里&#xff0c;有一种疾病悄然打破生命的节奏&#xff0c;它就是帕金森。这一病症并非突然降临&#xff0c;而是随着时间&#xff0c;如潮水般慢慢侵蚀着身体的正常机能。​ 患病后&#xff0c;最直观的变化体现在肢体运动上。双手会不受控制地颤抖&a…

    数据即资产:GEO如何重塑企业的信息价值链

    在数字经济时代&#xff0c;数据早已被公认为企业的核心资产。然而&#xff0c;随着生成式AI的崛起&#xff0c;数据资产的定义、价值和管理方式正在发生根本性变革。深耕数字营销二十余年&#xff0c;我们亲历了从"数据即记录"到"数据即洞察"&#xff0c;…

    2025年文学与文化发展国际会议(ICLCD 2025)

    2025年文学与文化发展国际会议&#xff08;ICLCD 2025&#xff09; 2025 International Conference on Literature and Cultural Development 一、大会信息 会议简称&#xff1a;ICLCD 2025 大会地点&#xff1a;中国天津 审稿通知&#xff1a;投稿后2-3日内通知 投稿邮箱&am…

    SPL 轻量级多源混算实践 4 - 查询 MongoDB

    除了以上常见数据源&#xff0c;还有 NoSQL、MQ 等数据源&#xff0c;其中以 MongoDB 最为常用。我们用 SPL 连接 MongoDB 做计算。 导入 MongoDB 数据。 外部库 SPL 支持的多种数据源大概分两类&#xff0c;一类是像 RDB 有 JDBC 直接使用&#xff0c;或者文件等直接读取&a…