LVS企业调度器
LVS企业调度器
LVS:Linux Virtual Server,负载调度器,LVS是内核级功能,工作在INPUT链的位置,将发往INPUT的流量进行“处理”
调度算法
centos8新加的调度算法
CONFIG_IP_VS_FO=m #新增
CONFIG_IP_VS_OVF=m #新增
[root@centos8 ~]#grep -i -C 10 ipvs /boot/config-4.18.0-147.el8.x86_64
...(省略部分内容)...
CONFIG_NETFILTER_XT_MATCH_IPVS=m
CONFIG_NETFILTER_XT_MATCH_POLICY=m
...(省略部分内容)...
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y
#
# IPVS scheduler
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_FO=m #新增
CONFIG_IP_VS_OVF=m #新增
1,LVS的四种工作模式
lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
lvs-dr:操纵封装新的MAC地址
lvs-tun:在原请求IP报文之外新加一个IP首部
lvs-fullnat:修改请求报文的源和目标IP
1.1, lvs-nat修改请求报文的目标IP,多目标IP的DNAT
通过修改请求报文的目标IP, 将报文转发给多个Real Server 与DNAT相比实现了一对多的转换。
缺点:请求和响应报文都要经过LVS服务器导致LVS服务器压力过大

1.2, lvs-dr:操纵封装新的MAC地址
Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变

1.3, lvs-tun:在原请求IP报文之外新加一个IP首部
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)

1.4,lvs-fullnat:修改请求报文的源和目标IP
通过同时修改请求报文的源IP地址和目标IP地址进行转发,此模式为阿里二次开发,需要重新编译内核使用,此处不多做介绍
2,LVS调试算法
2.1 静态方法(不考虑后端服务器的负载状况)
2.1.1、RR:roundrobin,轮询
雨露均沾,每个服务器接收一次请求
2.1.2、WRR:Weighted RR,加权轮询
设置权重,如性能较好的服务器接收十分之六的请求,另外的接收十分之四的请求
2.1.3、SH:Source Hashing
实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
2.1.4、DH:Destination Hashing
目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡
2.2 动态方法(考虑后端服务器的负载状况)
主要根据每RS当前的负载状态及调度算法进行调度Overhead=value 较小的RS将被调度
2.2.1、LC:least connections 适用于长连接应用
Overhead=activeconns*256+inactiveconns
Overhead值越大则负载越大,
2.2.2、WLC:Weighted LC,默认调度方法,DR模型默认的调度模型
Overhead=(activeconns*256+inactiveconns)/weight
此算法考虑到服务器的性能,权重越大Overhead的值越小,权重越小Overhead的值越大
缺点:初始无连接时Overhead值一样
2.2.3、SED:Shortest Expection Delay,初始连接高权重优先
Overhead=(activeconns+1)*256/weight
活动连接+1后除以权重,即使是初始时也能保证高性能的机器能优先得到请求
2.2.4、NQ:Never Queue,第一轮均匀分配,后续SED
无论权重第一次都分配一个请求,在考虑Overhead
2.2.5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
目标地址hashing的结果是一台负载过重的机器就不再往该机器调度
2.2.6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制
到负载轻的RS
如有一台负载过大,则复制其信息到其他机器使得其他机器也能提供同样的服务,实现相对均衡
2.3 内核版本 4.15 版本后新增调度算法:FO和OVF
FO(Weighted Fail Over)类似于静态算法
遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F_OVERLOAD标志)的且权重最高的真实服务器,进行调度
多了IP_VS_DEST_F_OVERLOAD标志,将一些机器设置为过载后调度器将不往该机器进行调度,不往该机器调度了可以进行升级软件等操作,等到维护之后再将过载标志去掉,(软件升级,灰度发布选择部分升级)
OVF(Overflow-connection)类似于动态算法
在FO算法的基础上考虑到了连接数和权重,基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条件:
未过载(未设置IP_VS_DEST_F_OVERLOAD标志)
真实服务器当前的活动连接数量小于其权重值
其权重值不为零
3,实验LVS-NAT模式

