首页 > 代码库 > LVS-负载均衡器理论篇
LVS-负载均衡器理论篇
LVS作为负载均衡器
1 什么是LVS? LVS全称Linux Virtural Server ,它是有章文嵩(现滴滴)主持的自由软件项目,
LVS是一个负载均衡/高可用性集群,主要针对大业务的网络应用,它建立在一个主控服务器
以及若干真实服务器所组成的集群上,Real-Server 负责实际提供服务,主控服务器根据指定的
调度算法对Real-Server进行控制。集群的结构对于用户来说是透明的,客户端只与单个IP(集群
系统的虚拟IP)进行通信,从客户的角度讲,只是单个服务器提供服务。
LVS应用的范例:
腾讯的CDB,大型网站的MySQL集群,HTTPS/HTTPs应用,FTP,DNS。Telnet,SMTP等应用协议。
2 LVS拓扑 如图1-1
3 LVS体系结构 一般情况下LVS集群采用3层数据结构
【】负载调度器(Load balancer):它是整个集群对外的前端机,负责将用户的请求发送到一组服
务器上执行,而用户认为服务来自一个IP地址,(此处不适用于CDN加速过的源站)
【】服务器池(Server Pool):它是一组真正执行客户请求的服务器,执行的服务有Web、 Mail、
FTP、和DNS。 【】共享存储(Shared Storage):它为服务器池提供一个共享的存储区,这样很容
易使得 服务器池拥有相同的内容,提供相同的服务。
负载调度器是服务器集群系统的唯一入口点(Simple Entry Point),采用IP负载均衡技术和
基于内容的请求分发技术,或将2者相结合。在IP负载均衡技术中,要求服务器池中有相同的内容
提供相同的服务,当用户的请求到达时,调度器只是根据服务器的负载情况和设定的调度算法从
服务器池中选出一个服务器,将该请求转发到选出的服务器上,并记录这一次调度。当这个请求的
其它报文到达时,也会被转发到前面选出的服务器上。在基于内容的请求分发技术中,服务器可以
提供不同的服务,当用户请求到达时,调度器可根据请求的内容选择执行请求的服务器。
优点:调度开销小,高吞吐率,这一操作在操作系统的核心空间中完成的。服务器池的节点数目是
可变的,可以随着系统的负载增加节点的数量,来满足不断增长的业务量。
共享存储通常是数据库,网络文件系统或者分布式文件系统(HDFS) Hadoop 实现了一个分布式文件
系统(Hadoop Distributed File System),简称HDFS.
可能出现的问题:当不同的服务器上的应用程序同时访问分布式文件系统上的同一资源时,
只有解决应用程序的访问冲突才能使得资源处于一致状态。此时需要一个分布式锁管理器。
负载调度器、服务器池和共享存储系统之间通过高速网络相连接。如40GB交换网络和10GB网络。
主要为了避免当系统规模扩大时网速成为整个系统的瓶颈。集群系统监视器是为了监视系统的状态。
还可以进行系统监测,并进行系统的配置和管理。
3.1 通过NAT实现虚拟服务器(VS/NAT) NAT(Network Address Translation,NAT)
译为:网络地址转换协议。将私有地址转换成公网地址 NAT原理是报文头(目标地址、源地址和端口
等)被正确改写后,客户端相信它们连接的是同一个IP地址而不同的IP地址的服务器组也认为它们是
与客户直接相连的。由此,可以用NAT方法将不同IP地址的 并行网络服务变成一个在同一IP地址的
虚拟服务。 用户通过虚拟服务器的IP地址(Virtural IP Address)访问网络服务时,请求报文到达
调度器,调度器根据连接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址和端口
(VIP Addr) 写成选定服务器的地址和端口,最后将修改好的报文发送给选出的服务器。同时调度器
在连接Hash表中记录这个连接,当这个连接的下一个报文到达时,从连接Hash表中可以得到原先选
定的服务器地址和端口,执行同样的改写操作,并将报文传给原选选定的服务器。当来自真实的服
务器的响应报文经过调度器时,调度器将报文的源地址和源端口改为VIP的地址和端口。再把报文
发给客户。 那么Hash表中的状态怎么更新呢?这个是根据TCP的连接状态。
在默认情况下:SYN-Timeout:1min ESTABLISHED:15min FIN-Timeout:1min UDP-Timeout:5min,当连接终止或者超时时,调度器会将这个 连接从连接的Hash表中删除。
最终:用户所看到的只是VIP地址,而服务器集群的结构对用户而言是透明的,针对改写后的报
应用增量调整Checksum的算法调整TCP Checksum的值,避免扫描整个报文来计算Checksum的开销。
3.2 通过IP隧道实现虚拟服务器(VS/Tunnel) VS/NAT和IP隧道的区别:
在VS/NAT的集群系统中,请求和响应的数据报文都需要通过负载调度器,根据应用服务有
这么一个特点,请求报文较短而响应报文往往包含大量的数据,如果能将请求和响应分开
处理,即负载调度器只负责调度请求,而响应直接返回给用户。
这样将提高整个集群系统的吞吐量。
IP隧道(IP tunneling)是将一个IP报文封装到另一个IP报文中的技术,
这可以使得目前为一个IP地址的数据报文能被封装和转发到另一个IP地址。
IP隧道技术也称为IP封装技术,主要用于移动主机和私网,其中隧道是静态建立的,
隧道一端有一个IP地址,另一端也有一个唯一的地址。利用IP隧道技术将请求报文封装并
转发给后端服务器,响应报文能从后端服务器直接返回给客户, 此时的后端服务是一组
而非一个,所以不可能静态建立一一对应的隧道,而是动态的选择一台服务器,将请求报文
封装并转发给选出的服务器,这样利用IP隧道的原理将一组服务器上的网络服务组成在一个
IP地址上的虚拟网络服务。
3.3 通过直接路由实现虚拟服务器(VS/DR) VS/DR模式:调度器和服务器组都必须在物理上有一个
网卡通过局域网相连,VIP地址和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚
拟服务的请求报文,所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外是不可见的,
只是用于处理目标地址为VIP的网络请求. VS/DR和上面2中方式的调度和管理一样,但是它的报文
转发方法不同,它将报文直接路由给目标服务器。在VS/DR中,调度器根据各个服务器的负载情况,
动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址修改为选出的服务器MAC,
再将修改后的数据帧在服务器组所在的局域网内发送。(这也是LVS/DR要求服务器在同一个局域网的原因),
因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得IP报文,
当服务器发现报文的目标地址(VIP)是在本地的网络设备上,服务器处理这个报文后,会根据路由表
将响应报文直接返回给客户.在VS/DR中,根据默认的TCP/IP协议栈处理,请求报文的目标地址为VIP,
响应报文的源地址肯定也为VIP,所以响应报文不需要做修改,可以直接返回给客户。用户得到正常的
服务,结果对用户是透明的。 VS/DR负载调度器与VS/TUN一样,只处于从客户到服务器的半连接中,
按照半连接的TCP有限状态机 进行状态转移。 3.3 三种模式的优缺点: 3.3.1
VS/NAT模式 优点:VS/NAT只需要一个IP地址配置在调度器上,服务器组可以用私有的IP地址。
缺点:伸缩能力有限。调度器会是一个问题。解决方法:采用混合模式,VS/TUN和VS/DR模式.
在DNS混合集群系统中,有若干个VS/NAT负载调度器,每个负载调度器带有自己的服务器集群,
同时这些负载调度器又通过RR-DNS组成简单的域名(RR-DNS:Round-Robin Domain Name System)。
3.3.2 VS/TUN模式
优点:负载调度器只将请求调度到不同的后端服务器,后端将响应直接返回给客户。
这样可以提高整个集群的吞吐量,VS/TUN对服务器有要求必须支持IPTuneneling或
IP Encapsulation协议,目前IP Tunneling正在成为标准协议(GRE协议)
3.3.3 VS/DR
优点:负载调度器只将请求调度到不同的后端服务器,后端将响应直接返回给客户。(方式不同)
后端通过网络路由(OSPF等等)返回给客户。与VS/TUN模式相比没有IP隧道开销,但是要求服务器
上有2块网卡且必须连接在同一个物理网段上,服务器的设备名称不作ARP响应,或者能将报文
重定向到本地的Socket端口上。三种模式中VS/DR模式转发效率是最高的.
3.4 LVS的算法
3.4.1 轮询调度(RR:Round Robin) 调度器通过用户的请求顺序依次调度
3.4.2 加权调度(wrr:Weighted Round Robin) 根据服务器配置的权重来调度
3.4.3 目标地址散列(Destionation Hashing) 根据请求的目标地址,作为散列Key从静态列表找出对应的
服务器,该服务器可用并且没有超载,就调度。否则返回空。
3.5.4 源地址散列(Source Hashing)
根据请求的源IP地址,作为散列Key从静态列表找出对应的服务器, 该服务器可用并且没有超载,
就调度。否则返回空。
3.4.5 最少连接(Least Connections) 据服务器的最少连接数来调度
3.4.6 加权最少连接(WeightedLeast Connections) 根据配置较高权值服务器负载情况,动态修改其权值。
简单算法:(active*256+inactive)/weight【(活动的连接数+1)/除以权重】(谁的小,挑谁)
3.4.7 基于局部性的最少连接(Locality-Based Least Connections)
根据请求的目标IP地址找出该目标IP地址最近使用的服务器,该服务器可用并且没有超载,就调度。
如果超载或者不可用,则用最少连接的原则选出一个可用的服务器,将请求发送到该服务器。
3.5.8 LBLCR(Locality-Based Least Connections withReplication):带复制的基于局部性最少链接 带复制的基于局部性最少链接调度算法也是针对目标IP地址的负载均衡,该算法根据请求的
目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,
该服务器可用并且没有超载,就调度.若服务器超载,则按“最小连接”原则选出一台服务器,
将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,
将最忙的服务器从服务器组中删除,以降低复制的程度。
3.5.9 SED(Shortest Expected Delay):最短期望延迟,基于WLC
简单算法:(active+1)*256/weight 【(活动的连接数+1)*256/除以权重】 3.5.10 NQ(never
queue):永不排队(改进的sed)
以上前4种算法为静态调度,后6种是动态调度
本文出自 “关注后台设计” 博客,请务必保留此出处http://xleft.blog.51cto.com/955567/1900053
LVS-负载均衡器理论篇