poetry

夜静海涛三万里,
月明飞锡下天风。

LVS简介

在已有的负载均衡技术中,IP负载均衡是效率最高的。它将一组服务器构建成一个高性能、高可用的虚拟服务器。如图,LVS一共有以下两部分组成:

LVS_1.webp

  1. Load Balance Machine,提供调度的机器,负责接收用户请求后转发给后端Server集群
  2. Real Server ,真实的服务器集群,负责提供各种服务

其中,LB机器上运行LVS,LVS有用户空间和内核空间两部分组成:

  1. IPVS(IP Virtual Server):工作在内核空间中,是真正生效实现调度的代码。
  2. ipvsadm:工作在用户空间,负责为ipvs内核框架编写规则,定义谁是集群,谁是后端真实服务器。

LB集群原理:当用户的请求过来时,会直接分发到Director Server上,然后它把用户请求根据设置好的调度算法,智能均衡的分配到后端真正的服务器上(Real Server)

LVS一共有三种模式,分别是:

  1. Virtual Server via Network Address Translation(VS/NAT)
  2. Virtual Server via IP Tunneling(VS/TUN)
  3. Virtual Server via Direct Routing(VS/DR)

LVS一共有8中调度算法

  1. 轮询(Round Robin)调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
  2. 加权轮询(Weighted Round Robin)调度器通过”加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
  3. 最少链接(Least Connections)调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。
  4. 加权最少链接(Weighted Least Connections)在集群系统中的服务器性能差异较大的情况下,调度器采用”加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
  5. 基于局部性的最少链接(Locality-Based Least Connections)”基于局部性的最少链接” 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用”最少链接”的原则选出一个可用的服务 器,将请求发送到该服务器。
  6. 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)”带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按”最小连接”原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的 程度。
  7. 目标地址散列(Destination Hashing)”目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
  8. 源地址散列(Source Hashing)”源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
  9. 最短的期望的延迟?
  10. 最少队列调度?

相关术语

  1. DS:Director Server。指的是前端负载均衡器节点。
  2. RS:Real Server。后端真实的工作服务器。
  3. VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
  4. DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
  5. RIP:Real Server IP,后端服务器的IP地址。
  6. CIP:Client IP,访问客户端的IP地址。

VS/NAT工作模型

LVS_2.webp

流程:

  1. 当用户访问服务器提供服务时,发往VIP地址的请求包到达LB机器
  2. LB机器检查数据包的目标IP和目标Port,去匹配LVS中的规则,然后根据负载均衡算法从集群中选择RS响应请求,并将连接添加到记录已连接的Hash表中
  3. 将数据包的目的地址和端口重写–> 选中的RS的IP:Port,然后转发RS。
  4. RS返回数据报时,SrcIP:RIP.Rport DstIP DIP.Dport。
  5. LB机器将数据报中的源IP地址和源Port重写为DS的源地址和源Port
  6. 连接终止或超时后,连接记录就会在已连接的Hash表中删除

特性:

  1. RS应该使用私有IP地址,RS的网关是DIP地址
  2. DIP要和RIP属于同一个网段
  3. 请求和响应报文都需要经过DS(性能瓶颈)
  4. 支持端口映射
  5. RS可以使用任意操作系统

VS/DR工作模型

LVS_3.webp

流程:

  1. 当用户访问服务器提供服务时,发往VIP地址的请求包到达LB机器。
  2. LB机器根据负载均衡算法,选出合适的RS,将目的Mac修改为RS的Mac,其余不变,并将连接记录添加到Hash表。
  3. RS处理完报文后,将响应报文直接发送给客户端
  4. 连接终止或超时后,连接记录就会在已连接的Hash表中删除

数据报流动:

LVS_4 DR数据流动.webp

非ARP接口:

因为DR需要所有设备在同一个局域网内,而arp广播,会发送LAN的所有机器(LB机器和RS机器),我们现在只需要LB机器去响应VIP请求,要求只能是DR进行响应VIP的arp请求,而RS不能够响应。我们需要设置arp参数(RS),限制其不能响应VIP的arp请求。

arp_ignore:arp响应

arp_announce:arp通告

