1.1.3 以LVS作为负载均衡器
LVS英文全称为Linux Virtual Server,这是章文嵩博士主持的自由项目。
LVS使用集群技术和Linux操作系统实现一个高性能、高可用的服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability),感谢章文嵩博士为我们提供如此强大实用的开源软件。
LVS是一个负载均衡/高可用性集群,主要针对大业务量的网络应用(如新闻服务、网上银行、电子商务等)。它建立在一个主控服务器(通常为双机)及若干真实服务器(Real-Server)所组成的集群之上。Real-Server负责实际提供服务,主控服务器根据指定的调度算法对Real-Server进行控制。而集群的结构对于用户来说是透明的,客户端只与单个的IP(集群系统的虚拟IP)进行通信,也就是说从客户端的视角来看,这里只存在单个服务器。Real-Server可以提供众多服务,如FTP、HTTP、DNS、Telnet、SMTP等,现在比较流行的是将其用于MySQL集群中。主控服务器负责对Real-Server进行控制。客户端在向LVS发出服务请求时,后者会通过特定的调度算法指定由某个Real-Server来应答请求,客户端只会与负载均衡器的IP(即VIP)进行通信。以上工作流程用LVS的工作拓扑图来说明的话,效果可能更好,如图1-1所示。
1.LVS集群的体系结构
通常来讲,Linux集群在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。一般来说,LVS集群采用三层结构,这三层结构的主要组成部分如下。
·负载均衡器(load balancer),它是整个集群对外的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
·服务器池(server pool),它是一组真正执行客户请求的服务器,执行的服务有Web、MAIL、FTP和DNS等。
·共享存储(shared storage),它为服务器池提供了一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
负载均衡器是服务器集群系统的唯一入口点(Single Entry Point),它可以采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。在IP负载均衡技术中,需要服务器池拥有相同的内容,提供相同的服务。当客户请求到达时,负载均衡器只需要根据服务器负载情况和设定的调度算法从服务器池中选出一个服务器,将该请求转发到选出的服务器,并记录这个调度即可;当这个请求的其他报文到达时,也会被转发到前面选出的服务器上。对于基于内容请求分发技术,服务器可以提供不同的服务,当客户请求到达时,负载均衡器可根据请求的内容选择服务器来执行请求。因为所有的操作都是在Linux操作系统核心空间中将完成的,它的调度开销很小,所以它具有很高的吞吐率。
图1-1 LVS集群的体系结构
服务器池的节点数目是可变的。当整个系统收到的负载超过目前所有节点的处理能力时,可以通过在服务器池中增加服务器来满足不断增长的请求负载。对大多数网络服务来说,各请求之间不存在很强的相关性,请求可以在不同的节点上并行执行,所以整个系统的性能基本上可以随着服务器池节点数目的增加而线性增长。
共享存储通常是通过数据库、网络文件系统或者分布式文件系统来实现的。服务器节点上需要动态更新的数据一般存储在数据库系统中,同时数据库会保证并发访问时数据的一致性。静态数据可以存储在网络文件系统(如NFS/CIFS)中,但网络文件系统的伸缩能力有限,一般来说,NFS/CIFS服务器只能支持3~6个繁忙的服务器节点。对于规模较大的集群系统,可以考虑用分布式文件系统,如AFS、GFS、Coda和Intermezzo等。分布式文件系统可为各服务器提供共享存储区,它们访问分布式文件系统就像访问本地文件系统一样,同时分布式文件系统可提供良好的伸缩性和可用性。此外,当不同服务器上的应用程序同时读写访问分布式文件系统上的同一资源时,应用程序的访问冲突需要消解才能使得资源处于一致状态。这需要一个分布式锁管理器(Distributed Lock Manager),它可能是分布式文件系统内部,也可能是外部提供的。开发者在编写应用程序时,可以使用分布式锁管理器来保证应用程序在不同节点上并发访问的一致性。
负载均衡、服务器池和共享存储系统通过高速网络相连接,如100Mbit/s交换网络、Myrinet和Gigabit网络等。使用高速的网络主要是为避免当系统规模扩大时互联网络成为整个系统的瓶颈。
2.LVS中的IP负载均衡算法
用户通过虚拟IP地址(Virtual IP Address)访问服务时,访问请求的报文会到达负载均衡器,由它进行负载均衡调度,从一组真实服务器中选出一个,将报文的目标地址改写成选定服务器的地址,然后将报文的目标端口改写成选定服务器的相应端口,最后将报文发送给选定的服务器。真实服务器的回应报文经过负载均衡器时,会将报文的源地址和源端口改为Virtual IP Address和相应的端口,再把报文发给用户。Berkeley的MagicRouter、Cisco的LocalDirector、Alteon的ACEDirector和F5的Big/IP等都是使用网络地址转换方法。MagicRouter是在Linux 1.3版本上应用快速报文插入技术,使得进行负载均衡调度的用户进程访问网络设备时接近核心空间的速度,降低了上下文切换的处理开销,但并不彻底,它只是研究的原型系统,没有成为有用的系统存活下来。Cisco的LocalDirector、Alteon的ACEDirector和F5的Big/IP是非常昂贵的商品化系统,它们支持部分TCP/UDP,有些在ICMP处理上存在问题。
IBM的TCP Router使用修改过的网络地址转换方法在SP/2系统实现可伸缩的Web服务器。TCP Router修改请求报文的目标地址并把它转发给选出的服务器,服务器能把响应报文的源地址置为TCP Router地址而非自己的地址。这种方法的好处是响应报文可以直接返回给客户,坏处是每台服务器的操作系统内核都需要修改。IBM的NetDispatcher是TCP Router的后继者,它将报文转发给服务器,而服务器在无ARP的设备上配置路由器的地址。这种方法与LVS集群中的VS/DR类似,它具有很高的可伸缩性,但一套IBM SP/2和NetDispatcher需要上百万美元。
在贝尔实验室的ONE-IP中,每台服务器都有独立的IP地址,但都会用IP Alias配置上同一VIP地址,并采用路由和广播两种方法分发请求,服务器收到请求后按VIP地址处理请求,并以VIP为源地址返回结果。这种方法也是为了避免回应报文的重写,但是每台服务器用IP Alias配置上同一VIP地址会导致地址冲突,有些操作系统甚至会出现网络失效。通过广播分发请求,同样需要修改服务器操作系统的源码来过滤报文,使得只有一台服务器来处理广播的请求。
微软的Windows NT负载均衡服务(Windows NT Load Balancing Service,WLBS)是1998年年底收购Valence Research公司获得的,它与ONE-IP中基于本地的过滤方法一样。WLBS作为过滤器运行在网卡驱动程序和TCP/IP协议栈之间,获得目标地址为VIP的报文,它通过过滤算法检查报文的源IP地址和端口号,保证只有一台服务器将报文交给上一层处理。但是,当有新节点加入或有节点失效时,所有服务器需要协商一个新的过滤算法,这会导致所有Session的连接中断。同时,WLBS会要求所有服务器都有相同的配置,如网卡速度和处理能力。
3.通过NAT实现虚拟服务器(VS/NAT)
由于IPv4中IP地址空间日益紧张,且存在安全方面的问题,因此很多网络会使用保留的IP地址(10.0.0.0/255.0.0.0、172.16.0.0/255.128.0.0和192.168.0.0/255.255.0.0)。这些地址不会在Internet上使用,它是专门为内部网络预留的。当内部网络中的主机要访问Internet或被Internet访问时,就需要采用网络地址转换(Network Address Translation,NAT),将内部地址转化为Internet上可用的外部地址。NAT的工作原理是报文头(目标地址、源地址和端口等)被正确改写后,客户相信它们连接了一个IP地址,而不同IP地址的服务器组也认为它们是与客户直接相连的。因此,可以用NAT方法将不同IP地址的并行网络服务变成在一个IP地址上的虚拟服务。
VS/NAT的体系结构比较简单,在一组服务器前有一个负载均衡器,它们是通过Switch/HUB相连接的。这些服务器提供相同的网络服务、相同的内容,即不管请求被发送到哪一台服务器,执行的结果是一样的。服务的内容可以复制到每台服务器的本地硬盘上,可以通过网络文件系统(如NFS)共享,也可以通过一个分布式文件系统来提供。
客户通过Virtual IP Address(虚拟服务的IP地址)访问网络服务时,请求报文到达负载均衡器,负载均衡器会根据连接调度算法从一组真实服务器中选出一台服务器,并将报文的目标地址Virtual IP Address改写成选定服务器的地址,将报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。同时,负载均衡器会在连接Hash表中记录这个连接,当这个连接的下一个报文到达时,从连接Hash表中可以得到原选定服务器的地址和端口,在进行同样的改写操作后,将报文传给原选定的服务器。当来自真实服务器的响应报文经过负载均衡器时,负载均衡器会将报文的源地址和源端口改为Virtual IP Address和相应的端口,再把报文发送给用户。我们在连接上引入一个状态机时,不同的报文会使得连接处于不同的状态,不同的状态有不同的超时值。在TCP连接中,根据标准的TCP有限状态机进行状态迁移,这里不一一叙述,请参见W.Richard Stevens的TCP/IP Illustrated Volume I。在UDP中,我们只设置一个UDP状态。不同状态的超时值是可以设置的,在默认情况下,SYN状态的超时时间为1分钟,ESTABLISHED状态的超时时间为15分钟,FIN状态的超时时间为1分钟;UDP状态的超时时间为5分钟。若连接终止或超时,负载均衡器会将这个连接从连接Hash表中删除。
这样,客户看到的只是在Virtual IP Address上提供的服务,而服务器集群的结构对用户是透明的。对改写后的报文,应用增量调整校验和的算法来调整TCP校验和的值,避免了扫描整个报文来计算校验和的开销。
4.通过IP隧道实现虚拟服务器(VS/TUN)
在VS/NAT的集群系统中,请求和响应的数据报文都需要通过负载均衡器,当真实服务器的数目在10台和20台之间时,负载均衡器将成为整个集群系统的新瓶颈。大多数Internet服务都有这样的特点:请求报文较短而响应报文往往包含大量的数据。如果能将请求和响应分开处理,即负载均衡器只负责调度请求而响应直接返回给客户,将极大地提高整个集群系统的吞吐量。
IP隧道(IP tunneling)是将一个IP报文封装在另一个IP报文中的技术,它使得一个IP地址的数据报文可被封装和转发到另一个IP地址。IP隧道技术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),其中隧道都是静态建立的,隧道的一端有一个IP地址,另一端也有唯一的IP地址。
我们利用IP隧道技术将请求报文封装转发给后端服务器后,响应报文能从后端服务器直接返回给客户。但在这里,后端服务器有一组而非一个,所以我们不可能静态地建立一一对应的隧道,而是会动态地选择一台服务器,将请求报文封装和转发给选出的服务器。这样,就可以利用IP隧道的原理将一组服务器上的网络服务变成在一个IP地址上的虚拟网络服务。
5.通过直接路由实现虚拟服务器(VS/DR)
与VS/TUN方法相同,VS/DR利用大多数Internet服务的非对称特点来实现虚拟服务器,负载均衡器只负责调度请求,由服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量。该方法与IBM的NetDispatcher产品中使用的方法类似(服务器上IP地址的配置方法也是相似的),但IBM的NetDispatcher是非常昂贵的商品化产品,我们也不知道它内部所使用的机制,其中有些是IBM的专利。
VS/DR的体系结构比较简单:负载均衡器和服务器组都必须在物理上有一个网卡,通过不分段的局域网相连,如通过高速的交换机或者HUB相连。VIP地址为负载均衡器和服务器组共享,负载均衡器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器都会把VIP地址配置在各自的Non-ARP网络设备上,它对外是不可见的,只是用于处理目标地址为VIP的网络请求。
VS/DR的连接调度和管理与VS/NAT和VS/TUN一样,它的报文转发方法又有不同,它会将报文直接路由给目标服务器。在VS/DR中,负载均衡器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出的服务器的MAC地址,再将修改后的数据帧在服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以接收到这个数据帧,从中获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上时,服务器会处理这个报文,然后根据路由表将响应报文直接返回给客户。
在VS/DR中,会根据默认的TCP/IP协议栈进行处理,既然请求报文的目标地址为VIP,响应报文的源地址肯定也为VIP,所以响应报文不需要做任何修改,即可直接返回给客户,客户得到正常的服务,但他不会知道是哪一台服务器处理的。VS/DR负载均衡器与VS/TUN一样只处于从客户到服务器的半连接中,它会按照半连接的TCP有限状态机进行状态迁移。
6.LVS新模式FULLNAT简介
在大规模的网络下,如在淘宝网的业务中,官方LVS满足不了需求,原因有以下3点:
1)三种转发模式的部署成本比较高。
2)与商用的负载均衡比,LVS没有DDoS防御攻击功能。
3)它是主备部署模式,性能无法扩展。
针对这些问题,淘宝网技术团队开发了LVS的FullNAT模式,它既可以跨VLAN通信,还有DDoS防御攻击能力。最重要的是,它可以采用Cluster部署模式,可以基于FULLNAT模式做横向扩展。
更详细的文档和资料说明请大家参考:
http://www.infoq.com/cn/news/2014/10/lvs-use-at-large-scala-network