看了网上几篇LVS的调度算法讲解,感觉都讲的不错,但是还有些不明确的地方,为了方便小白更好的学习理解,特此将LVS官方网站对LVS十大调度算法的讲解翻译如下,以方便英语不好的同学自行查阅。
LVS官网:http://www.linuxvirtualserver.org/
LVS相关文档原文:http://www.linuxvirtualserver.org/docs/scheduling.html
Linux虚拟服务器中的作业调度算法
本页介绍在Linux虚拟服务器中实现的作业调度算法。
- 轮询调度
- 加权轮询调度
- 最小连接调度
- 加权最小连接调度
- 基于局部性的最小连接调度
- 基于局部性的最小连接复制调度
- 目的哈希调度
- 源哈希调度
- 最短期望延迟调度
- 从不排队调度
轮询调度
轮询调度算法将每个传入的请求发送到其列表中的下一个服务器。因此,假设在三服务器集群(服务器A、B和C)中,请求1将转到服务器A,请求2将转到服务器B,请求3将转到服务器C,请求4将转到服务器a,从而完成服务器的循环(轮询)。它将所有真实服务器视为平等的,而不考虑每个服务器活跃的传入连接数或响应时间。与传统的轮询DNS相比,虚拟服务器(译者注:虚拟服务器即LVS)提供了一些优势。轮询DNS将一个域名解析为不同的IP地址,调度粒度是基于主机的,DNS查询的缓存阻碍了基本算法,这些因素导致真实服务器之间存在显著的动态负载不平衡。虚拟服务器的调度粒度是基于网络连接的,由于其精细的调度粒度,它远优于轮询DNS。
(译者注:轮询DNS即类似CDN的方式,这里官网是想说明由于浏览器缓存的缘故,实际上CDN并不能达到预期的负载均衡效果,CDN有其自身作用,但是不能完全代替LVS)
加权轮询调度
加权轮询调度旨在更好地处理具有不同处理能力的服务器。可以为每台服务器分配一个权重,一个表示处理能力的整数值。权重较高的服务器比权重较低的服务器首先接收新连接,权重较高的服务器比权重较低的服务器获得更多连接,权重相等的服务器获得相同连接。例如,真实服务器A、B和C的权重分别为4、3和2,一个好的调度序列将在一个调度顺序(所有权重之和)将会是为AABABCABC。在加权轮询调度的实现中,修改虚拟服务器的规则后,根据服务器的权重生成调度序列。网络连接根据调度序列以轮询方式重定向到不同的真实服务器。
当真实服务器的处理能力不同时,加权轮询调度优于轮询调度。然而,如果请求的负载变化很大,可能会导致真实服务器之间的动态负载不平衡。简言之,大多数需要大量响应的请求可能会被定向到同一台真正的服务器。
实际上,轮询调度是加权轮询调度的一个特例,其中所有的权重都是相等的。
最小连接调度
最小连接调度算法将网络连接定向到具有最少已建立连接数的服务器。这是一种动态调度算法;因为它需要动态计算每个服务器的实时连接数。对于管理一组性能相似的服务器的虚拟服务器,当请求负载变化很大时,最小连接调度有助于平滑分布。虚拟服务器将请求定向到活动连接最少的真实服务器。
乍一看,即使有不同处理能力的服务器,最少的连接调度似乎也能很好地执行,因为更快的服务器将获得更多的网络连接。事实上,由于TCP的等待状态,它不能很好地执行。TCP的等待时间通常为2分钟,在这2分钟内,繁忙的网站通常会收到数千个连接,例如,服务器A的功能是服务器B的两倍,服务器A正在处理数千个请求,并将它们保持在TCP的等待时间状态,但服务器B正在缓慢处理完成其数千个连接。因此,最小连接调度无法在具有不同处理能力的服务器之间实现负载均衡。(译者注:官网这段说明是说真实服务器A有1000个处于TCP等待状态的链接而真实服务器B有1000个处于繁忙状态的链接,按照最小链接调度的算法A和B的负载情况应该相同,但是实际上B的负载要远远高于A)
加权最小连接调度
加权最小连接调度是最小连接调度的超集,您可以在其中为每个真实服务器分配性能权重。权重值较高的服务器在任何时候都会收到更大比例的实时连接。虚拟服务器管理员可以为每台真正的服务器分配一个权重,并为每台服务器安排网络连接,其中每台服务器当前活动连接数的百分比与其权重成比例。默认权重为1。
加权最小连接调度的工作原理如下:
假设有n个真正的服务器,每个服务器i都有权重Wi(i=1,…,n)和活动连接Ci(i=1,…,n),ALL_CONNECTIONS是Ci(i=1,…,n)的总和,下一个网络连接将指向服务器j,其中
(Cj/ALL_CONNECTIONS)/Wj=min{(Ci/ALL_CONNECTIONS)/Wi}(i=1,…,n)
(译者注:这个式子的含义是找到活动链接数除以总权重再除以其自身权重最小的的服务器j)
由于ALL_CONNECTIONS在该查找中是一个常数,因此不需要将Ci除以ALL_CONNECTION,可以根据需要对其进行优化为如下式子:
Cj/Wj=min{Ci/Wi}(i=1,…,n)
(译者注:这个式子的含义是找到活动链接数除以其自身权重最小的的服务器j)
加权最小连接调度算法需要比最小连接更多的除法。为了在服务器处理能力相同的情况下最小化调度开销,最小连接调度算法和加权最小连接调度算法都应该被实施。
基于局部性的最小连接调度
基于局部性的最小连接调度算法用于目标IP负载平衡。它通常用于缓存集群。如果服务器处于活动状态且负载不足,该算法通常会将目的地为IP地址的数据包定向到其服务器。如果服务器过载(其活动连接数大于其权重),并且有一台服务器处于半负载状态,则将加权最少的连接服务器分配给该IP地址。
基于局部性的最小连接复制调度
基于局部性的最小连接复制调度算法也用于目标IP负载平衡。它通常用于缓存集群。它与LBLC调度的不同之处如下:负载平衡器维护从目标到可以为目标服务的一组服务器节点的映射。对目标的请求被分配到目标服务器集中连接最少的节点。如果服务器集中的所有节点都过载,它会在集群中选择一个连接最少的节点,并将其添加到目标服务器集中。如果在指定的时间内未修改服务器集,则会从服务器集中删除负载最大的节点,以避免高度复制。
目的哈希调度
目的哈希调度算法通过根据服务器的目的地IP地址查找静态分配的哈希表,将网络连接分配给服务器。
源哈希调度
源哈希调度算法通过根据服务器的源IP地址查找静态分配的哈希表,将网络连接分配给服务器。
最短期望延迟调度
最短预期延迟调度算法将网络连接分配给具有最短预期延迟的服务器。如果发送到第i台服务器,作业将经历的预期延迟为(Ci+1)/Ui,其中Ci是第i台服务器上的连接数,Ui是第i台服务器的固定服务率(权重)。
从不排队调度
从不排队调度算法采用调度模型。当有空闲服务器可用时,作业将被发送到空闲服务器,而不是等待最快的服务器。当没有空闲服务器可用时,作业将被发送到将其预期延迟最小化的服务器(按照最短预期延迟调度算法计算出的服务器)。