LVS(Linux Virtual Server,Linux虚拟服务器)是全球最流行的四层负载均衡开源软件,属于内核级功能,工作在INPUT链的位置,将发往INPUT的流量进行“处理”。LVS服务器负责接收用户的各类请求,并转发给提供对应服务的服务器,由提供具体服务的服务器将结果返回给用户,因此LVS提供的是代理服务功能。用户发送请求时访问的是LVS服务器,而不是提供具体服务的服务器,从而隐藏了内部服务器的ip等信息,在一定程度上也加强了安全性。

    用户向LVS服务器发送请求时,如果有多台提供具体服务的服务器,LVS服务器需要考虑将用户请求转发给哪一台真实服务器或者如何分配给不同的真实服务器,此时就要使用调度算法。LVS调度算法可分为静态算法和动态算法两大类。

  1. 静态算法

    静态算法是仅根据算法自身来进行调度,不考虑真实服务器的负载,主要有四种具体的调度算法:

1.1 RR调度算法

    RR(roundrobin,轮询调度算法)调度算法指的是LVS服务器在某一个时间段内接收到一定数量的同类型用户请求后,会将所有的同类型用户请求按序转发给提供该服务的真实服务器,在一定程度上可以视为公平调度。

1.2 WRR调度算法

    由于轮询调度算法并未考虑不同真实服务器的负载能力,可能会给负载能力较弱的真实服务器造成压力,在此基础上产生了WRR(Weighted RR,加权轮询调度算法)调度算法。

    加权轮询调度算法会根据不同真实服务器的具体性能来设置不同的权重,负载性能越好,被分配到的权重也就越高,在LVS服务器转发用户请求时会更早、更多地接收并处理用户请求。

1.3 SH调度算法

    SH(Source Hashing,源地址哈希调度算法)调度算法的功能是实现会话绑定,将来自同一个ip的用户请求始终转发给第一次处理来自该ip请求的真实服务器。不过此种调度算法弊端也比较明显,例如处理来自该ip用户请求的真实服务器出现故障后无法进行请求转发,此外来自同一个ip之下的用户量可能会非常大,全部转发给某一台真实服务器会对该服务器负载造成巨大压力。

1.4 DH(Destination Hashing)调度算法

    DH(Destination Hashing,目标地址哈希调度算法)调度算法是指LVS服务器第一次接收到某一类的用户请求时,会转发至后端处理该类请求的服务器,后续如果再有同类的用户请求将始终转发至第一次挑中的真实服务器,典型使用场景是正向代理缓存场景中的负载均衡,如 web缓存。


  1. 动态算法

    使用动态算法时会考虑到真实服务器的负载能力,并生成一个Overhead值,真实服务器的Overhead值越小,说明服务器越空闲、负载越轻,接收到LVS服务器转发用户请求的优先度越高。动态算法主要有6中具体的调度算法:

2.1 LC调度算法

    LC(least connections,最少连接调度算法)调度算法适用于长连接应用,LVS服务器通过真实服务器当前活跃的连接数来估计负载状态,把最新的连接请求分配给当前连接数最少的真实服务器。LVS服务器会记录每个真实服务器已建立连接的数量,当一个用户请求被转发至某一台真实服务器时,其连接数加1,当连接中断或超时时,其连接数会减1。

2.2 WLC调度算法

    WLC(Weighted LC,加权最少连接调度算法)调度算法是默认调度算法,在最少连接调度算法的基础上加入了权重。使用此种调度算法时,不同负载性能的真实服务器会被赋予不同的权重,性能越好,被赋予的权重也就越大,所得到的Overhead值也就越小,在LVS服务器转发请求时将被优先分配。

2.3 SED调度算法

    SED(Shortest Expection Delay,最短延迟调度算法)调度算法是对加权最少连接调度算法的改进,该算法只检查活动连接,而不考虑非活动连接,初始连接高权重优先。但此种算法的一个弊端是,如果某一台真实服务器的初始连接权重很高,可能会被分配大量的用户请求,而其他真实服务器一直处于空闲状态。

2.4 NQ调度算法

    NQ(Never Queue,无需队列调度算法)调度算法会在第一轮采用轮询调度算法,LVS服务器给所有符合条件的真实服务器都分配一个用户请求,从第二轮开始将采用最短延迟调度算法。

2.5 LBLC调度算法

    LBLC(Locality-Based LC,基于局部的最少连接调度算法)调度算法属于动态的目标地址哈希调度算法,根据负载状态实现正向代理。LVS服务器会根据用户的ip和请求内容找到最近访问过的真实服务器,如果该真实服务器处于可用状态且无超载现象,则将用户请求再次转发到该真实服务器;如果该真实服务器暂时无法处理用户请求,则使用最少连接调度算法转发给一个能满足用户请求的真实服务器。

2.6 LBLCR调度算法

    LBLCR(LBLC with Replication,带复制的基于局部最少连接调度算法)调度算法是在LBLC调度算法的基础上加入了复制功能,从而解决LBLC负载不均衡问题,将web缓存等从负载重的真实服务器复制到负载轻的真实服务器上。


  1. FO调度算法和OVF调度算法

    FO调度算法和OVF调度算法是内核版本4.15后新增调度算法。

3.1 FO调度算法

    FO(Weighted Fail Over)调度算法属于静态算法,在FO调度算法中,LVS服务器会遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F_OVERLOAD标志)的且权重最高的真实服务器服务器来进行调度。

3.2 OVF调度算法

    OVF(Overflow-connection)调度算法属于动态算法,基于真实服务器的活动连接数量和权重值实现,LVS服务器将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。