Haproxy搭建Web集群

发布于:2025-06-03 ⋅ 阅读:(26) ⋅ 点赞:(0)

目录

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 计算哈希值,固定分配至特定服务器。 需要会话保持的场景(如购物车、登录状态)。

 

 

 

 


    网站公告

    今日签到

    点亮在社区的每一天
    去签到