李燕清
(湖南建筑高级技工学校湖南长沙410015)
浅析LVS集群的动态负载均衡方法
李燕清
(湖南建筑高级技工学校湖南长沙410015)
为了解决服务器负载过重的问题,最常见的方法是提高服务器的硬件性能,如提高CPU频率和总线带宽、增加CPU数量和内存容量等,这些措施导致服务器价格昂贵、扩展性差,而且这种提升也受当时技术水平的限制。集群技术在现有设备和网络之上构建,是一种高效解决服务器负载过重和提高性能的方案,将多台服务器通过高速网络互连成1个集合,集合中的每台服务器地位相同,都能为客户的访问提供服务。服务器采用虚拟IP(Virtual IP,VIP),客户端程序与集群系统交互时,就像在与1台高性能服务器进行交互。
负载均衡是将任务均衡地分配到多个系统上执行,从而共同完成任务。它通过有效的方法扩展服务器的带宽和数据处理能力,提高网络的可用性、灵活性和吞吐率。
负载均衡的主要含义:①将大量并发网络连接或数据流量按照一定的策略分配到不同服务器上执行,可增大集群系统吞吐量,缩短响应时间;②将复杂计算按照某种策略分配给多个节点并行执行,计算结束后将多个节点的处理结果汇总并返回给用户。
随着网络流量的爆发式增长,仅仅依靠高性能集群并不能确保系统吞吐率高和响应用户请求速度快。整个集群系统必须像1台服务器统一对外提供服务,需要采用负载均衡技术来高效地分配各种用户请求。
服务器集群能很大程度上提高服务质量,有效缓解网络堵塞,缩短服务器的响应时间。基于Linux的虚拟服务器(Linux Virtual Service,简称LVS),由于其软件开源且性能稳定,获得了非常广泛的应用。但在负载均衡策略方面还存在不足,现有的调度策略不能完全根据服务器的实时情况动态分配负载。本文分析了3种流行的集群系统负载均衡技术,并比较了它们的优缺点。
3.1 LVS结构
负载均衡器能将请求均匀地分配给不同服务器,而且还可以屏蔽故障节点。LVS集群系统运用IP负载均衡技术和基于内容请求的分发技术,因此,在设计时应充分考虑集群的可伸缩性、灵活性和高可用性。LVS集群通常由负载均衡器、服务器池和共享存储构成。
(1)负载均衡器(Load Balance):它位于LVS集群的最前端,是用户访问集群系统的唯一入口,负责将客户端请求分配到服务器上执行,在用户看来,同一项服务来自同一个IP地址。这些操作由Linux内核完成,调度消耗的资源较少,因此有很高的吞吐率。为了保证系统的健壮性,通常会给负载均衡器增加1个备份,两者通过心跳线连接。
(2)服务器池(Server Pool):真正处理用户网络请求的服务器集合,执行Web,Ftp,Mail等网络服务。池中服务器数量动态可变,如果集群系统负载过重,可增加服务器来满足增长的负载需求。理论上,随着池中服务器数量的增加,集群系统的性能也可线性增长。
(3)共享存储(Shared Storage):由数据库、分布式文件或网络文件系统构成,它给服务器池提供1个共享的存储区。由于磁盘阵列和分布式文件系统价格昂贵,小型网络应用如果对数据一致性要求不高,可将数据存储在服务器本地硬盘中。
这三者之间通过高速LAN或者WAN相互连接,使用高速LAN可以避免集群系统扩大升级时网络成为整个集群系统的瓶颈。
在Linux内核中,通过修改TCP/IP协议栈,对IP报文进行改写和转发。IPVS软件实现基于IP层的3种负载均衡技术,同时还提供ipvsadm程序进行虚拟服务器的配置与管理。
IPVS由调度算法、IP包处理、虚拟服务器与真实服务器链表、配置与管理等4个模块组成。
集群系统启动时,负载均衡器对IPVS进行初始化,IPVS 通过setsockopt()和getsockopt()2个函数进行注册与相关配置。主要的配置管理文件存储在ip_vs_ctl.c中,当管理员调用setsockopt()函数时,系统就会自动运行ip_vs_ctl.c文件中的do_ip_vs_set_ctl()函数中的内容,完成服务器的添加、修改和删除等操作。服务器和虚拟服务器的添加、修改和删除操作分别由函数ip_vs_add_dest()、ip_vs_edit_dest()和ip_vs_edit_server()完成。
3.2 LVS的IP负载均衡技术
VS/NAT(Virtual Server via Network Address Translation)技术是通过网络地址转换将一组服务器组成一个高可用、高性能的虚拟服务器集群系统。通过分析请求报文和响应报文的非对称特点以及VS/NAT技术存在的不足,一些文献提出了通过IP隧道实现虚拟服务器VS/TUN(Virtual Server via IP Tunneling)和通过直接路由实现虚拟服务器VS/DR(Virtual Server via Direct Routing)等方法。
3.2.1 基于NAT技术
因为IPv4的IP地址空间有限以及网络安全问题,一些网络采用预留IP地址。当网络内部的计算机与因特网进行信息交换时,需要通过NAT将内部IP地址转换为外部IP地址。VS/NAT模式将负载均衡器置于集群系统前端,通过高速交换机连接服务器,外部用户请求被分配给任意服务器处理,其结果是相同的。VS/NAT结构示意如图1所示。
图1 VS/NAT结构示意
客户端通过VIP访问集群时,负载均衡器首先收到请求报文,并按照一定的策略从后端服务器池中选出1台服务器,将报文的VIP和端口改成该服务器的地址和端口,再将报文转发给该服务器;同时在哈希表中记载这个连接,当相同网络连接的下一个报文到达时,进行同样的改写与转发操作。真实服务器将响应报文发送给负载均衡器时,负载均衡器将报文的源地址和端口做相应的改写,再将响应报文发送给用户。
3.2.2 基于IP隧道技术
负载均衡器收到客户端的请求报文后,利用IP隧道技术封装请求报文并转发给按调度策略动态选出的服务器,该服务器根据路由表将响应报文直接返回给用户。因为服务器池中有多个节点,所以不能建立静态的一对一隧道。
VS/TUN模式处理数据包流程如图2所示。该模式与NAT模式的连接调度和管理方法相同,两者的差异在于报文的转发方式上。负载均衡器根据服务器的实时负载,从服务器池中动态地选择1台服务器,将封装后的IP报文发给该服务器;服务器收到报文并处理该报文,然后将响应报文直接发送给用户。
3.2.3 基于直接路由技术
在VS/DR模式中,负载均衡器只负责分配用户的请求,由服务器负责处理请求并将响应报文返回给客户,这样提高了LVS集群系统的吞吐率。VS/DR模式的负载均衡器与服务器池中的各个服务器通过高速交换机相互连接。VIP为整个集群系统共同享有,负载均衡器配置的VIP对用户完全透明,主要用于接收网络请求;而服务器配置的VIP对用户是不可见的,只用于处理目标地址为VIP的网络请求。
图2 VS/TUN模式处理数据包流程
负载均衡器只需将数据帧的MAC地址修改为被选服务器的MAC地址,并转送给被选服务器。服务器处理完后,再根据路由表直接将响应报文发送给用户。在此点上,VS/DR和VS/TUN的方式不同。
3.3 3种负载均衡策略分析
LVS的3种IP负载均衡技术比较见表3。
表1 LVS的3种IP负载均衡技术比较
从表1可以看出,这3种负载均衡策略都有各自的特点。
负载均衡算法主要分为静态和动态两大类,Linux下的IPVS负载均衡算法以连接数为粒度,这种负载均衡在某种程度上能减少负载倾斜现象的发生。目前,已有超过十余种负载均衡调度算法,每种调度算法均被实现为1个内核模块,在需要时加载。
4.1 静态算法
静态算法主要有轮动类和地址散列类。轮动(Round Robin,RR)算法是按照一定的顺序将连接请求分配给不同的服务器,其最大优点是简洁,但没有考虑服务器的差异以及当前活跃连接数。当服务器的性能差别较大或者请求服务时间波动较大时,系统容易出现负载倾斜现象。加权轮动(Weighted Round- Robin,WRR)依据服务器的性能分配权重,根据权重和轮动策略分配请求到服务器。WRR在一定的环境下效果不错,但是当服务时间波动较大时,系统依然会出现负载倾斜现象。
地址散列算法主要有目的地址散列算法(Destination Hashing,DH)和源地址散列算法(Source Hashing,SH),分别将目的或源IP地址映射到池中的某台服务器上,显然这2个算法都未依据实时情况分配连接。
4.2 动态算法
动态算法以最小连接(Least Connection,LC)算法为代表,该算法把新的连接分配给当前活跃连接数最小的服务器,负载均衡器根据各服务器的活跃连接数来衡量实时负载情况。服务器性能相同时,LC算法能把服务时间波动较大的请求均匀分配给不同服务器,从而避免负载倾斜的出现。
但是,当服务器的性能差异较大时,容易引发负载不均衡。加权最小连接算法(Weighted Least Connection,WLC)通过给不同性能的服务器设置权重,尽量使服务器的当前活跃连接数和它的权重成比例,算法将新的连接请求分配给比值(当前活跃连接数/权重)最小的服务器。该算法综合考虑了服务器的性能和当前连接数,是IPVS默认的负载均衡调度算法。
动态算法还有基于局部性的最少链接(Locality Based Least Connections,LBLC)、带复制的基于局部性最少链接(Locality Based Least Connections with Replication,LBLCR)、最短预期延时(Shortest Expected Delay,SED)和不排队调度(Never Queue Scheduling,NQ)等算法,多数都是基于LC算法的改进版。
LVS集群作为一种优秀的负载均衡技术,已经在许多领域得到了大规模的应用。然而,LVS集群存在一定的局限性,在LVS集群运行一段时间后,集群容易出现负载倾斜现象。如果想要在不增加硬件投入的前提下提高集群系统的稳定性和可靠性,还需在负载均衡算法上做些工作,比如WLC算法可采取动态修改服务器权重,对于改善集群性能、减少负载倾斜的发生是很有意义的。
2016- 12- 01)