- Director 服务器采用双网卡,一个是桥接网卡连接外网,一个是仅主机网卡与后端Web服务器相连
- Web服务器采用仅主机网卡与director相连
- Web服务器网关指向10.0.0.10
- 后端web服务器不需要连接外网
3.1,环境
共四台主机
一台: internet client :10.2.2.10/24 GW:10.2.2.11
一台:lvs :ens37 桥接 10.2.2.11/24 ens38 10.3.3.10/24
两台RS:
RS1: 10.3.3.11/24 GW: 10.0.0.10
RS2: 10.3.3.12/24 GW: 10.0.0.10
主机主机之间能够互相通信,关闭selinux,防火墙
3.2,步骤
#LVS启用IP_FORWORD功能
[root@LVS-SERVER ~]# vim /etc/sysctl.conf
[root@LVS-SERVER ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@LVS-SERVER ~]# yum install -y ipvsadm
[root@LVS-SERVER ~]# ipvsadm -A -t 10.2.2.11:80 -s rr
[root@LVS-SERVER ~]# ipvsadm -a -t 10.2.2.11:80 -r 10.3.3.11 -m
[root@LVS-SERVER ~]# ipvsadm -a -t 10.2.2.11:80 -r 10.3.3.12 -m
[root@LVS-SERVER ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.2.2.11:80 rr
-> 10.3.3.11:80 Masq 1 0 0
-> 10.3.3.12:80 Masq 1 0 0
#Real-server
[root@Real-server1 ~]# yum install -y httpd ; systemctl enable --now httpd ; echo "$(hostname -I)" >> /var/www/html/index.html
#client 测试
[root@client ~]# curl http://10.2.2.11
10.1.1.42 10.3.3.11
[root@client ~]# curl http://10.2.2.11
10.1.1.43 10.3.3.12
[root@client ~]# curl http://10.2.2.11
10.1.1.42 10.3.3.11
[root@client ~]# curl http://10.2.2.11
10.1.1.43 10.3.3.12
[root@client ~]# curl http://10.2.2.11
10.1.1.42 10.3.3.11
[root@client ~]#
#保存规则
[root@client ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@LVS-SERVER ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@LVS-SERVER ~]# cat !$
cat /etc/sysconfig/ipvsadm
-A -t 10.2.2.11:80 -s rr
-a -t 10.2.2.11:80 -r 10.3.3.11:80 -m -w 1
-a -t 10.2.2.11:80 -r 10.3.3.12:80 -m -w 1
#重新加载规则
[root@LVS ~]#ipvsadm -R < /etc/sysconfig/ipvsadm
#清除规则
[root@LVS-SERVER ~]# ipvsadm -C
[root@LVS-SERVER ~]# ipvsadm Ln
Try `ipvsadm -h' or 'ipvsadm --help' for more information.
[root@LVS-SERVER ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
#开机自动加载规则
[root@client ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@LVS-SERVER ~]# systemctl enable ipvsadm.service
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.
3,实验LVS-DR模式单网段

- Director 服务器采用双IP桥接网络,一个是VIP,一个DIP
- Web服务器采用和DIP相同的网段和Director连接
- 每个Web服务器配置VIP
- 每个web服务器可以出外网
- 修改内核参数解决Web服务器中地址冲突
3.1 环境
客户端
eth0: 10.2.2.10/24 GW:10.2.2.11/24
ROUTER
eth0: 10.2.2.11/24
eth1: 10.3.3.10/24
启用 IP_FORWARD
一台:LVS
eth0:NAT:DIP:10.3.3.20/24 GW:10.3.3.10
lo:vip:10.3.3.11
两台RS:
RS1:eth0:NAT:10.3.3.21/24 GW:GW:10.3.3.10
lo:vip:10.3.3.11
RS2:eth0:NAT:10.3.3.22/24 GW:GW:10.3.3.10
lo:vip:10.3.3.11
3.2, 环境准备步骤
#关闭selinux,防火墙
#client设置
3: ens40: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:bf:ae:43 brd ff:ff:ff:ff:ff:ff
inet 10.2.2.10/24 brd 10.2.2.255 scope global noprefixroute ens40
valid_lft forever preferred_lft forever
inet6 fe80::3ea5:f8c1:55b6:8150/64 scope link noprefixroute
valid_lft forever preferred_lft forever
default via 10.2.2.11 dev ens40 proto static metric 101
10.1.1.0/24 dev ens39 proto kernel scope link src 10.1.1.40 metric 100
10.2.2.0/24 dev ens40 proto kernel scope link src 10.2.2.10 metric 101
#ROUTER配置
[root@ROUTER ~]# sysctl -p
net.ipv4.ip_forward = 1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:1f:65:bf brd ff:ff:ff:ff:ff:ff
inet 10.3.3.10/24 brd 10.3.3.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::2983:88c2:3d12:8a87/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:1f:65:b5 brd ff:ff:ff:ff:ff:ff
inet 10.2.2.11/24 brd 10.2.2.255 scope global noprefixroute eth2
valid_lft forever preferred_lft forever
inet6 fe80::aa2d:720a:a016:2bf2/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@ROUTER ~]#
#LVS服务器设置
[root@LVS-SERVER ~]# ip route
default via 10.3.3.10 dev ens38 proto static metric 101
10.1.1.0/24 dev ens33 proto kernel scope link src 10.1.1.41 metric 100
10.3.3.0/24 dev ens38 proto kernel scope link src 10.3.3.20 metric 101
[root@LVS-SERVER ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.3.3.11/0 scope global lo:1
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens38: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:1d:52:8d brd ff:ff:ff:ff:ff:ff
inet 10.3.3.20/24 brd 10.3.3.255 scope global noprefixroute ens38
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe1d:528d/64 scope link
valid_lft forever preferred_lft forever
#Real Server1设置
[root@Real-server1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@Real-server1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@Real-server1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@Real-server1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@Real-server1 ~]# ip address add 10.3.3.11/24 dev lo label lo:1
[root@Real-server1 ~]# ip route
default via 10.3.3.10 dev ens37 proto static metric 101
10.1.1.0/24 dev ens33 proto kernel scope link src 10.1.1.42 metric 100
10.3.3.0/24 dev ens37 proto kernel scope link src 10.3.3.11 metric 101
[root@Real-server1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.3.3.11/24 scope global lo:1
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:e2:08:d4 brd ff:ff:ff:ff:ff:ff
inet 10.3.3.22/24 brd 10.3.3.255 scope global noprefixroute ens37
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee2:8d4/64 scope link
valid_lft forever preferred_lft forever
#Real Server2同样的配置
[root@Real-server2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@Real-server2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@Real-server2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@Real-server2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@Real-server2 ~]# ifconfig lo:1 10.3.3.11/32
[root@Real-server2 ~]#
[root@Real-server2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.3.3.11/24 scope global lo:1
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:39:03:7b brd ff:ff:ff:ff:ff:ff
inet 10.3.3.21/24 brd 10.3.3.255 scope global noprefixroute ens37
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe39:37b/64 scope link
valid_lft forever preferred_lft forever
[root@Real-server1 ~]# ip route
default via 10.3.3.10 dev ens37 proto static metric 101
10.1.1.0/24 dev ens33 proto kernel scope link src 10.1.1.42 metric 100
10.3.3.0/24 dev ens37 proto kernel scope link src 10.3.3.21 metric 101
#做完以上操作后所有机器互通,环境准备完毕
3.3,LVS-DR模式的配置
[root@LVS-SERVER network-scripts]# ipvsadm -A -t 10.3.3.11:80 -s rr
[root@LVS-SERVER network-scripts]# ipvsadm -a -t 10.3.3.11:80 -r 10.3.3.21:80 -g
[root@LVS-SERVER network-scripts]# ipvsadm -a -t 10.3.3.11:80 -r 10.3.3.22:80 -g
[root@LVS-SERVER ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.3.3.11:80 rr
-> 10.3.3.21:80 Route 1 0 0
-> 10.3.3.22:80 Route 1 0 0
[root@client ~]# curl 10.3.3.11
10.1.1.43 10.3.3.12
[root@client ~]# curl 10.3.3.11
10.1.1.42 10.3.3.11
[root@client ~]# curl 10.3.3.11
10.1.1.43 10.3.3.12
[root@client ~]# curl 10.3.3.11
10.1.1.42 10.3.3.11

浙公网安备 33010602011771号