首页 > 技术文章 > 3.LVS的十种调度算法

ccku 2020-09-15 09:42 原文

一、静态调度算法

固定算法(静态调度算法):只根据算法本身去调度,不考虑服务器本身

1.RR:轮询

将每次用户的请求分配给后端的服务器,从每一台服务器开始到第N台结束,然后循环

2.WRR:加权轮询

按照权重的比例实现在多台主机之间进行调度(在调度时权重为分母)

第一次客户端发起请求,WRR轮询算法按照后端服务器的权重,将请求分配给后端服务器,此时RS1的负载为1/2,RS2的负载为1/2,RS的负载为1
那么第二次负载调度器调度请求,就只分配给RS1和RS2,不分配给RS3;直到三台服务器的负载均衡后,调度器会重新按照权重进行调度请求
3.SH:source hash 源地址散列

将同一个IP的用户请求,发送给一台服务器

http:无状态协议
cookie:用户端持久化;session:服务器端持久化
假设某购物网站使用的是轮询调度算法,用户进行登录后,每刷新一次网页,就需要重新进行一次登录,大大降低了用户的体验;

一般大型的企业架构后端都有一台或多台保存session信息的持久化服务器,所有的用户的信息和变量值都会保存在session持久化服务器上共享存储,用户发起请求时不管调度到哪台服务器上,服务器都会向后端session持久化服务器进行查询,返回结果。

而简单的实现就是使用source hash源地址散列算法,将同一IP的用户请求,固定在一台后端服务器上,用户的请求都在这台服务器上进行处理

4.DH:destination hash 目的地址散列

将同一个目标地址的用户请求发送给同一个真实服务器,提高缓存的命中率

二、动态调度算法

动态算法(动态调度算法):除了考虑算法本身,还要考虑服务器状态

5.LC:最少连接

将新的连接请求,分配给连接数最少的服务器

它通告服务器当前所活跃的连接数来估计服务器的负载均衡,调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1,当连接中止或超时,其连接数减一

简单算法: 活动连接 x 256 + 非活动连接 (谁的小,挑谁)

6.WLC:加权最少连接(默认调度方法)

特殊的最少连接算法,权重越大承担的请求数越多;

服务器的缺省权值为1,系统管理员可以动态的设置服务器的权重,加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权重成比例;

简单算法:(活动连接 x 256 + 非活动连接) / 权重

但是LC 和 WLC 算法有一个最大的问题就是:
假如有两台服务器s1 s2 ,第一台s1的权重为1 ,第二台s2的权重为2;两台的活动连接数和非活动连接数都为0时,
LVS会把请求先分配给服务器1,它是按照服务器的先后顺序来的
7.SED:最短期望延迟

特殊的WLC算法;

简单算法:(活动连接+1) x 256 / 权重

这种算法解决了上述的问题,当活动连接和非活动连接都为0时,SED算法会将活动连接0+1然后进行计算

8.NQ:永不排队

特殊的SED算法,无需等待,如果有真实服务器的连接数等于0那就直接分配不需要运算

9.LBLC:特殊的DH算法

即能提高缓存命中率,又要考虑服务器性能

10.LBLCR:LBLCR + 缓存

尽可能提高负载均衡和缓存命中率的折中方案

这种算法是针对目标IP地址的负载均衡,根据请求的目标IP地址找出该目标IP地址对应的服务器组,按"最小连接"原则从服务器组中选出有一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按"最小连接"原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器;

同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低负载的程度

三、LVS持久化连接

类似于 SH 算法

优先级最高

普遍应用于HTTPS中

PCC 持久客户端连接

每客户端持久;将来自同一客户端的所有请求统统定向至此前选定的RS;

也就是只要IP相同,分配的服务器始终相同

example: ipvsadm -A -t 172.16.0.8:0 -s wlc -p 120

-p 时间(s) 持久化时间

PPC 持久端口连接

每端口持久;将来自同一客户端对同一个服务(端口)的请求,始终定向至此前选定的RS

example: ipvsadm -A -t 172.16.0.8:80 -s rr -p 120

PFMC 持久防火墙标记连接

将来自于同一客户端对指定服务(端口)的请求,始终定向至此选定的RS;不过它可以将两个毫不相干的端口定义为一个集群服务

iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 80 -j MARK --set-mark 10

iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 443 -j MARK --set-mark 10

service iptables save

ipvsadm -A -f 10 -s wlc -p 120

推荐阅读