LVS调度算法详解
# LVS调度算法概述
LVS根据后端服务器的负载,或其他的计算的标准,判断挑选哪台RS来进行请求处理。调度算法主要分为”静态调度算法”、”动态调度算法"。
- 静态调度算法:
RR、WRR、SH、DH - 动态调度算法:
LC、WLC、SED、NQ、LBLC、LBLCR
# LVS静态调度算法
静态:仅根据算法本身进行调度,不考虑后端实际负载情况(起点公平)
# RR调度算法
RR:round robin轮询调度算法,将每一次用户的请求,轮流分配给Real Server节点。
[root@lb01 ~]# ipvsadm -E -t 172.16.1.100:80 -s rr
[root@lb01 ~]# ipvsadm -L -n
IP virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.1.100:80 rr
-> 172.16.1.7:80 Route 1 0 0
-> 172.16.1.8:80 Route 1 0 0
2
3
4
5
6
7
8
9
# WRR调度算法
WRR:Weighted round robin加权轮询调度算法,根据服务器的硬件情况、以及处理能力,为每台服务器分配不同的权值,使其能够接受相应权值的请求。
[root@lb01 ~]# ipvsadm -E -t 172.16.1.100:80 -s wrr
[root@lb01 ~]# ipvsadm -e -t 172.16.1.100:80 -r 172.16.1.5:80 -g -W 5
[root@lb01 ~]# ipvsadm -e -t 172.16.1.100:80 -r 172.16.1.6:80 -g -W 1
[root@lb01 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler F]ags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.1.100:80 wrr
-> 172.16.1.7:80 Route 5 0 0
-> 172.16.1.8:80 Route 1 0 0
2
3
4
5
6
7
8
9
10
# SH调度算法
SH:Source Hashing源地址hash调度算法,将请求的源IP地址进行Hash运算,得到一个具体的数值,同时对后端服务器进行编号,按照运算结果将请求分发到对应编号的服务器上。
- 可以实现不同来源
IP的请求进行负载分发; - 同时还能实现相同来源
IP的请求始终被派发至某一台特定的节点;
[root@lb01 ~]# ipvsadm -E -t 172.16.1.100:80 -s sh
[root@lb01 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.1.100:80 sh # 配置了Weight无效
-> 172.16.1.7:80 Route 5 0 3
-> 172.16.1.8:80 Route 1 0 1
2
3
4
5
6
7
8
# DH调度算法
DH:destination hash目标地址hash将客户端的请求,始终发往同一个RS。
应用场景:LVS-Cache-源站,始终调度到指定的cache,加速用户体验。

[root@lb01 ~]# ipvsadm -E -t 172.16.1.100:80 -s dh
[root@lb01 ~]# ipvsadm -L -n
IP virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.1.100:80 dh
-> 172.16.1.7:80 Route 5 0 0
-> 172.16.1.8:80 Route 1 0 0
2
3
4
5
6
7
8
# LVS动态调度算法
动态:根据算法及RS节点负载状态进行调度,较小的RS将被调度(保证结果公平)
# LC调度算法
LC:Least-Connection最少连接数调度算法,哪台RS连接数少就将请求凋度至哪台RS。
算法:Overhead = (Active * 256 + Inactive仅连接)一个活动连接相当于256个非活动连接。

# WLC调度算法
WLC:Weighted Least-Connection加权最小连接数(默认调度算法),在服务器性能差异较大的情况下,采用“加权最少链接”调度算法优化负载均衡性能,权值较高的RS节点,将承受更多的连接;负载均衡可以自动问询RS节点服务器的负载状态,通过算法计算当前连接数最少的节点,而后将新的请求调度至该节点。
算法:Overhead = (Active * 256 + Inactive)/Weight

# SED调度算法
SED:Shortest Expected Delay最短期望延迟,尽可能让权重高的优先接收请求,不再考虑非活动状态,把当前处于活动状态的数目+1,通过算法计算当前连接数最少的节点,而后将新的请求调度至该节点。
算法:在WLC基础上改进,Overhead = (ACTIVE+1) * 256/Weight

# NQ调度算法
NQ:Never Queue永不排队/最少队列调度
- 原理:
SED算法由于某台服务器的权重较小,比较空闲,甚至接收不到请求,而权重大的服务器会很忙,而NQ算法是说不管权重多大都会被分配到请求。简单来说,就是无需队列,如果有台Real Server的连接数为0会直接分配过去,后续采用SED算法。 - 算法:
Overhead = (ACTIVE+1) * 256/Weight
# LBLC调度算法
LBLC:Locality-Based Least- Connection动态目标地址hash调度算法,解决DH调度算法负载不均衡。
应用场景:LVS-cache-源站,此前DH算法始终调度到后端Cache1节点,会造成Cache1负载过高,LBLC会根据负载均衡动态调度到后端其他cache节点。

# LBLCR调度算法
LBLCR:Locality-Based Least-Connection with Replication带复制功能的LBLC算法,解决LBLC负载不均衡的问题,从负载重的复制到负载轻的RS。
应用场景:LVS-cache-源站,此前LBLC算法始终调度到后端Cache1节点,会造成Cache1负载过高,会根据负载均衡动态调度到后端其他Cache节点,同时也会将缓存数据同步一份至Cache1、Cache2节点。
