LVS作为调度器,在分发请求时,会根据不同的算法挑选后端的Real Server,主要算法有:
1、rr
round robin)轮询算法,顾名思义,也就是将客户端的请求逐个分发给后端的每台Real Server;假定后端有3台服务器,编号分别为1、2、3;则分发次序为1..2..3..1..2..3..1..2..3.......
2、wrr
weight round robin,加权轮询;根据不同的服务器权重进行请求分发调度,权重大的多分发请求,权重小的少分发请求;比如3台Real Server编号为1、2、3,权重分别为4、2、1,则分发请求次序为1..1..1..1..2..2..3..1..1..1..1..2..2..3.....
3、SH
Source Hash,源地址哈希;此算法根据请求服务的客户端的域名或IP地址,进行哈希计算,计算后的值对Real Server个数取模求余,从而保证可以将同一域名或IP的请求始终分发到后端的同一个Real Server上,常用于Session保持等场景;
注解:哈希是一种高效的算法,可以根据不同的哈希函数对不同长度的输入计算后得到一个固定长度的值;其重要特性在于:对于同一值的输入,始终得到相同的哈希散列值
4、DH
Destination Hash,目标地址哈希;不同于SH是根据客户端的信息进行哈希计算,DH算法是根据请求的目标资源进行哈希计算,比如请求的URL,此方式的目的在于:能够保证对相同资源的请求始终分发到后端同样的Real Server上;
典型的应用场景在缓存服务器上,比如我们的LVS和Real Server之间增加了一层缓存服务器,缓存服务器缓存了一部分静态资源,那么LVS使用DH算法,可以将客户端请求的已存在缓存服务器的资源,始终分发给缓存服务器,而不必分发给Real Server,从而可以大大降低后端的压力,同时也提高了响应速度,两全其美的事情
以上的算法可以归类为静态算法,其都只是根据客户端请求数据包中的某些信息来进行计算,从而决定分发到那台服务器上,并没有将后端服务器的负载情况考虑在内;
下面介绍的算法可以归类为动态算法,其会考虑后端服务器的实际负载情况,并选择负载小的进行请求分发
5、LC
Least Connection,最少连接数;此算法会根据后端每台Real Server的连接数多少来分发请求,对于连接数少的服务器,会多分发客户端请求,以尽可能利用资源占用较少的服务器
连接数计算方法:active * 256 + inactive
注解:active表示正处于HTTP正发送请求或处理请求过程中;inactive表示该连接非请求和处理过程中,只是长连接释放结算,或四次挥手阶段;
6、WLC
Weight Least Connection,加权最少连接数;后端Real Server可能性能差异较大,WLC算法可以动态的获取不同服务器的真实负载情况,并调整对应的加权值,从而始终保证将请求分发到性能优异且较空闲的机器,从而提高处理效率
连接数计算方法:( active * 256 + inactive ) / weight
7、SED
Shortest Expect Delay,最短期望延迟;此算法是对WLC的一种改进,和WLC的不同在于其连接数计算方法的不同
SED连接数计算方法:( active + 1 ) * 256 / weight
和WLC不同在于两点:
(1)、不将非活动连接数计算在内
(2)、将active做+1处理
关于SED调度方法有两个事情需要注意:
在判断每个集群节点的总开销值时不使用非活动连接数值。
在入站连接被分配后,它在活动连接数值基础上加1来预料总开销值
例如:假设你有两个节点,其中一个比另一个要快三倍(一个是1GHZ的处理器,另一个是3GHz的处理器[16]),因此,你决定将一个的权重值设为1,另一个设为3,假设集群已经启动并运行了一段时间,较慢的节点上有10个活动连接,较快的节点上有30个活动连接,当新的请求抵达时,Director必须决定请求分配给哪个节点,如果这个请求没有增加每个集群节点的活动连接数量,SED值应该按下面这样计算:
较慢的节点(1GHz处理器) 10个活动连接/权重 1=10
较快的节点(3GHz处理器) 30个活动连接/权重 3=10
因为SED值相同,Director会选择首先在集群节点的表中显示的节点,如果首先显示的是较慢的节点,新的请求也将分配给它,哪怕它很慢。
如果新的连接首先增加了活动连接的数量,计算方法应该这样:
较慢的节点(1GHz处理器) 11个活动连接/权重 1=11
较快的节点(3GHz处理器) 31个活动连接/权重 3=10.34
现在较快的节点SED值更小,因此它适合分配新的连接请求。
增加活动连接数值一方面是影响是集群节点可能处于空闲状态,即使多个请求被分配给另一个集群节点了,例如:让我们使用同样的两个集群节点,但是本次我们假设较慢的节点没有活动连接,较快的节点有1个活动连接,每个节点的SED计算方法如下(回想活动连接已经增加了1):
较慢的节点(1GHz处理器) 1个活动连接/权重 1=1
较快的节点(3GHz处理器) 2个活动连接/权重 3=0.67
8、NQ
Never Queue,永不排队算法;此种算法,当客户端请求到达时,会首先根据SED算法进行选择一个RS,然后把请求分配给这个服务器,同时从算法列表中将此台服务器排除,下次请求到达时,只会在剩下的服务器列表中根据SED进行选择,等到每一台主机都分配到连接后,调度器此后每次都会根据SED算法在所有的服务器中进行计算选择;
该算法始终保证没有0连接的服务器
9、LBLC
Locality-Based Least Connections,基于局部性的最少链接
基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
总结:LVS的负载均衡算法,不同的应用场景,应选择合适的负载均衡算法,只有在充分了解了每一种算法的思想之后,才能根据自己的业务需求结合应用场景来做选择;
如果你实在不知道该如何选择,那么推荐选择WLC算法是一个不错的选择;WLC算法在实际的生产环境中,应用还是挺多的。
共同学习,写下你的评论
评论加载中...
作者其他优质文章