LVS介绍LVS(LinuxVirtualServer)是Linux虚拟服务器,是由张文松博士主导的开源负载均衡项目。目前,LVS已经集成到Linux内核模块中。本项目在Linux内核中实现了一种基于IP的数据请求负载均衡调度方案。其架构如图1所示,终端互联网用户从外部访问公司外部的负载均衡服务器,终端用户的Web请求会被送往LVS调度,调度器根据调度器决定将请求发送给某个后端Web服务器到其预设算法。例如,round-robin算法可以将外部请求平均分配给所有后端服务器。终端用户虽然访问了LVS调度器,但是会被阻塞。转发到后端的真实服务器,但是如果真实服务器连接的是同一个存储,提供的服务也是一样的。无论终端用户访问哪台真实服务器,得到的服务内容都是一样的。是透明的。最后,根据不同的LVS工作模式,真实服务器会选择不同的方式将用户需要的数据发送给最终用户。LVS工作模式分为NAT模式、TUN模式、DR模式。三种工作模式的分析。1、基于NAT的LVS模式负载均衡NAT(NetworkAddressTranslation)即网络地址转换。其作用是修改数据头,使企业内部私有IP地址可以访问外部网络,外部用户可以访问公司内部私有IP主机。VS/NAT工作模式的拓扑结构如图2所示。LVS负载调度器可以使用两块网卡配置不同的IP地址。外部网络连接。第一步,用户通过InternetDNS服务器在公司的负载均衡设备上解析到外网地址。相对于真实服务器,LVS外网IP也称为VIP(VirtualIPAddress)。用户访问VIP后即可连接。真正的服务器(RealServer)在最后,而这一切对用户来说是透明的。用户以为自己访问的是真实服务器,却不知道自己访问的VIP只是一个调度器,不知道后端的真实服务器。服务器到底在哪里,有多少真实服务器。第二步,用户向124.126.147.168发送请求。此时LVS会根据预设算法在后端选择一个真实服务器(192.168.0.1~192.168.0.3),将数据请求包转发给真实服务器,并在转发前LVS会修改目的地址和目的地址数据包中的端口,目的地址和目的端口将被修改为选择的真实服务器IP地址和对应的端口。第三步,realserver返回response包给LVSscheduler。调度器收到响应包后,会将源地址和源端口修改为VIP和调度器对应的端口。修改完成后,调度器会将响应数据包发回给最终用户。另外,由于LVS调度器有一个连接Hash表,连接请求和转发信息都会记录在表中。当同一连接的下一个数据包发送给调度器时,Hash表中可以直接找到之前的连接记录,根据记录信息选择相同的真实服务器和端口信息。2.基于TUN的LVS负载均衡在LVS(NAT)模式的集群环境下,由于所有的数据请求和响应报文都需要经过LVS调度器转发,如果后端服务器数量大于10台,调度器会成为整个集群环境的瓶颈。我们知道,数据请求包的大小往往远小于响应包的大小。因为响应数据包中包含了客户端需要的具体数据,所以LVS(TUN)的思想是将请求和响应数据分离,让调度器只处理数据请求,让真正的服务器响应数据包直接发给客户端。VS/TUN工作模式拓扑如图3所示,其中,IP隧道(IPtunneling)是一种数据包封装技术,可以对原始数据包进行封装,并添加新的包头(内容包括新的源地址和端口),目的地址和端口),从而实现一个目标为调度器VIP地址的数据包封装通过隧道转发到后端的真实服务器(RealServer),而发送的原始数据包clienttoscheduler进行封装,并在其基础上增加新的数据包头(修改targetaddress为scheduler选择的realserver的IP地址和对应端口),LVS(TUN)方式要求真实服务器可以直连外网,真实服务器收到请求数据包后直接响应客户端主机。3、基于DR的LVS负载均衡在LVS(TUN)模式下,由于需要在LVS调度器和真实服务器之间建立隧道连接,这也会增加服务器的负担。与LVS(TUN)类似,DR模式也称为直接路由模式。其架构如图4所示。在这种模式下,LVS仍然只承担对数据的入站请求,并根据算法选择合理的真实服务器。最后由后端真实服务器负责将响应包发回给客户端。与隧道模式不同的是,直接路由模式(DR模式)要求调度器和后端服务器必须在同一个局域网内,并且VIP地址需要在调度器和所有后端服务器之间共享,因为最终真实服务器交给客户端。客户端响应数据包时,需要设置源IP为VIP地址,目的IP为客户端IP,这样客户端访问调度器的VIP地址,响应的源地址为仍然是VIP地址(真实服务器上的VIP)。客户端感觉不到后台服务器的存在。由于多台电脑设置了相同的VIP地址,直接路由模式下要求调度器的VIP地址对外可见。客户端需要向调度器主机发送请求包,所有真实服务器的VIP地址必须配置在Non-ARP网络设备上,即网络设备不会广播自己的MAC和对应的IP地址给外面的世界。真实服务器的VIP对外是不可见的,但是真实服务器可以接受目标地址。VIP的网络请求,响应报文时设置源地址为VIP地址。调度器根据算法选择真实服务器后,在不修改数据报文的情况下,将数据帧的MAC地址修改为所选真实服务器的MAC地址,并通过交换机将数据帧发送给真实服务器。整个过程中,真实服务器的VIP不需要对外可见。LVS负载均衡调度算法根据前面的介绍,我们了解了LVS的三种工作模式,但是无论在实际环境中采用哪种模式,调度算法的调度策略和算法都是LVS的核心技术,而LVS在内核中。主要实现了以下十种调度算法。1.RoundRobinScheduling(RoundRobin简称'RR')算法是将请求按顺序循环的方式调度到不同的服务器。该算法最大的特点是实现简单。round-robin算法假设所有的服务器都具有相同的处理请求的能力,调度器会将所有的请求平均分配给每一个真实的服务器。2.加权轮询调度加权轮询(WeightRoundRobin简称'WRR')算法主要是对轮询算法的优化和补充,LVS会考虑每台服务器的性能,给每台服务器增加一个权重,如果服务器A的权重为1,服务器B的权重为2,那么调度器会向服务器B派发两倍于服务器A的请求,权重高的服务器会处理更多的请求。3.LeastConnectionSchedulingLeastConnections(简称“LC”)算法是将新的连接请求分配给当前连接数最少的服务器。最小连接调度是一种动态调度算法,通过服务器的活跃连接数来估计服务器的情况。调度器需要记录每个服务器建立的连接数。当向某台服务器派发请求时,连接数增加1;当连接中断或超时时,连接数减1。(集群系统真实服务器系统性能相似,可采用最小连接调度算法更好地均衡负载。)4.加权最小连接调度加权最小连接(WeightLeastConnections简称'WLC')算法是最小连接调度集的超方法,每个服务器对应的权重代表其处理性能。服务器的默认权重为1,系统管理员可以动态设置服务器的权重。加权最少连接调度使得服务器在调度新连接时,建立的连接数尽可能与其权重成正比。调度器可以自动查询真实服务器的负载情况,并动态调整其权重。5、Locality-BasedLeastConnections(Locality-BasedLeastConnections简称'LBLC')算法是一种针对请求报文的目标IP地址的负载均衡调度。目前主要用在Cache集群系统中,因为在Cache集群中客户端请求报文的目的IP地址是变化的。这里假设任何后端服务器都可以处理任何请求。该算法的设计目标是在服务器负载基本均衡的情况下,将具有相同目标IP地址的请求分派到同一台服务器,从而提高访问局部性和Cache命中率,从而提高整个集群系统的处理能力.LBLC调度算法首先根据请求的目标IP地址找出目标IP地址最近使用的服务器。如果服务器可用且没有过载,则将请求发送到服务器;如果服务器不存在,或者服务器过载并且有一个服务器在一半的工作量中,使用'最少连接'的原则选择一个可用的服务器并向该服务器发送请求。6.Locality-BasedLeastConnectionswithReplication(简称'LBLCR')带复制算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统,它与LBLC算法的区别在于它维护了一个映射从目标IP地址到一组服务器,而LBLC算法维护从目标IP地址到服务器的映射。按照“最少连接”的原则从服务器组中选择一台服务器。如果服务器没有过载,则向服务器发送请求;如果服务器过载,按照“最少连接”的原则从整个集群中选择一台服务器,将服务器添加到服务器组,并向服务器发送请求。同时,当服务器组在一段时间内没有被修改时,会将最繁忙的服务器从服务器组中删除,以降低复制度。7、目的地址哈希调度目的地址哈希调度(DestinationHashing简称'DH')算法首先根据请求的目标IP地址作为哈希键(HashKey)从静态分配的哈希表中找到对应的服务器。如果服务器可用且未超载,则将请求发送给它,否则返回null。8、源地址哈希调度U源地址哈希调度(SourceHashing简称'SH')算法首先根据请求的源IP地址从静态分配的哈希表中找到对应的服务器作为哈希键(HashKey),如果服务器可用且没有过载,则向其发送请求,否则返回null。它使用的哈希函数与目标地址哈希调度算法相同,其算法流程与目标地址哈希调度算法基本相似。9.最短预期延迟最短预期延迟调度(ShortestExpectedDelay,简称'SED')算法是基于WLC算法。比如ABC的三台服务器的权重分别为1、2、3。那么如果使用WLC算法,当有新的请求进来时,可能会分配给ABC中的任意一个。使用SED算法后,会进行一次运算A:(1+1)/1=2B:(1+2)/2=3/2C:(1+3)/3=4/3和请求将被移交给计算结果最小的服务器。10.LeastQueueSchedulingLeastQueueScheduling(NeverQueue简称'NQ')算法不需要队列。如果realserver连接数等于0,则直接分配,不需要进行SED操作。
