LVS调度算法(下)——动态调度算法

来源:互联网 发布:学校网络拓扑图图片 编辑:程序博客网 时间:2024/05/23 12:01

        首要要介绍活动连接与非活动连接的概念:

        活动连接表示用户已经连接到服务器,并且正在数据传输。非活动连接表示已经和服务器建立连接,并且数据已经传输结束,但是还没有断开连接,

如有长连接。对于活动连接因为有数据交换,所以会占用更多的内存;非活动连接只要维护当前会话状态即可,因此需要很小的内存空间(最多几十KB)。

因此要在调度时考虑服务器当前的负载情况,需要区别对待活动连接和非活动连接,甚至可以忽略非活动连接(因为占用很少资源)。

         动态调度算法就是根据后端服务器当前的活动连接和非活动连接数来实现请求的调度。动态调度算法常见的有如下几种:

       

         1.最少连接算法(LeastConnection,LC)

        通过计算后端服务器当前的活动连接数和非活动连接数的总数,并对多个节点的结果进行比较来决定将请求转发到哪个节点,哪个节点的值最小就将

请求转发到哪个节点。因此这种算法会考虑到每个服务器节点当前的连接数,并挑选一个连接数最小(相对最空闲)的节点进行请求转发。

        具体算法:连接数=活动连接数*256 + 非活动连接数


        2.加权最少连接(WLC)

        因为每个服务器节点的性能可能不同,因此需要性能高的服务器负担更多的请求,所以在最少连接算法的基础上结合服务器节点的权重来进行请求调度。

        计算方式:结果=(活动连接数*256 + 非活动连接数)/权重

        这里的权重值,一般要结合当前节点在集群环境中性能比例来计算。例如A、B两个节点的性能为2:1,那么它们的权重值也要保持2:1。

        通过以上的计算,取结果最小值的那个节点作为处理当前请求的目标节点。


        3.最少期望延迟调度算法(sed)

       WLC调度算法有一定的缺陷。当请求量比较少的时候,该算法的计算结果是将请求更多的指向了权重低的服务器,即性能较差的服务器;而我们

希望在请求少的时候将请求尽可能转发到性能高的服务器上。sed这种调度算法为了解决WLC的缺点而生,它不再考虑非活动连接。这种算法在请求

量较少的时候也能实现类似加权轮询调度的效果。

        算法: (活动连接数+1)*256/权重

      

        sed这种算法也有一定缺陷,在请求量比较少的时候,某个权重下的节点可能一个请求都没有轮到,而权重大的节点却轮到了比较多的请求。

因此出现了下一种动态调度算法:NQ。

       

        4.永不排队(Never Queue,NQ)

        这种算法在请求量比较小的时候可以避免sed算法存在的问题,也就是会将请求在sed的结果上进行轮询调度。例如sed算法的结果当前已经

将请求有转发到A、B节点,新的请求又被计算到A节点,此时如果有C节点,则NQ算法会将这个新的请求调度到C节点而不是继续调度到A节点而

不会理会此时A的权重问题,权重的判断仅仅在sed算法这个步骤进行考虑。也就是NQ算法在sed算法的结果之后增加了轮询的机制(也会考虑一定程度的权重),

因此这种算法就会尽量不然请求出现排队的情况,即避免了某个节点非常繁忙而其他节点相对空闲的情况。避免了权重小的节点不会出现没有请求被调度的情况。


        5.基于本地的最少连接(Locality-Based Least-Connection,LBLC)

        这种算法本质就是LC算法或理解为WLC算法。但是该算法的特性是,注意实现目标是要和静态调度算法中的DH算法一样,用于将同一类请求

转发到一个固定节点,因此常用于缓存服务器的场景。但是DH算法因为是静态调度算法,不会考虑后端(缓存)服务器的当前连接数,但LBLC就

是在DH算法的基础上考虑后端服务器当前的连接数。

        如果(缓存)服务器使用了集群(如Memcached的主主复制),因为所有节点的缓存数据都相同,因此要使用负载均衡算法来实现请求按照当

前服务器的负载进行转发。而如果后端的每个缓存服务器的内容不同,使用LBLC就会破坏命中率并且导致多个缓存节点缓存了相同的数据,因此为了

提高缓存命中率以及防止多个节点缓存相同的数据,一般就不采用LBLC而直接采用DH。

 

        所以,要提高负载均衡效果就要破坏缓存命中率以及多个缓存节点会缓存相同数据;要提高缓存命中率已经防止多个节点缓存相同的数据,就会

降低负载均衡效果。所以这需要找到一个平衡点,根据实际需要来决定。


        6.基于本地的带有复制功能的最少连接调度算法(LBLCR)

        为了解决LBLC算法的缺陷,即提高缓存命中率且防止多个缓存节点缓存相同数据,并且保证负载均衡效果。就需要使用这里的调度算法。

        LBLC就是一个DH+LC的算法,并不会考虑缓存命中率而只考虑尽可能的负载均衡。LBLCR这种算法中,了可以理解为后端多个缓存服务器

可以通过内容交换协议实现缓存共享。因此无论请求哪个缓存节点,如果该节点没有数据,它不会直接到Web服务器上查询,而是试图到另一个

缓存节点中查询,如果有则将其拿过来并放入当前的缓存服务器,这样就实现一定程度的缓存复制功能,可以提高缓存命中率。

        注意,这里的缓存共享并不是完全的Replication,而是仅仅当请求的节点没有需要的数据时去其他缓存节点查询所请求的缓存数据。但是这种

机制因为要到其他缓存节点查询,所以性能会比直接使用DH差一些。

        这种算法也不会防止多个节点缓存相同的数据,而只能保证缓存命中率。



        三、调度算法总结

        在生产环境中,因为使用了负载均衡集群,那么连接数应该就会非常多。所以在选择负载均衡调度算法的时候就要考虑那种在大量请求环境

下各方面最优秀的调度算法。请求量大的时候,对于非活动连接数也应当考虑,因为大量非活动连接也会占用非常可观的资源。

        在各种调度算法中,LVS的ipvs默认使用的是WLC。这种算法在大量请求时的性能是最理想的,但是一般如果要实现粘性session,则一般使用SH算法。

因为NQ是基于sed算法的,不会考虑非活动连接,因此在大量请求环境中非活动连接占用可观资源,所以NQ算法一般也不合适。

 


0 0