目录
在lvs中设置调度,因为我们要调度80和443两个端口所以我们需要设定两组策略
1.2 加权轮叫(Weighted Round Robin,WRR)
1.3 目标地址散列(Destination Hashing,DH)
2.1 最少链接(Least Connections,LC)
2.2 加权最少链接(Weighted Least Connections,WLC)
2.3 基于局部性的最少链接(Locality-Based Least Connections,LBLC)
2.4 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication,LBLCR)
2.5 最短的期望的延迟(Shortest Expected Delay Scheduling,SED)
2.6 最少队列(Never Queue Scheduling,NQ)
一、lvs简介
LVS(Linux Virtual Server)是Linux内核集成的高性能、高可伸缩的负载均衡器,它可以将一个虚拟IP地址映射到一组真实服务器上,从而实现负载均衡。LVS支持多种调度算法和集群类型,可以满足不同的应用场景需求。
二、LVS 集群体系结构
LVS 集群主要由以下组件组成:
- VS(Virtual Server): 负载调度器,负责将客户端请求转发到真实服务器。
- RS(Real Server): 真实服务器,负责真正处理客户端请求并提供服务。
- CIP(Client IP): 客户端 IP 地址。
- VIP(Virtual IP): 虚拟 IP 地址,客户端请求的目标地址。
- DIP(Director IP): 负载调度器的 IP 地址。
- RIP(Real Server IP): 真实服务器的 IP 地址。
LVS 的工作流程:
- 客户端发送请求到 VIP。
- VS 接收到请求后,根据调度算法选择一台 RS。
- VS 将请求转发到 RS。
- RS 处理完请求后,直接将响应返回给客户端。
三、LVS 集群类型
1、 LVS-NAT 模式
1)工作原理:
- 修改请求报文的目标 IP 地址,将其转换为 RS 的 IP 地址,并将请求转发到 RS。
- 响应报文由 RS 返回给 VS,再由 VS 转发给客户端。
2)数据逻辑:
- 客户端发送请求到 VIP。
- VS 接收到请求后,修改目标 IP 地址为 RS 的 IP 地址,并将请求转发到 RS。
- RS 处理完请求后,将响应返回给 VS。
- VS 接收到响应后,修改源 IP 地址为 VIP,并将响应转发给客户端。
3)部署NAT模式集群案例:
1、配置四台主机实验环境
主机名 | ip | vip | 角色 |
cfy.LAPTOP-N69PF4KV | 192.168.2.158 | 测试机 | |
LVS | NAT-eth0:172.25.254.100 仅主机eth1:192.168.0.100 |
172.168.254.100 | 调度器(VS) |
webserver1 | 192.168.0.10 GW 192.168.0.100 |
null | 真实服务器(RS) |
webserver2 | 192.168.0.20 GW 192.168.0.100 |
null | 真实服务器(RS) |
1)调度器(VS)
vs配置
lvs中打开内核路由功能
2.两台真实服务器(RS)
2、安装及配置web服务
dnf install httpd -y
echo webserver1 - 192.168.0.10 > /var/www/html/index.html
systemctl enable --now httpd
echo webserver2 - 192.168.0.20 > /var/www/html/index.html
systemctl enable --now httpd
在lvs中检测
3、在lvs中安装lvs软件
lvs软件相关信息
- 程序包:ipvsadm:这是LVS项目中的一个重要组件,用于管理LVS的负载均衡规则。
- Unit File: ipvsadm.service:这是用于控制ipvsadm服务的Systemd单元文件。
- 主程序:/usr/sbin/ipvsadm:这是ipvsadm的主程序文件位置。
- 规则保存工具:/usr/sbin/ipvsadm-save:用于保存当前的LVS规则。
- 规则重载工具:/usr/sbin/ipvsadm-restore:用于从保存的文件中重新加载LVS规则。
- 配置文件:/etc/sysconfig/ipvsadm-config:包含ipvsadm的配置信息。
- ipvs调度规则文件:/etc/sysconfig/ipvsadm:包含LVS的调度规则
dnf install ipvsadm -y
4、配置LVS的负载均衡规则
ipvsadm -A -t 172.25.254.100:80 -s rr
ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
将外部对 172.25.254.100
的TCP请求通过轮询调度算法均衡地分配到两台真实服务器 192.168.0.10
和 192.168.0.20
上,使用NAT模式进行数据包的转发
5、测试
4)优点:
- 配置简单,支持端口映射。
5)缺点:
- VS 容易成为系统瓶颈。
- 要求 VS 和 RS 必须在同一网络中,且 RS 的网关必须指向 VS。
2、LVS-DR 模式
1)工作原理:
- 修改请求报文的 MAC 地址,将其转换为 RS 的 MAC 地址,并将请求转发到 RS。
- 响应报文由 RS 直接返回给客户端。
2)数据逻辑:
- 客户端发送请求到 VIP。
- VS 接收到请求后,修改目标 MAC 地址为 RS 的 MAC 地址,并将请求转发到 RS。
- RS 处理完请求后,将响应直接返回给客户端。
3)部署DR模式集群案例
1、配置五台主机实验环境
主机名 | ip | vip | 角色 |
client | 172.25.254.200 vmware NAT | null | 测试机 |
router | NAT-eth0:172.25.254.100 仅主机eth1:192.168.0.100 |
null | 路由器 |
LVS | 192.168.0.50,GW 192.168.0.100 仅主机 | lo:192.168.0.200 | 调度器(VS) |
webserver1 | 192.168.0.10 ,GW 192.168.0.100 仅主机 | lo:192.168.0.200 | 真实服务器(RS) |
webserver2 | 192.168.0.20 ,GW 192.168.0.100 仅主机 | lo:192.168.0.200 | 真实服务器(RS) |
调度器vs主机环境
路由器配置
客户端
2、解决vip响应问题
DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:
(1)在前端网关做静态绑定
(2)在各RS使用arptables
(3)在各RS修改内核参数,来限制arp响应和通告的级别
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别:arp_announce
0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2:必须避免将接口信息向非本网络进行通告
1)在lvs 和 rs 中设定vip
[root@lvs ~]# ip addr add dev lo 192.168.0.200/32
[root@webserver1 ~]# ip addr add dev lo 192.168.0.200/32
[root@webserver2 ~]# ip addr add dev lo 192.168.0.200/32
2)在RS1和RS2中解决响应问题
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
3)在lvs中配置策略
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
将外部对 172.25.254.200
的TCP请求通过轮询调度算法均衡地分配到两台真实服务器 192.168.0.10
和 192.168.0.20
上,这两个真实服务器都使用直接路由模式进行通信。
3、测试:
4)防火墙标签解决轮询错误
1、轮询规则中可能会遇到的错误
a.在RS1和RS2中安装mod_ssl并重启apache
[root@webserver1 ~]# yum install mod_ssl -y
[root@webserver1 ~]# systemctl restart httpd
[root@webserver2 ~]# yum install mod_ssl -y
[root@webserver2 ~]# systemctl restart httpd
b.在lvs中设置调度,因为我们要调度80和443两个端口所以我们需要设定两组策略
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:443 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g
c.测试问题
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
当访问vip时两次调度都到了
2、防火墙标记解决轮询调度问题
FWM:FireWall Mark
MARK target 可用于给特定的报文打标记,
--set-mark value
其中:value 可为0xffff格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服务:可将多个不同的应用使用同一个集群服务进行调度
a.在vs调度器中设定端口标签,人为80和443是一个整体
iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports
80,443 -j MARK --set-mark 6666
b.设定调度规则
[root@lvs ~]# ipvsadm -A -f 6666 -s rr
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.10 -g
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.20 -g
c.测试
5)lvs持久链接
在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单 纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单 粗暴,可能会导致调度失衡
解决方案
在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把 这个源的主机调度到了那个RS上
如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到 同一台RS上。
如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上
在lvs调度器中设定
[root@lvs ~]# ipvsadm -E -f 6666 -s rr -p 5
测试
6)优点:
- VS 不容易成为系统瓶颈。
- 要求 VS 和 RS 必须在同一网络中,且 RS 的网关不能指向 VS。
7)缺点:
- RS 上需要配置 VIP。
3、LVS-TUN 模式
1)工作原理:
- 在请求报文之外封装一个新的 IP 首部,并将其转发到 RS。
- 响应报文由 RS 直接返回给客户端。
2)数据逻辑:
- 客户端发送请求到 VIP。
- VS 接收到请求后,在请求报文之外封装一个新的 IP 首部,并将其转发到 RS。
- RS 接收到请求后,处理请求并将响应直接返回给客户端。
3)优点:
- VS 和 RS 可以在不同的网络中。
4)缺点:
- RS 的操作系统必须支持 IP 隧道功能。
4、LVS-FULLNAT 模式
1)工作原理:
- 修改请求报文的源 IP 地址和目标 IP 地址,将其转换为 DIP 和 RIP,并将请求转发到 RS。
- 响应报文由 RS 返回给 VS,再由 VS 转发给客户端。
2)数据逻辑:
- 客户端发送请求到 VIP。
- VS 接收到请求后,修改源 IP 地址为 DIP,目标 IP 地址为 RIP,并将请求转发到 RS。
- RS 处理完请求后,将响应返回给 VS。
- VS 接收到响应后,修改源 IP 地址为 VIP,并将响应转发给客户端。
3)优点:
- 支持端口映射。
- VS 和 RS 可以在不同的网络中。
4)缺点:
- VS 容易成为系统瓶颈。
- 要求 VS 和 RS 必须能通信。
四、LVS 调度算法
lvs调度算法类型
ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法
静态方法:仅根据算法本身进行调度,不考虑RS的负载情况
动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
1、静态调度算法
1.1 轮叫调度(Round Robin,RR)
调度器通过“轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
1.2 加权轮叫(Weighted Round Robin,WRR)
调度器通过“加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
1.3 目标地址散列(Destination Hashing,DH)
“目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。主要用于缓存服务器的场景。
1.4 源地址散列(Source Hashing,SH)
“源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。在没有使用session共享的又需要保存session的环境下(如电子商务网站),建议使用此算法。
2、动态调度算法:
2.1 最少链接(Least Connections,LC)
调度器通过“最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接"调度算法可以较好地均衡负载。其具体算法为:
active*256+inactive
然后挑选服务器中上述值最小者分配新连接。
2.2 加权最少链接(Weighted Least Connections,WLC)
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。WLC为LVS的默认调度算法。其具体算法为:
(active*256+inactive)/weight
然后挑选服务器根据上述方法计算数字最小者分配新连接。
2.3 基于局部性的最少链接(Locality-Based Least Connections,LBLC)
“基于局部性的最少链接"调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接"的原则选出一个可用的服务器,将请求发送到该服务器。
类似于DH算法,不同的是,其结合了DH算法和LC算法的优势。
2.4 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication,LBLCR)
“带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接"原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
2.5 最短的期望的延迟(Shortest Expected Delay Scheduling,SED)
“最短的期望的延迟”是基于WLC算法的,只是其计算方法不同。具体算法如下:
(active+1)*256/weight
2.6 最少队列(Never Queue Scheduling,NQ)
无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要在进行SED运算。如果没有服务器连接数为空闲,则使用SED算法。
了解这些算法原理能够在特定的应用场合选择最适合的调度算法,从而尽可能地保持Real Server的最佳利用性。