特性:

  1. 保证前端路由将目标地址为VIP报文通通发给DS
  2. RS可以使用私有IP地址,也可以使用公网IP地址,如果使用公网地址,此时通过Internet对RIP进行直接访问
  3. RS和DS必须在同一个物理网络当中
  4. 请求报文经过DS到RS,但是响应报文不经过DS(消除nat模式下的性能瓶颈)
  5. 不支持地址转化,也不支持端口映射
  6. RS的网关决不能指向DS(因为我们允许RS通过DS)
  7. RS上的lo接口配置VIP地址

VS/TUN工作模型

LVS_5_Tun.webp

流程:

  1. 当用户访问服务器提供服务时,发往VIP地址的请求包到达LB机器。
  2. 调度器根据各个服务器的负载情况,动态地选择一台服务器, 将请求报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的服务器
  3. 服务器收到报文后,先将报文解封获得原来目标地址为VIP的报文,服务器发 现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。

数据报流动:

LVS_6.webp
特点:

  1. TUN的建立需要时动态的,类似DMVPN
  2. 因为又添加了IP报头,所以IP隧道会消耗一定的资源
  3. 不需要DS返回响应,和DR类似
  4. Tun可以做加密,IPSec等

三种模型的比较

1. Virtual Server via NAT:VS/NAT 的优点是服务器可以运行任何支持TCP/IP的操作系统,它只需要一个IP地址配置在调度器上,服务器组可以用私有的IP地址。缺点是它的伸缩能力有限,因为在VS/NAT中请求和响应报文都需要通过负载调度器。可以有三种方法解决这个问题:混合方法、VS/TUN和 VS/DR。在DNS混合集群系统中,有若干个VS/NAT负载调度器,每个负载调度器带自己的服务器集群,同时这些负载调度器又通过RR-DNS组成简 单的域名。但VS/TUN和VS/DR是提高系统吞吐量的更好方法。对于那些将IP地址或者端口号在报文数据中传送的网络服务,需要编写相应的应用模块来转换报文数据中的IP地址或者端口号。这会带来实现的工作量,同时应用模块检查报文的开销会降低系统的吞吐率。

2. Virtual Server via IP Tunneling:在VS/TUN 的集群系统中,负载调度器只将请求调度到不同的后端服务器,后端服务器将应答的数据直接返回给用户。这样,负载调度器就可以处理大量的请求,它甚至可以调 度百台以上的服务器(同等规模的服务器),而它不会成为系统的瓶颈。VS/TUN技术对服务器有要求,即所有的服务器必须支持“IP Tunneling”或者“IP Encapsulation”协议。目前,VS/TUN的后端服务器主要运行Linux操作系统,我们没对其他操作系统进行测试。因为“IP Tunneling”正成为各个操作系统的标准协议,所以VS/TUN应该会适用运行其他操作系统的后端服务器。

3. Virtual Server via Direct Routing:跟VS/TUN方法一样,VS/DR调度器只处理客户到服务器端的连接,响应数据可以直接从独立的网络路由返回给客户。这可以极大地提高LVS集群系统的伸缩性。跟VS/TUN相比,这种方法没有IP隧道的开销,但是要求负载调度器与实际服务器都有一块网卡连在同一物理网段上,服务器网络设备(或者设备别名)不作ARP响应,或者能将报文重定向(Redirect)到本地的Socket端口上。

LVS实验

1、LVS/NAT

实验配置:

DS / LB机器

地址类型 IP地址
VIP 192.168.1.105
DIP 192.168.70.10

RS / WEB服务器

站点 IP地址 默认网关
RS1 RIP:172.10.10.20/16 GATEWAY: 172.10.10.2
RS2 RIP:172.10.10.30/16 GATEWAY:172.10.10.2

DS / LB机器的网卡,添加了一块桥接的网卡,之后访问就直接访问那块桥接网卡的IP地址。这样真实的IP地址就不会暴露在公网了。

1
2
3
4
5
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 172.10.10.1 netmask 255.255.0.0 broadcast 172.10.255.255

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.2 netmask 255.255.255.0 broadcast 192.168.1.255

RS站点部署

  1. 使用httpd服务,这里介绍以下httpd服务,主配置文件:/etc/httpd/conf/httpd.conf,默认站点目录:/var/www/html
  2. 需要把RS机器的默认网关修改为DS机器的IP地址
