lvs的调度算法
-
类型分配:依据负载状态
-
静态方法:仅根据算法本身进行调度,不考虑RS的负载情况
-
动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
静态调度方法:
-
RR(roundrobin): 轮询 RS分别被调度,当RS配置有差别时不推荐
-
WRR(Weighted RR):加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
-
SH(Source Hashing):实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
-
DH(Destination Hashing):目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
(以上不考虑后端的负荷情况)
动态调度算法
-
LC(least connections)(最少链接发)适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活动链接数);
-
WLC(Weighted LC)(权重最少链接)默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight (可能第一次发的流量打入性能不好的);
-
SED(Shortest Expection Delay):初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight 但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接;
-
NQ(Never Queue):第一轮均匀分配,后续SED;
-
LBLC(Locality-Based LC):动态的DH算法,使用场景:根据负载状态实现正向代理;
-
LBLCR(LBLC with Replication):带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS。
看是否有这些算法 ,在调度器LVS里查看
新增调度算法(4.15版本内核以后 )
.FO调度算法:
(Weighted Fai Over) 常用作灰度发布
在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_FOVERLOAD标志)的且权重最高的真实服务器,进行调度
当服务器承接大量链接,我们可以对此服务器进行过载标记(IP_VS_DEST_F OVERLOAD),那么vs调度器就不会把链接调度到有过载标记的主z
.OVF调度算法:
(Overflow-connection)调度算法;基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条件:
-
未过载(未设置IP_VS_DEST_F OVERLOAD标志)
-
真实服务器当前的活动连接数量小于其权重值
-
其权重值不为零
防火墙解决轮询调度问题
实验环境:
在完成DR模式的基础下,进行防火墙标记,给指定的报文做记号
实现过程:
-
首先在内网中的主机websever1与websever2上安装mod_ss模块让服务器支持https,并重启httpd服务
-
接着在调度器LVS-DR上配置
# 先查看之前的策略
[root@lvsrd ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.254.100:80 rr
-> 192.168.0.10:80 Masq 1 0 0
-> 192.168.0.20:80 Masq 1 0 0
TCP 192.168.0.200:80 wrr
-> 192.168.0.10:80 Route 1 0 0
-> 192.168.0.20:80 Route 2 0 0
TCP 192.168.0.200:443 rr
-> 192.168.0.10:443 Route 1 0 0
-> 192.168.0.20:443 Route 1 0 0
# 清空之前的路由策略
[root@lvsrd ~]# ipvsadm -C
#设置端口标签把80与433合为一个整体66(打标记)
[root@lvsrd ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66
# 重写路由策略
[root@lvsrd ~]# ipvsadm -A -f 66 -s rr
[root@lvsrd ~]# ipvsadm -a -f 66 -r 192.168.0.10 -g
[root@lvsrd ~]# ipvsadm -a -f 66 -r 192.168.0.20 -g
# 查看
[root@lvsrd ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 66 rr
-> 192.168.0.10:0 Route 1 0 0
-> 192.168.0.20:0 Route 1 0 0
#测试 客户端上
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
websever2 - 192.168.0.20
websever1 - 192.168.0.10
-
lvs-解决会话问题--采用持久链接
如果单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单粗暴,可能会导致调度失衡,所以可以依据设定时间 -p
# 查看时间设定 [root@lvsrd ~]# ipvsadm -Ln
# -p 设置时间
[root@lvsrd ~]# ipvsadm -E -f 66 -s rr -p
[root@lvsrd ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 66 rr persistent 360
-> 192.168.0.10:0 Route 1 0 0
-> 192.168.0.20:0 Route 1 0 0
测试看效果
#在client上测试
[root@client ~]# for i in {1..10}
> do
> curl 192.168.0.200
> done
websever2 - 192.168.0.20
websever1 - 192.168.0.10
websever2 - 192.168.0.20
websever2 - 192.168.0.20
websever1 - 192.168.0.10
websever2 - 192.168.0.20
websever2 - 192.168.0.20
websever1 - 192.168.0.10
websever2 - 192.168.0.20
websever2 - 192.168.0.20