超详细!一文带你了解 LVS 的工作原理、集群类型、调度算法以及在实际应用中的常见场景!

目录

lvs简介

LVS 集群体系结构

LVS 的工作流程:

LVS 集群类型

 LVS-NAT 模式

工作原理:

数据逻辑:

部署NAT模式集群案例:

1、配置四台主机实验环境

 1)调度器(VS)

vs配置

lvs中打开内核路由功能

2.两台真实服务器(RS)

2、安装及配置web服务

在lvs中检测

3、在lvs中安装lvs软件

4、配置LVS的负载均衡规则

5、测试

优点:

缺点:

LVS-DR 模式

工作原理:

数据逻辑:

部署DR模式集群案例

1、配置五台主机实验环境

2、解决vip响应问题

1)在lvs 和 rs 中设定vip

 2)在RS1和RS2中解决响应问题

3)在lvs中配置策略

测试:

防火墙标签解决轮询错误

1、轮询规则中可能会遇到的错误

在RS1和RS2中安装mod_ssl并重启apache

在lvs中设置调度,因为我们要调度80和443两个端口所以我们需要设定两组策略

测试问题

2、防火墙标记解决轮询调度问题

在vs调度器中设定端口标签,人为80和443是一个整体

设定调度规则

测试

lvs持久链接

解决方案

在lvs调度器中设定 

测试

优点:

缺点:

LVS-TUN 模式

工作原理:

数据逻辑:

优点:

缺点:

LVS-FULLNAT 模式

工作原理:

数据逻辑:

优点:

缺点:

LVS 调度算法

一、静态调度算法

1.1 轮叫调度(Round Robin,RR)

1.2 加权轮叫(Weighted Round Robin,WRR)

1.3 目标地址散列(Destination Hashing,DH)

1.4 源地址散列(Source Hashing,SH)

二、动态调度算法:

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 的工作流程

  1. 客户端发送请求到 VIP。
  2. VS 接收到请求后,根据调度算法选择一台 RS。
  3. VS 将请求转发到 RS。
  4. RS 处理完请求后,直接将响应返回给客户端。

三、LVS 集群类型

1、 LVS-NAT 模式

1)工作原理

  • 修改请求报文的目标 IP 地址,将其转换为 RS 的 IP 地址,并将请求转发到 RS。
  • 响应报文由 RS 返回给 VS,再由 VS 转发给客户端。

2)数据逻辑

  1. 客户端发送请求到 VIP。
  2. VS 接收到请求后,修改目标 IP 地址为 RS 的 IP 地址,并将请求转发到 RS。
  3. RS 处理完请求后,将响应返回给 VS。
  4. 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)数据逻辑

  1. 客户端发送请求到 VIP。
  2. VS 接收到请求后,修改目标 MAC 地址为 RS 的 MAC 地址,并将请求转发到 RS。
  3. 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)数据逻辑

  1. 客户端发送请求到 VIP。
  2. VS 接收到请求后,在请求报文之外封装一个新的 IP 首部,并将其转发到 RS。
  3. RS 接收到请求后,处理请求并将响应直接返回给客户端。

3)优点

  • VS 和 RS 可以在不同的网络中。

4)缺点

  • RS 的操作系统必须支持 IP 隧道功能。

4、LVS-FULLNAT 模式

1)工作原理

  • 修改请求报文的源 IP 地址和目标 IP 地址,将其转换为 DIP 和 RIP,并将请求转发到 RS。
  • 响应报文由 RS 返回给 VS,再由 VS 转发给客户端。

2)数据逻辑

  1. 客户端发送请求到 VIP。
  2. VS 接收到请求后,修改源 IP 地址为 DIP,目标 IP 地址为 RIP,并将请求转发到 RS。
  3. RS 处理完请求后,将响应返回给 VS。
  4. 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的最佳利用性。