1.LVS简介

    LVS 是 Linux  Virtual Server ,Linux 虚拟服务器。可以实现LINUX平台下的简单负载均衡。一般来说,LVS采用三层结构:负载调度器、服务器池、共享存储。工作在TCP/IP协议的四层,其转发是依赖于四层协议的特征进行转发的,由于其转发要 依赖于协议的特征进行转发,因此需要在内核的TCP/IP协议栈进行过滤筛选,可想而知,这就需要在内核的模块来完成,而这样的过滤转发规则又是由管理员 进行定义的,所以,LVS就是两段式的架构设计,在内核空间中工作的是"ipvs",而在用户空间中工作的,用来定义集群服务规则的 是"ipvsadm"。与iptables类似,其工作在INPUT链上,由于与iptables有冲突,不能同时使用。

2.LVS类型

1).NAT模型

    这个是通过网络地址转换的方法来实现调度的。首先调度器(director)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后调度器就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP),这样真实服务器(RS)就能够接收到客户的请求数据包了。真实服务器响应完请求后,查看默认路由(NAT模式下我们需要把RS的默认路由设置为director服务器。)把响应后的数据包发送给director,director再接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。

    NAT模式特性:

        集群节点跟director必须在同一个IP网络中;
        RIP通常是私有地址,仅用于各集群节点间的通信;
        director位于client和real server之间,并负责处理进出的所有通信;
        realserver必须将网关指向DIP;
        支持端口映射;
        realserver可以使用任意OS;
        较大规模应该场景中,director易成为系统瓶颈;

2).DR模型

    DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。同TUN模式一样,DR模式可以极大的提高集群系统的伸缩性。而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求。但是要求调度器LB与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。

    DR模型特性:

        集群节点跟director必须在同一个物理网络中;
        RIP可以使用公网地址,实现便捷的远程管理和监控;
        director仅负责处理入站请求,响应报文则由realserver直接发往客户端;
        realserver不能将网关指向DIP;
        不支持端口映射;

3).TUN模型

    采用NAT模式时,由于请求和响应的报文必须通过调度器地址重写,当客户请求越来越多时,调度器处理能力将成为瓶颈。为了解决这个问题,调度器把请求的报文通过IP隧道转发到真实的服务器。真实的服务器将响应处理后的数据直接返回给客户端。这样调度器就只处理请求入站报文,由于一般网络服务应答数据比请求报文大很多,采用VS/TUN模式后,集群系统的最大吞吐量可以提高10倍。

    TUN模型特性:

        集群节点可以跨越Internet;
        RIP必须是公网地址;
        director仅负责处理入站请求,响应报文则由realserver直接发往客户端;
        realserver网关不能指向director;
        只有支持隧道功能的OS才能用于realserver;
        不支持端口映射;

3.LVS调度方法

    LVS调度方法分为静态调度方法和动态调度方法两类。

    静态调度方法:

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

        wrr:加权轮叫调度算法是按权值的高低和轮叫方式分配请求到各服务器。权值高的服务器先收到的连接,权值高的服务器比权值低的服务器处理更多的连接,相同权值的服务器处理相同数目的连接数。

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

        sh:源地址散列调度算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。主要用于session会话绑定。

    动态调度方法:

        lc:最少链接,简称LC。该调度是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态调度算法,它通过服务器当前所活跃的连接数来估计服务器的负载情况。计算当前realserver 的负载情况计算方法:active*256+inactive。

        wlc:加权最少链接,简称WLC。加权最小连接调度是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。计算当前realserver 的负载情况计算方法:(active*256+inactive)/weight。
        sed:最短的期望的延迟,简称SED。分配一个接踵而来的请求以最短的期望的延迟方式到服务器。计算当前realserver 的负载情况计算方法:(active+1)*256/weight。
        nq:无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要在进行sed运算。

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

注:active:活动连接,表示已经建立的连接并正在进行数据传输。inactive:非活动连接,表示已经建立的连接但没有在进行数据传输。

参考资料:

LVS原理详解:http://atong.blog.51cto.com/2393905/1348602

LVS工作模式及原理:http://blog.csdn.net/caoshuming_500/article/details/8291940

LVS工作模式及调度算法介绍:http://www.xmydlinux.org/201102/331.html