1
2
3
4
5
6
7
#node02 node03
yum -y install httpd
systemctl restart httpd
echo "THIS IS NODE02" > /var/www/html/index.html
sed -i '/GATEWAY/d' /etc/sysconfig/network-scripts/ifcfg-ens32
echo "GATEWAY=192.168.70.10" >> /etc/sysconfig/network-scripts/ifcfg-ens32
systemctl restart network

DS站点部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 安装ipvsadm,lvs的管理工具
yum -y install ipvsadm
# 打开转发配置NAT,0是关闭
echo "1" > /proc/sys/net/ipv4/ip_forward
# 清除Ptables NAT表的规则
iptables -t nat -F
# 添加iptables规则,让去往ens35的流量转发给192.168.70.10 公网-->私网
iptables -t nat -A POSTROUTING -s 192.168.70.10/24 -o ens35 -j MASQUERADE

#清除ipvsadm的所有规则
ipvsadm --clear

#设置wrr加权轮询策略并添加主机
ipvsadm -A -t 192.168.1.105:80 -s wrr

#添加主机,将到达192.168.1.105的流量转到192.168.70.20
ipvsadm -a -t 192.168.1.105:80 -r 192.168.70.20:80 -m -w 2
#添加主机,将到达192.168.1.105的流量转到192.168.70.30
ipvsadm -a -t 192.168.1.105:80 -r 192.168.70.30:80 -m -w 1

# ipvsadm常用选项
# -A : 添加Virtual Server Address(VIP+Port)
# -s : 定义负载均衡策略
# -e : 修改匹配规则
# -r : 指定RS的地址和端口
# -m : 指定为NAT
# -w : 指定权重

#查看策略信息
ipvsadm -ln

之前在docker上做了一遍,到添加虚拟服务地址VSA的时候报错了,大概是LVS是要通过LINUX内核来实现,docker下完成不了对内核的改动,所以用不了。

1
2
3
[root@00564133da53 /]# sudo ipvsadm -A  -t 192.168.1.2:80 -s wrr
Can't initialize ipvs: Protocol not available
Are you sure that IP Virtual Server is built in the kernel or as module?

2、LVS/DR

环境准备:

DS / LB机器

地址类型 IP地址
VIP 192.168.70.100
DIP 192.168.70.10

RS / WEB服务器

站点 IP地址 VIP地址
RS1 RIP:192.168.70.20 192.168.70.100 lo
RS2 RIP:192.168.70.30 192.168.70.100 lo

RS部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
#不能让Gateway指向node1

sed -i '/GATEWAY/d' /etc/sysconfig/network-scripts/ifcfg-ens32
sed -i '/^$/d' /etc/sysconfig/network-scripts/ifcfg-ens32
echo "GATEWAY=192.168.70.2" >> /etc/sysconfig/network-scripts/ifcfg-ens32
systemctl restart network
systemctl restart httpd


yum -y install net-tools
vip=192.168.70.100
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#1是关闭
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
#在所有RS上部署

RS脚本:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
yum -y install httpd net-tools
systemctl restart httpd
echo "THIS IS NODE03" > /var/www/html/index.html
vip=192.168.70.100
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

DS部署

1
2
3
4
5
6
7
8
9
ifconfig ens32:0 192.168.70.100 broadcast 192.168.70.255 netmask 255.255.255.0 up
#本地重定向,去往192.168.70.100的流量从本地ens32:0走
route add -host 192.168.70.100 dev ens32:0

ipvsadm -A -t 192.168.70.100:80 -s wrr
ipvsadm -a -t 192.168.70.100:80 -r 192.168.70.20:80 -m -w 1
ipvsadm -a -t 192.168.70.100:80 -r 192.168.70.30:80 -m -w 2
ipvsadm -ln

DS脚本

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
yum -y install net-tools ipvsadm
echo "0" > /proc/sys/net/ipv4/ip_forward

#ifconfig ens32:0 192.168.70.100 broadcast 192.168.70.255 netmask 255.255.255.0 up
#route add -host 192.168.70.100 dev ens32:0
ipvsadm -A -t 192.168.70.100:80 -s wrr
ipvsadm -a -t 192.168.70.100:80 -r 192.168.70.20:80 -g -w 9
ipvsadm -a -t 192.168.70.100:80 -r 192.168.70.30:80 -g -w 1
ipvsadm -ln
ipvsadm -C
for i in {1..10};do curl 192.168.70.100:80; done