一、LVS简介

    LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。

    LVS 集群采用IP负载和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时要考虑系统的透明性,可伸缩性,高可用性和易管理性。 

    LVS自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。可以利用LVS技术实现高可伸缩的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频音频点播服务等等,有许多比较著名网站和组织都在使用LVS架设的集群系统,例如:Linux的门户网站(www.linux.com)、向RealPlayer提供音频视频服务而闻名的Real公司(www.real.com)、全球最大的开源网站(sourceforge.net)、淘宝,阿里巴巴等。


二、LVS集群的组成

   一般来说,使用LVS架设的服务器集群系统有三个部分组成:最前端的负载均衡层(Load Balancer,LB),中间的服务器群组层(Server Array),最底端的数据共享存储层(Shared Storage),在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。

   

三、LVS集群的优缺点

优点:

   (1)开源,免费

   (2)可供参考学习的技术资料丰富

   (3)负载均衡功能强大,经过良好优化lvs集群可与专业的硬件均衡设备(F5)BIG-IP相媲美


缺点:

   (1)技术要求较高,实施难度大,若想将lvs的负载均衡功能最大的发挥出来,需要专业的维护团队,以便提供强大的技术支持

   (2)仅能在四层实现调度,可控性不够精细


四、LVS四种工作模型

    LVS-NAT, DNAT(多目标NAT)

    LVS-DR(Direct Routing)

    LVS-TUN (IPIP)

    LVS-FULLNAT


五、LVS调度算法详解

到目前为止,LVS的调度算法一共有10种,具体内容如下所示

1.轮叫调度(Round Robin)(简称rr)

    调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。


2.加权轮叫(Weighted Round Robin)(简称wrr)

   调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。


3.最少链接(Least Connections)(LC)

   调度器通过“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。


4.加权最少链接(Weighted Least Connections)(WLC)

   在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。


5.基于局部性的最少链接(Locality-Based Least Connections)(LBLC)

 “基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接” 的原则选出一个可用的服务器,将请求发送到该服务器。


6.带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)(LBLCR)

 “带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标 IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。


7.目标地址散列(Destination Hashing)(DH)

 “目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。


8.源地址散列(Source Hashing)(SH)

 “源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。


9. 最短的期望的延迟(Shortest Expected Delay Scheduling SED)(SED)

   基于wlc算法。这个必须举例来说了ABC三台机器分别权重123 ,连接数也分别是123。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用sed算法后会进行这样一个运算

     A(1+1)/1

     B(1+2)/2

     C(1+3)/3

     根据运算结果,把连接交给C 。

    

10.最少队列调度(Never Queue Scheduling NQ)(NQ)

    无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要在进行sed运算