IP虚拟服务器软件IPVS前端
在调度器的实现技术中,IP负载均衡技术是效率最高的。在已有的IP负载均衡技术中有经过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,咱们称之为VS/NAT技术(Virtual Server via Network Address Translation),大多数商品化的IP负载均衡调度器产品都是使用此方法,如Cisco的LocalDirector、F5的Big/IP和 Alteon的ACEDirector。在分析VS/NAT的缺点和网络服务的非对称性的基础上,咱们提出经过IP隧道实现虚拟服务器的方法VS /TUN(Virtual Server via IP Tunneling),和经过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们能够极大地提升系统的伸缩性。因此,IPVS软件实现了这三种IP负载均衡技术,它们的大体原理以下(咱们将在其余章节对其工做原 理进行详细描述),算法
Virtual Server via Network Address Translation(VS/NAT)
经过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文经过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。后端
Virtual Server via IP Tunneling(VS/TUN)
采用NAT技术时,因为请求和响应报文都必须通过调度器地址重写,当客户请求愈来愈多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报 文经过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,因此调度器只处理请求报文。因为通常网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量能够提升10倍。服务器
Virtual Server via Direct Routing(VS/DR)
VS/DR经过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术同样,VS/DR技术可极大地 提升集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,可是要求调度器与真实服务器都有一块网卡连 在同一物理网段上。网络
针对不一样的网络服务需求和服务器配置,IPVS调度器实现了以下八种负载调度算法:负载均衡
轮叫(Round Robin)
调度器经过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而无论服务器上实际的链接数和系统负载。ide
加权轮叫(Weighted Round Robin)
调度器经过"加权轮叫"调度算法根据真实服务器的不一样处理能力来调度访问请求。这样能够保证处理能力强的服务器处理更多的访问流量。调度器能够自动问询真实服务器的负载状况,并动态地调整其权值。性能
最少连接(Least Connections)
调度器经过"最少链接"调度算法动态地将网络请求调度到已创建的连接数最少的服务器上。若是集群系统的真实服务器具备相近的系统性能,采用"最小链接"调度算法能够较好地均衡负载。测试
加权最少连接(Weighted Least Connections)
在集群系统中的服务器性能差别较大的状况下,调度器采用"加权最少连接"调度算法优化负载均衡性能,具备较高权值的服务器将承受较大比例的活动链接负载。调度器能够自动问询真实服务器的负载状况,并动态地调整其权值。优化
基于局部性的最少连接(Locality-Based Least Connections)
"基于局部性的最少连接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工做负载,则用"最少连接"的原则选出一个可用的服务 器,将请求发送到该服务器。
带复制的基于局部性最少连接(Locality-Based Least Connections with Replication)"带复制的基于局部性最少连接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不一样之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按"最小链接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小链接"原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以下降复制的 程度。
目标地址散列(Destination Hashing)
"目标地址散列"调度算法根据请求的目标IP地址,做为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,不然返回空。
源地址散列(Source Hashing)
"源地址散列"调度算法根据请求的源IP地址,做为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,不然返回空。
般来讲,LVS集群采用三层结构,三层主要组成部分为:
负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(咱们可称之为虚拟IP地址)上的。
服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
三种IP负载均衡技术的优缺点概括在下表中:
_ | VS/NAT | VS/TUN | VS/DR |
Server | any | Tunneling | Non-arp device |
server network | private | LAN/WAN | LAN |
server number | low (10~20) | High (100) | High (100) |
server gateway | load balancer | own router | Own router |
注: 以上三种方法所能支持最大服务器数目的估计是假设调度器使用100M网卡,调度器的硬件配置与后端服务器的硬件配置相同,并且是对通常Web服务。使用更 高的硬件配置(如千兆网卡和更快的处理器)做为调度器,调度器所能调度的服务器数量会相应增长。当应用不一样时,服务器的数目也会相应地改变。因此,以上数 据估计主要是为三种方法的伸缩性进行量化比较。
VS/NAT 的优势是服务器能够运行任何支持TCP/IP的操做系统,它只须要一个IP地址配置在调度器上,服务器组能够用私有的IP地址。缺点是它的伸缩能力有限, 当服务器结点数目升到20时,调度器自己有可能成为系统的新瓶颈,由于在VS/NAT中请求和响应报文都须要经过负载调度器。 咱们在Pentium 166 处理器的主机上测得重写报文的平均延时为60us,性能更高的处理器上延时会短一些。假设TCP报文的平均长度为536 Bytes,则调度器的最大吞吐量为8.93 MBytes/s. 咱们再假设每台服务器的吞吐量为800KBytes/s,这样一个调度器能够带动10台服务器。(注:这是很早之前测得的数据)
基于 VS/NAT的的集群系统能够适合许多服务器的性能要求。若是负载调度器成为系统新的瓶颈,能够有三种方法解决这个问题:混合方法、VS/TUN和VS /DR。在DNS混合集群系统中,有若干个VS/NAT负载调度器,每一个负载调度器带本身的服务器集群,同时这些负载调度器又经过RR-DNS组成简单的 域名。但VS/TUN和VS/DR是提升系统吞吐量的更好方法。
对于那些将IP地址或者端口号在报文数据中传送的网络服务,须要编写相应的应用模块来转换报文数据中的IP地址或者端口号。这会带来实现的工做量,同时应用模块检查报文的开销会下降系统的吞吐率。
在 VS/TUN的集群系统中,负载调度器只将请求调度到不一样的后端服务器,后端服务器将应答的数据直接返回给用户。这样,负载调度器就能够处理大量的请求, 它甚至能够调度百台以上的服务器(同等规模的服务器),而它不会成为系统的瓶颈。即便负载调度器只有100Mbps的全双工网卡,整个系统的最大吞吐量可 超过1Gbps。因此,VS/TUN能够极大地增长负载调度器调度的服务器数量。VS/TUN调度器能够调度上百台服务器,而它自己不会成为系统的瓶颈, 能够用来构建高性能的超级服务器。
VS/TUN技术对服务器有要求,即全部的服务器必须支持“IP Tunneling”或者“IP Encapsulation”协议。目前,VS/TUN的后端服务器主要运行Linux操做系统,咱们没对其余操做系统进行测试。由于“IP Tunneling”正成为各个操做系统的标准协议,因此VS/TUN应该会适用运行其余操做系统的后端服务器。
跟VS/TUN方法同样,VS/DR调度器只处理客户到服务器端的链接,响应数据能够直接从独立的网络路由返回给客户。这能够极大地提升LVS集群系统的伸缩性。
跟VS/TUN相比,这种方法没有IP隧道的开销,可是要求负载调度器与实际服务器都有一块网卡连在同一物理网段上,服务器网络设备(或者设备别名)不做ARP响应,或者能将报文重定向(Redirect)到本地的Socket端口上。