Linux
分类: LINUX
2015-02-01 14:48:55
LVS是Linux Virtual Server的简称,即Linux虚拟服务器,官网是 Kernel主干版本,旨在利用集群负载均衡和Linux OS实现一个高性能、高可用的服务器,具有良好的可靠性、可扩展性和可管理性。LVS集群由三部分组成,如下:
l Load Balancer
集群对外的前端设备,由一台或多台负载调度器组成,LVS安装在负载调度器上。其本身的功能主要是根据设定的规则,将客户请求分发给后端对应的服务器上。负载调度器上还存在一个监控模块,用于检测Server Pool中各个服务器的健康情况,当服务器不可用时,不再将请求分发给该服务器。通常,Load Balancer对外仅提供一个虚拟IP,不管后端有几个真实的服务器,客户总是看到一个唯一的虚拟IP,而无法感知后端的多个服务器IP。由于只有一个虚拟IP,当由多台负载调度器组成时,一般会主备的方式存在,即同一时间只有一台负载调度器真实的参与客户请求的分发,而其他负载调度器仅仅是为了保障负载调度功能的健壮性。
l Server Poll
执行客户请求的真实服务器组,比如Web Server,不同的Server之间通过LAN/WAN相连接。实际的应用中,负载调度器是可以同时担任服务器角色的。
l Shared Storage
为服务器提供共享存储空间和内容一致性的存储设备,通常由磁盘阵列设备组成。而为了提供内容的一致性,可以通过NFS网络文件系统/集群文件系统(GFS/OCFS2)来共享数据。
目前分析的重点在于Load balancer上,也是LVS集群中最重要的部分。
具体技术
LVS集群的组成中需要一个前端的负载调度器,而在调度器的实现技术中,IP负载均衡技术是效率最高的。已有的IP负载均衡技术包括通过NAT将一组服务器构成一个高性能的、高可用虚拟服务器的VS/NAT技术,通过IP隧道实现虚拟服务器的VS/TUN技术,以及通过直接路由实现虚拟服务器VS/DR技术。
下面分析一下VS/NAT、VS/TUN以及VS/DR的工作原理,以及各自的优缺点。
VS/NAT的体系结构,如下图所示
前端一台负载调度器,中间一台二层交换机/Hub,后端是三台提供具体服务的真实服务器设备。后端服务器提供相同的网络服务以及相同的内容,即不管请求被负载调度器分发给那台设备,最后执行结果是相同的。不同服务器内容,可以通过硬盘复制/网络文件系统(NFS)共享,也可以通过分布式文件系统来提供。
客户通过Virtual IP Address访问网络服务时,Request到达调度器,调度器根据连接调度算法从后端真实服务器中选出一台服务器,将报文的目标地址Virtual IP Address改写为选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。同时,调度器在连接Hash表中记录这个连接,当该连接下一个报文到达时,从连接Hash表中可以得到原选定服务器的地址和端口,进行同样改写操作,并将报文传给原选定的服务器。当来自真实服务器的响应报文经过调度器时,调度器将报文的源地址和源端口改为Virtual IP Address和相应的端口,再把报文发给用户。同时调度器的连接上引入了一个状态机,不同的报文会使得连接处于不同的状态,不同的状态有不同的超时值(状态转发设备)。对于TCP连接,根据标准的TCP有限状态机进行状态迁移;对于UDP,只设置一个UDP状态。不同状态的超时值可以设置,缺省情况下,SYN状态的超时为1分钟,ESTABLISHED状态的超时为15分钟,FIN状态的超时为1分钟;UDP状态的超时为5分钟。当连接终止/超时,将连接从Hash表中删除。
客户所看到的只是在Virtual IP Address上提供的服务,而服务器集群的结构对用户是透明的。对改写后的报文,应用增量调整Checksum的算法调整TCP Checksum的值,避免了扫描整个报文来计算Checksum的开销。
在一些网络服务中,会将IP/Port信息在报文的数据中传送,若只对报文头的IP/Port作转换,由于不一致性而导致服务中断。针对这些服务,需要编写相应的应用模块来转换报文数据中的IP/Port。目前已知出现该问题的网络服务有FTP、IRC、H.323、CUSeeMe、Real Audio、Real Video、Vxtreme / Vosiac、VDOLive、VIVOActive、True Speech、RSTP、PPTP、StreamWorks、NTT AudioLink、NTT SoftwareVision、Yamaha MIDPlug、iChat Pager、Quake和Diablo。
对于VS/NAT的集群系统,请求和响应的报文都需要经过前端的负载均衡器,当后端服务器众多且并发访问巨大时,负载均衡器可能会成为瓶颈。而对常见的网络服务而言,都是请求报文较短,而应答报文较大(含大量数据)。如果负载均衡器只负责请求,而响应直接返回给客户,将极大地提高整个集群的吞吐。
IP Tunnel是将一个IP报文封装在另一个IP报文的技术,可以使得目标为IP1的报文被封装和转发到IP2。IP Tunnel常用于移动主机和虚拟私有网络(Virtual Private Network),通常隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。利用IP隧道技术将请求报文封装转发给后端服务器,响应报文能从后端服务器直接返回给客户。VS/TUN的体系结构如下图所示,各个服务器将VIP地址配置在自己的IP隧道设备上
VS/TUN的连接调度和管理与VS/NAT一样,只是报文转发方法不同。调度器根据各个服务器的负载情况,动态地选择一台服务器,将请求报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的服务器;服务器收到报文后,先将报文解封获得原来目标地址为VIP的报文,服务器发现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。
由于请求报文的目标地址为VIP,响应报文的源地址也为VIP,所以响应报文不需要作任何修改,可以直接返回给客户,客户认为得到正常的服务,而不会知道是哪一台服务器处理的。
在VS/TUN中,响应报文根据服务器的路由表直接返回给客户,而不经过负载调度器,所以负载调度器只处于从客户到服务器的半连接中,VS/TUN的TCP状态迁移与VS/NAT的不同。只有半连接的TCP有限状态机,如下图3所示,圈表示状态,箭头表示状态间的转换,箭头上的标识表示在当前状态上收到该标识的输入,迁移到下一个状态。VS/TUN的TCP状态迁移是按照半连接的TCP有限状态机进行的。
同VS/TUN,调度器中只负责调度请求,服务器则直接将响应返回给客户,极大地提高了整个集群系统的吞吐量。VS/DR需要调度器和服务器组在同一广播域中,其中VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务请求报文;而服务器则把VIP地址配置在各自的Non-ARP接口上,对外不可见,只是用于处理目标地址为VIP的网络请求。体系结构如下图所示:
VS/DR的连接调度和管理与VS/NAT和VS/TUN一样,只是报文转发方法又有不同,其将报文直接路由给目标服务器。VS/DR中的调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。
VS/DR中请求报文的目标地址为VIP,响应报文的源地址也为VIP,所以响应报文不需要作任何修改,可以直接返回给客户,客户认为得到正常的服务,而不会知道是哪一台服务器处理的。VS/DR负载调度器也只处于从客户到服务器的半连接中,按照半连接的TCP有限状态机进行状态迁移,同VS/TUN。
除配置方式和原理不同外,性能VS/NAT最差,VS/DR与VS/TUN相当,理论上DR性能更好一些。另外,VS/NAT要求后端服务器的网关必须指向负载均衡器,以保证应答报文可以经过均衡器,而DR/TUN的方式无该要求。具体使用,应需求和场景各异,具体分析。
VS/NAT 的优点是服务器可以运行任何支持TCP/IP的操作系统,只需要一个IP地址配置在调度器上,服务器组可以用私有的IP地址。缺点是伸缩能力有限,当服务器结点数目飙升时,调度器本身有可能成为系统的新瓶颈,因为在VS/NAT中请求和响应报文都需要通过负载调度器。如果负载调度器成为系统新的瓶颈,有三种方法:混合方法、VS/TUN和 VS/DR。在DNS混合集群系统中,有若干个VS/NAT负载调度器,每个负载调度器带自己的服务器集群,同时这些负载调度器又通过RR-DNS组成简单的域名。但VS/TUN和VS/DR是提高系统吞吐量的更好方法。对于那些将IP地址或者端口号在报文数据中传送的网络服务,需要编写相应的应用模块来转换报文数据中的IP地址或者端口号。这会带来实现的工作量,同时应用模块检查报文的开销会降低系统的吞吐率。
在VS/TUN 集群系统中,负载调度器只将请求调度到不同的后端服务器,后端服务器将应答数据直接返回给用户。负载调度器可以处理大量请求,可以极大地增加负载调度器调度的服务器数量。VS/TUN技术要求所有的服务器必须支持“IP Tunneling”或者“IP Encapsulation”协议。目前,VS/TUN后端服务器主要运行Linux操作系统。
跟VS/TUN方法一样,VS/DR调度器只处理客户到服务器端的连接,响应数据可以直接从独立的网络路由返回给客户。可以极大地提高LVS集群系统的伸缩性。跟VS/TUN相比,这种方法没有IP隧道的开销,但是要求负载调度器与实际服务器都有一块网卡处于同一广播域,服务器网络设备(或者设备别名)不作ARP响应。