目录
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负载均衡调度模式
- 轮询(Round Robin)
- 原理:按顺序将请求分配至后端服务器,循环执行。
- 优势:简单公平,适用于服务器性能相近的场景。
- 局限:未考虑服务器实时负载,可能导致负载不均。
- 加权轮询(Weighted Round Robin)
- 原理:根据服务器性能分配权重,权重高者处理更多请求。
- 优势:合理利用资源,适用于异构服务器环境。
- 示例:高配服务器权重设为3,低配服务器权重设为1,按3:1比例分配请求。
- 最少连接(Least Connections)
- 原理:将请求分配至当前连接数最少的服务器。
- 优势:动态平衡负载,适用于长连接场景。
- 局限:未考虑服务器处理能力差异。
- 加权最少连接(Weighted Least Connections)
- 原理:结合权重与连接数,优先分配至权重高且连接数少的服务器。
- 优势:兼顾性能与负载,适用于复杂场景。
- 示例:权重高但连接数少的服务器优先处理请求。
- IP哈希(IP Hash)
- 原理:根据客户端IP计算哈希值,固定分配至特定服务器。
- 优势:保证会话一致性,适用于需持久连接的场景。
- 局限:服务器故障时,该服务器上的会话会中断。
- 源地址哈希(Source Hash)
- 原理:基于客户端源地址分配请求,确保同一客户端始终连接同一服务器。
- 优势:适用于需要会话保持的场景。
- 响应时间优先(Fastest Response Time)
- 原理:根据服务器实时响应时间分配请求,优先分配至响应最快的服务器。
- 优势:优化用户体验,适用于高实时性场景。
Nginx负载均衡算法
算法名称 | 原理 | 适用场景 |
轮询(Round Robin) | 按顺序将请求分配至后端服务器,循环执行。 | 服务器性能相近、无特殊负载需求的场景(默认算法)。 |
加权轮询(Weighted Round Robin) | 根据服务器权重分配请求,权重越高处理越多请求。 | 服务器性能差异较大(如高配服务器权重设为 3,低配为 1)。 |
最少连接(Least Connections) | 将请求分配至当前连接数最少的服务器。 | 长连接、会话持续时间长的场景(如 WebSocket、实时通信)。 |
IP哈希(IP Hash) | 根据客户端 IP 计算哈希值,固定分配至特定服务器。 | 需要会话保持的场景(如购物车、登录状态)。 |