深入解析:LVS负载均衡的十种核心调度算法
静态算法
静态算法只根据算法本身进行调度,不考虑服务器当前的负载情况
RR(轮询:Round Robin)
RR算法就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单。轮询算法假设所有的服务器处理请求的能力都一样的,调度器会将所有的请求平均分配给每个真实服务器。特点是将收到的访问请求按顺序轮流分配给集群中的各节点真实服务器中,不管服务器实际的连接数和系统负载。轮询 RS分别被调度,当RS配置有差别时不推荐
WRR(加权轮询:Weighted Round Robin)
WRR算法就是加权轮询根据RS的配置进行加权调度,主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度器调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
SH( 源地址散列调度:Source Hashing )
SH算法就是将来自于同一个IP地址的请求始终发往 第一次挑中的RS,从而实现会话绑定,先根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同,它的算法流程与目标地址散列调度算法的基本相似。
DH(目标地址散列调度:Destination Hashing )
DH算法就是第一次轮询调度至RS,后续将发往同一个目标地址的请 求始终转发至第一次挑中的RS,先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。
LVS动态调度算法
动态算法
主要根据每个RS当前的负载状况和算法进行调度,负载(overhead)较小的RS下次将会被调度
LC(最小连接调度:Least Connections )
LC算法是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态的调度算法,它通过服务器当前活跃的连接数来估计服务器的情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中断或者超时,其连接数减1。
适用于长连接应用。Overhead(负载值)= activeconns(活动连接数) × 256 + inactiveconns(非活动连接数)(集群系统的真实服务器具有相近的系统性能,采用最小连接调度算法可以比较好地均衡负载。)
WLC(加权最少连接:(Weight Least Connections )
WLC算法是最小连接调度的超集,各个服务器相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。默认调度方法:Overhead = (activeconns × 256 + inactiveconns) / weight。
SED (最短的期望的延迟调度:Shortest Expected Delay )
SED算法基于WLC算法但保证了高权重优先。举个例子吧,ABC三台服务器的权重分别为1、2、3 。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用SED算法后会进行一个运算
A:(1+1)/1=2 B:(1+2)/2=3/2 C:(1+3)/3=4/3 就把请求交给得出运算结果最小的服务器。
预期的延迟时间为(Ci +1)/ Ui,其中 Ci 是第 i 个服务器上的连接数,而 Ui 是第 i 个服务器的固定服务速率(权重)
初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight
但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接
NQ(最少队列调度:Never Queue )
NQ算法在SED的基础上,无需队列。如果有realserver的连接数等于0就直接分配过去,不需要在进行SED运算,不严谨的来说就是先轮询无空闲再SED。
LBLC(基于局部的最少连接调度:Locality-Based Least Connections )
LBLC算法是动态的DH算法,针对请求报文的目标IP地址的 负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和Cache命中率,从而提升整个集群系统的处理能力。LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则使用’最少连接’的原则选出一个可用的服务器,将请求发送到服务器。
LBLCR(带复制的基于局部性的最少连接:Locality-Based Least Connections with Replication )
LBLCR算法是带复制功能的LBLC,目前主要用于Cache集群系统,它与LBLC算法不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLCR算法维护从一个目标IP地址到一台服务器的映射。按’最小连接’原则从该服务器组中选出一一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按’最小连接’原则从整个集群中选出一台服务器,将该服务器加入到这个服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
新算法
FO算法(Weighted Fail Over)
FO算法常用作灰度,发布会遍历lvs关联的RS链表,找到未过载(未设置IP_VS_DEST_F_OVERLOAD标识)且权重最高的RS进行调度。当服务器承接大量链接,我们可以对此服务器进行过载标记(IP_VS_DEST_F OVERLOAD),那么vs调度器就不会把链接调度到有过载标记的主机中。
OVF算法(Overflow-connection)
OVF算法是基于RS的活动连接数和权重值来实现。它会将新连接调度到权重值最高的RS,直到其活动连接数超过它的权重值,之后调度到下一个权重值最高的RS。该算法会遍历lvs关联的RS链表,找到权重值最高的可用RS。可用RS需要满足以下条件:
- 未过载(未设置IP_VS_DEST_F_OVERLOAD标识)。
- RS当前活动连接数小于其权重值。
- 权重值不为0。
十种核心调度算法对比
下表汇总了LVS负载均衡的十种核心调度算法,便于快速对比和选型参考:
| 算法名称 | 类型 | 核心原理简述 | 适用场景 | 优缺点 |
|---|---|---|---|---|
| RR(轮询) | 静态 | 按顺序循环将请求依次分配给各服务器,实现简单。 | 服务器性能相近、无状态短连接服务。 | 优点:实现简单,公平分配。 缺点:不考虑服务器负载和性能差异,性能不均时效率低。 |
| WRR(加权轮询) | 静态 | 根据服务器权值分配请求,权值越高被调度的次数越多。 | 服务器性能有明显差异,需要按性能比例分配负载。 | 优点:考虑了服务器性能差异,分配更合理。 缺点:仍为静态分配,无法感知实时负载变化。 |
| SH(源地址散列) | 静态 | 根据请求源IP进行哈希,将同一源IP的请求始终发往同一台服务器。 | 需要会话保持(Session Persistence)的应用,如登录状态。 | 优点:实现会话绑定,保证同一用户请求到同一服务器。 缺点:服务器增减或故障时哈希结果会变化,可能引起会话中断。 |
| DH(目标地址散列) | 静态 | 根据请求目标IP进行哈希,将同一目标IP的请求始终发往同一台服务器。 | Cache集群、CDN等需要提高局部性和缓存命中率的场景。 | 优点:相同目标IP的请求落到同一服务器,提高缓存命中率。 缺点:静态哈希,无法适应负载变化。 |
| LC(最小连接) | 动态 | 将新连接分配给当前连接数最少的服务器。 | 长连接应用(如数据库连接池、WebSocket),服务器性能相近。 | 优点:动态感知服务器负载,负载相对均衡。 缺点:未考虑服务器性能差异,仅以连接数衡量负载可能不准确。 |
| WLC(加权最少连接) | 动态 | 在LC基础上引入权值,使服务器的连接数与其权值成比例。 | 服务器性能差异较大,且需要动态负载均衡的场景。 | 优点:结合了权值与连接数,分配更精细。 缺点:高权重服务器在初始阶段可能集中大量请求。 |
| SED(最短期望延迟) | 动态 | 基于WLC改进,计算(连接数+1)/权值,选择值最小的服务器,保证高权重优先。 | 需要优先调度高权重服务器,且希望初始连接快速响应的场景。 | 优点:高权重服务器优先获得请求,提高整体吞吐。 缺点:计算稍复杂,权重悬殊时低权重服务器可能长期闲置。 |
| NQ(最少队列) | 动态 | SED的改进版,若某服务器连接数为0则直接分配,否则按SED计算。 | 希望避免服务器空闲,同时兼顾权重优先的场景。 | 优点:避免服务器空闲,提高资源利用率。 缺点:仍基于SED,权重差异大时低权重服务器仍可能饿死。 |
| LBLC(基于局部的最少连接) | 动态 | 动态的DH算法,针对目标IP进行调度,结合“最近使用”和“最少连接”原则。 | Cache集群系统,目标IP变化频繁,需要提高访问局部性和缓存命中率。 | 优点:动态适应负载,提高缓存命中率。 缺点:实现较复杂,仅适用于特定Cache场景。 |
| LBLCR(带复制的LBLC) | 动态 | LBLC的带复制版本,维护目标IP到一组服务器的映射,支持动态增删组内服务器。 | 大规模Cache集群,需要更高可用性和负载分散的场景。 | 优点:支持复制,可用性更高,负载更分散。 缺点:实现更复杂,维护成本高。 |
说明:FO(Weighted Fail Over)和OVF(Overflow-connection)属于较新的调度算法,主要用于灰度发布和溢出连接控制,上表未包含,请参考前文“新算法”章节。