一、LVS 概述

Linux Virtual Server 项目由章文嵩博士在1998 年5 月发起创立,是国内最早的自由软件项目之一。Linux Virtual Server 针对高伸缩、高可用网络服务的需求,提出了基于IP 层和基于内容请求分发的负载均衡调度解决方案。由于该项目的负载调度技术是在 Linux 内核中实现的,所以称之为“Linux 虚拟服务器”(LinuxVirtual Server),简称为LVS。

LVS 集群的特点可以归结如下:
功能:基于内容的请求分发技术和3 种IP 负载均衡技术,十种连接调度算法
适用性:后端服务器可运行Linux,Unix,Mac/OS 和Windows NT/2000 等多种操作系统。支持绝大多数的TCP 和UDP 协议
灵活性:无需对客户机和服务器作任何修改
性能:支持几百万并发连接,系统的最大吞吐量可接近10Gbits/s
可靠性:已经在很多大型的、关键性的站点的应用
软件许可证:基于GPL 许可证发行


很多应用系统厂商都利用 LVS 的代码提供了基于LVS 的集群方案:
RedHat 从其6.1 发行版起已包含LVS 代码,并开发了一个LVS 图形化的集群管理工具Piranha,用于控制LVS 集群。
VA Linux 向客户提供基于LVS 的服务器集群系统,并且提供相关的服务和支持。
TurboLinux 的Linux 集群产品“TurboCluster”实际上是基于LVS 的构想和代码。
红旗 Linux 和中软都提供基于LVS 的集群解决方案,并在2000 年9 月召开的LinuxWorld China 2000 上展示。


Linux虚拟服务器(即分发器或调度器): 不真正提供服务,但接受客户的访问,为整个集群提供一个唯一的入口。
真实服务器(Real Server):  真正提供服务,集群中每个Real Server可以是物理机,也可以是虚拟机。

二、LVS 体系结构介绍:

LVS 通过前端一个负载调度器(Load Balancer,也叫负载均衡器)无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访问一台高性能、高可用的服务器一样。客户程序不受服务器集群的影响不需作任何修改。系统的伸缩性通过在服务器机群中透明地加入或删除一个节点来达到,通过检测节点或服务进程故障和
正确地重置使系统达到高可用性。

LVS 的抽象体系结构分为三个层次:负载调度器(load balancer)、服务器池(server pool)、共享存储(shared storage)

四层负载均衡LVS简介_LVS

三、LVS 负载均衡模型:
LVS 的三种负载均衡模型(地址转换(NAT)、IP 隧道(IP Tunneling)和直接路由(DR))


1)NAT 模式下的服务器节点使用的是私有IP,均衡器是集群的唯一出入口,网络结构呈现为一种类似防火墙的私有网结构,服务器结点无法和客户端直接通信,所有数据都需要经过均衡器进行处理(分发/路由/NAT)

四层负载均衡LVS简介_LVS_02

2)VS/TUN 模式采用开放的网络结构,负载均衡器仅仅处理进入集群的请求数据包,而返回数据包不经过负载均衡器。服务器结点拥有合法的公网IP 地址,可将应答包直接返回给客户端。负载均衡器和服务器结点的连接可以是同一LAN 上,也可以跨越WAN 在不同的网段上。
负载均衡器通过 IPIP 协议将客户端的请求包封装为新的IP 包,发给服务器节点。服务器结点收到均衡器发来的IPIP 数据包后,将包解开,根据包内的客户端源地址将处理结果,直接返回给客户端。

四层负载均衡LVS简介_LVS_03

3)DR 模式下服务器节点的应答数据不经过均衡器,而是直接返回给客户端。服务器结点也必须拥有合法IP 地址。而且,负载均衡器和服务器结点必须位于同一个网段。
负载均衡器接收到客户端请求数据包后,选择合适的服务器结点,将请求包的MAC 地址改写为目的服务器结点的MAC 地址,再将此包广播到服务器器节点所在网段。每个服务器结点都设定一个虚拟的网络设备(lo:0),这个设备绑定了和均衡器一样的VIP,只是该设备并不响应对VIP 的ARP 解析,不会和均衡器的VIP 产生地址冲突。负载均衡器收到符合自身MAC的IP 包后,经过处理后直接将应答数据返回给客户。

四层负载均衡LVS简介_LVS_04













四、LVS 负载调度算法:

针对不同的网络服务需求和服务器配置,IPVS 调度器有不同的负载调度算法,调度算法用于决定LVS如何选择后端的RealServer。

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运算