目录
一 负载均衡
1.1 四层负载
1.2 七层负载
1.3 四层负载和七层负载的区别
二 Haproxy简介
2.1 概念和内容
2.2 haproxy的基本配置信息
2.2.1 global 配置
2.2.2 proxies 配置
三 Haproxy的算法
3.1 静态算法
3.2 动态算法
3.3 其他算法
四 高级功能及配置
4.,1ACL
4.2 HAproxy的https实现
一 负载均衡
1.1 四层负载
四层负载均衡 工作在 OSI 模型的第四层,即传输层。
它主要是根据 IP 地址和端口号来分配网络流量。例如,基于 TCP 或 UDP 协议的端口进行负载的分配。
当客户端发送请求到负载均衡设备时,四层负载均衡会根据预先设定的策略和算法,选择一个后端服务器,并修改数据包的目的 IP 地址和端口,将请求转发到选定的服务器。
常见的四层负载均衡算法包括:
- 轮询:依次将请求分配到各个后端服务器。
- 加权轮询:根据服务器的权重比例分配请求。
- 最少连接:将新请求发送到当前连接数最少的服务器。
四层负载均衡的优点包括:
- 性能较高,处理速度快,因为它的工作层次相对较低,处理逻辑相对简单。
- 对网络的开销较小。
然而,四层负载均衡也有一定的局限性,例如它无法根据应用层的内容(如 HTTP 请求的 URL、方法等)进行更精细的负载分配。
1.2 七层负载
七层负载均衡 工作在 OSI 模型的第七层,即应用层。
它能够理解应用层协议(如 HTTP、HTTPS、FTP 等)的内容,并基于这些内容进行更精细和智能的请求分发。
例如,对于 HTTP 协议,七层负载均衡可以根据请求的 URL、HTTP 方法(如 GET、POST 等)、HTTP 头部信息(如 Cookie、User-Agent 等)来决定将请求转发到哪台后端服务器。
假设一个网站有多个页面,如首页、产品页面、用户登录页面等。七层负载均衡可以配置为将访问首页的请求发送到一组特定的服务器,将登录页面的请求发送到另一组专门处理登录操作的服务器,从而实现更精准的负载分配和优化。
七层负载均衡的优点包括:
- 更精细的流量控制:能够根据应用层的具体特征进行请求分发,提高资源的利用效率。
- 更好的安全性:可以对应用层的内容进行检查和过滤,增强系统的安全性。
然而,七层负载均衡也存在一些缺点,比如处理性能相对四层负载均衡较低,因为它需要对应用层协议进行深度解析,增加了处理的复杂度和时间开销。
1.3 四层负载和七层负载的区别
负载均衡 是一种将工作负载分布到多个计算资源(如服务器、网络链接等)上的技术或策略,以优化资源利用、提高系统性能、增强可靠性和可扩展性。
简单来说,当有大量的客户端请求访问某个服务或应用时,负载均衡器会接收这些请求,并根据预先设定的规则和算法,将请求合理地分配到后端的多个服务器上,确保每个服务器都不会过度负载,从而实现高效的服务响应。
负载均衡的主要作用包括:
提高性能:通过将请求均匀分布到多个服务器上,避免单个服务器因负载过高而导致响应延迟或故障,从而提高整体系统的处理能力和响应速度。
增强可靠性:当某台服务器出现故障时,负载均衡器可以自动将请求转发到其他正常运行的服务器上,确保服务的连续性,减少单点故障的影响。
优化资源利用:充分利用后端服务器的计算资源,避免某些服务器闲置而其他服务器过载的情况,提高资源的利用率。
可扩展性:方便地添加或移除后端服务器,以适应业务量的增长或减少,而无需对客户端产生明显的影响。
四层负载均衡和七层负载均衡主要有以下区别:
工作层次
- 四层负载均衡工作在 OSI 模型的第四层,即传输层,基于 IP 地址和端口号进行流量分配。
- 七层负载均衡工作在 OSI 模型的第七层,即应用层,能够理解应用层协议的具体内容,如 HTTP 请求的 URL、方法、头部等。
分析深度
- 四层负载均衡对数据包的分析较浅,只关注源 IP、目标 IP、源端口和目标端口等信息。
- 七层负载均衡对数据包的分析深入到应用层,能够解析应用层协议的细节。
负载分配依据
- 四层负载均衡主要依据端口和 IP 进行分配,例如将目标端口为 80 的请求分配到一组服务器,目标端口为 443 的请求分配到另一组服务器。
- 七层负载均衡可以根据更丰富的规则,如 URL 路径、HTTP 方法、Cookie 等进行精准分配。比如将以
/product
开头的 URL 请求分配到处理产品相关的服务器,将登录请求分配到专门的登录服务器。性能和开销
- 四层负载均衡处理速度快,性能较高,因为处理逻辑相对简单,系统开销小。
- 七层负载均衡由于需要解析应用层协议,处理逻辑复杂,性能相对较低,系统开销较大。
二 Haproxy简介
2.1 概念和内容
HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件 是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器 支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计
2.2 haproxy的基本配置信息
haproxy的配置文件有两部分,分别是global:全局配置段和proxies:代理配置段
2.2.1 global 配置
global:全局配置段
进程及安全相关配置的参数;性能调整相关参数;debug参数
log
:用于指定日志的输出位置和相关设置。例如,log 127.0.0.1 local0
表示将日志发送到本地的local0
设施,目的地为127.0.0.1
。
chroot
:如果设置,会在指定的目录下运行 HAProxy ,增强安全性。
user
:指定运行 HAProxy 进程的用户。
group
:指定运行 HAProxy 进程的用户组。
daemon
:如果设置为true
,HAProxy 会以守护进程的方式在后台运行。
nbproc
:指定运行 HAProxy 的进程数量,用于提高性能。
pidfile
:指定 HAProxy 进程的 PID 文件路径。
maxconn
:设置 HAProxy 能够处理的最大并发连接数。
ulimit-n
:设置每个进程可以打开的最大文件描述符数量。
stats socket
:指定用于获取统计信息的套接字路径。
2.2.2 proxies 配置
defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端配置,配置简单,生产推荐使用
环境准备
主机名 | ip | 角色 |
haproxy | 172.25.254.100 | 调度 |
server1 | 172.25.254.10 | web1 |
server2 | 172.25.254.20 | web2 |
下载安装包
yum install haproxy
yum install socatser1 ser2
echo webserver1 - 172.25.254.10 > /var/www/html/index.html
systemctl restart httpd
curl http://172.25.254.10
echo webserver2 - 172.25.254.20 > /var/www/html/index.html
systemctl restart httpd
查看服务[root@localhost ~]# rpm -qc haproxy
/etc/haproxy/haproxy.cfg
/etc/logrotate.d/haproxy
/etc/sysconfig/haproxy
查看错误日志cat /var/log/message
对配置文件进行配置并测试
默认情况只有一个进程
修改进程为2
定向ha日志
修改权限
三 Haproxy的算法
3.1 静态算法
轮询(Round Robin):按顺序依次将请求分配到后端的各个服务器。假设后端有服务器 S1、S2、S3,请求会按照 S1、S2、S3、S1、S2、S3 的顺序进行分配。
加权轮询(Weighted Round Robin):为每个后端服务器设置权重,根据权重比例分配请求。例如,服务器 S1 权重为 2,S2 权重为 3,S3 权重为 5,那么请求分配的比例大致为 2:3:5。
静态优先级(Static Priority):预先为服务器设置优先级,按照优先级顺序分配请求。优先级高的服务器会先接收到请求,只有当高优先级的服务器不可用时,才会将请求分配给低优先级的服务器。
3.2 动态算法
最少连接(Least Connections):将新的请求发送到当前活动连接数最少的服务器。例如,服务器 S1 有 10 个连接,S2 有 5 个连接,S3 有 8 个连接,新请求会被分配到 S2。
加权最少连接(Weighted Least Connections):结合服务器的权重和当前连接数来决定请求的分配。权重越高且当前连接数越少的服务器越容易被选中。
基于源地址的最少连接(Source Based Least Connections):根据请求的源地址来选择当前针对该源地址连接数最少的服务器。
基于源地址的哈希(Source Based Hash):根据请求的源地址进行哈希计算,将来自相同源地址的请求始终分配到同一台服务器。
基于目标地址的哈希(Destination Based Hash):根据请求的目标地址进行哈希计算,将请求分配到相应的服务器。
3.3 其他算法
source
源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一 个后端web服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服 务器,默认为静态方式,但是可以通过hash-type支持的选项更改这个算法一般是在不插入Cookie的TCP 模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持 cookie和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法 和一致性hash
一致性hash
一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动hash(o) mod n 该hash算法是动态的,支持使用 socat等工具进行在线权重调整,支持慢启动
四 高级功能及配置
4.1 ACL
基于文件后缀名实现动静分离
web2同上
匹配访问路径实现动静分离
vim /etc/haproxy/haproxy.cfg
4.2 HAproxy的https实现