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
节点。