lvs的多种模式和调度详细讲解

目录

一.简介

LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的*软件项目,目前已经是Linux标准内核的一部分,但在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块。

类似于iptables的架构,在内核中有一段代码用于实时监听数据包来源的请求,当数据包到达端口时做一次重定向。这一系列的工作必须在内核中实现。在内核中实现数据包请求处理的代码叫做ipvs。ipvs仅仅提供了功能框架,还需要自己手动定义是数据对哪个服务的请求,而这种定义需要通过写规则来实现,写规则的工具就称为ipvsadm。

通过Lvs提供的负载均衡技术来实现一个高性能、高可用的服务器集群。Lvs对用户的请求进行分发,这个请求可以是网页、邮件、视频、DNS等等。
lvs的多种模式和调度详细讲解

名词:

  • VIP(Virtual IP):Director用来向客户端提供服务的IP地址,因为需要做冗余,就需要2台Lvs虚拟一个共用的VIP,也是对外开放的外网ip。
  • RIP(Real IP):集群节点(后台真正提供服务的服务器)所使用的IP地址
  • DIP(Director's IP):Director用来和RIP 进行联系的地址
  • CIP(Client computer's ):公网IP,客户端用来访问服务的ip。

二.结构

使用LVS架设的服务器集群系统有三个部分组成:最前端的负载均衡层,用Load Balancer表示,中间的服务器群组层,用Server Array表示,最底端的数据共享存储层,用Shared Storage表示。在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。
lvs的多种模式和调度详细讲解

Load Balancer层:
位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,它的作用主要是类似于一个路由器,根据设定通过路由表将用户的请求分发给后端的应用服务器上,它本身并不对请求有任何解读和处理。同时,还要安装对应用服务器的监控模块Ldirectord,此模块用于监测应用服务器的健康状况。在不可用时把它从LVS路由表中剔除,恢复时重新加入。

Server Array层:
由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个。

Shared Storage层:
是为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。

三.负载均衡

简介

LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。

访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,有如下三种方式。

NAT(Network Address Translation)

lvs的多种模式和调度详细讲解

步骤:
NAT是一种外网和内网地址映射的技术,网络数据报的进出都要经过LVS的处理。LVS需要作为RS(真实服务器)的网关。当包到达LVS时,从后端应用服务器选择一个,做目标地址转换(DNAT),将目标IP改为RS的IP。Lvs就相当于一个路由器一样,做基本的路由转发。

RS接收到包以后,仿佛是客户端直接发给它的一样。RS处理完后,将包发送给客户端,这时RS的包通过网关(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,这样,这个包对客户端看起来就仿佛是LVS直接返回给它的。客户端无法感知到后端RS的存在。

数据包地址转换过程:
S:CIP D:VIP -> Director -> S:CIP D:RIP -> Real Server -> S:RIP D:CIP -> Director -> S:VIP D:CIP
lvs的多种模式和调度详细讲解

特点:
在NAT方式下Lvs要对用户请求和响应报文做地址转换,当用户请求越来越多时,调度器的处理能力将成为瓶颈。
需要Lvs和RS在一个局域网,Lvs做RS的网关。
隐藏真实回应的ip。
支持端口映射。
后台的Real Server可以使用任何操作系统。

TUN(IP Tunneling)

lvs的多种模式和调度详细讲解

步骤:
TUN也就是IP隧道技术实现虚拟服务器,它将调度器收到的IP数据包封装在一个新的IP数据包中,转交给RS,然后RS的返回数据会直接返回给用户。

ip隧道是一个将ip报文封装到另一个ip报文的技术,将客户请求包封装在一个ip tunnel里面,然后发给RS节点服务器。这时候这个包的源ip就是Lvs的,目的ip是RS服务器的。

RS收到请求后解开里面的ip tunnel层,进行响应处理。并且直接把包通过自己的外网地址发送给客户,不用经过LVS。

数据包地址转换过程:
DIP -> VIP 基于隧道来传输,在数据包外层额外封装了S:DIP D :RIP 的地址。
lvs的多种模式和调度详细讲解

特点:
因为经过封装,所以RS一定不能是私有地址,可以异地容灾。
Lvs只处理用户的报文请求而不用发送回应,这样会提高一定的效率,但要维持ip隧道会降低一些效率。
直接将数据包返回给客户端,所以RS默认网关不能是DIP,必须是公网上某个路由器的地址。
需要RS的系统支持隧道。
不支持端口映射。
无法隐藏真实回应的ip。

DR(Direct Routing)

lvs的多种模式和调度详细讲解

步骤:
DR模式下,LVS只需要将网络帧的MAC地址修改为某一台RS的MAC,该包就会被转发到相应的RS处理,此时的源IP和目标IP都没变,LVS只是做了一下移花接木。RS收到LVS转发来的包时,链路层发现MAC是自己的,到上面的网络层,发现IP(虚拟的)也是自己的,于是这个包被合法地接受,RS感知不到前面有LVS的存在。而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVS。

数据包地址转换过程:
S:CIP D:VIP -> Director -> S:CIP D:RIP -> Real Server -> S:VIP D:CIP
lvs的多种模式和调度详细讲解

特点:
因为只改写进来的网络包的mac地址,不管理出去的,也没有ip隧道,所以性能最好。
不需要和Lvs在一个网段,但需要RS有一块网卡和Lvs连接在同一物理网段上。
无法隐藏ip地址。
不支持端口映射。
RS不能将网关指向DIP。
直接将数据包返回给客户端,所以Real Server默认网关不能是DIP,必须是公网上某个路由器的地址;
RIP 为公网地址,管理员可以远程连接Real Server来查看工作状态;
一旦Director 宕机,可以通过修改DNS记录将A记录指向RIP 继续向外提供服务;

四.负载调度

简介

在Lvs进行负载均衡选择后端RS(真实服务器)的时候,可以根据策略进行动态选择。当前有十种负载均衡算法。

固定调度算法

按照某种既定的算法,不考虑实时的连接数予以分配。

轮询调度(Round Robin)
轮询调度会按顺序挨个将请求分配到后端集群中,而不管RS的负载和性能情况。如果有A,B,C三台RS,那会按顺序转发到A,B,C上面,第四个请求就又发到A上面了。

加权轮询(Weighted Round Robin)
“加权轮询”调度算法是根据RS的不同处理能力来调度访问请求。可以对每台RS设置不同的调度权值。对于性能相对较好的RS可以设置较高的权值,而对于处理能力较弱的RS可以设置较低的权值,这样保证了处理能力强的服务器处理更多的访问流量。充分合理的利用了服务器资源。同时,调度器还可以自动查询RS的负载情况,并动态地调整其权值。

目标地址散列(Destination Hashing)
来自于同一个IP地址的请求都被重定向到同一台Real Server上(保证目标地址不变)。

先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。

源地址散列(Source Hashing)
Director必须确保响应的数据包必须通过请求数据包所经过的路由器或者防火墙(保证原地址不变)。

先根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同,它的算法流程与目标地址散列调度算法的基本相似。

使用SH算法,SH算法在内核中会自动维护一个哈希表,此哈希表中用每一个请求的源IP地址经过哈希计算得出的值作为键,把请求所到达的RS的地址作为值。在后面的请求中,每一个请求会先经过此哈希表,如果请求在此哈希表中有键值,那么直接定向至特定Real Server,如没有,则会新生成一个键值,以便后续请求的定向。但是此种方法在时间的记录上比较模糊(依据TCP的连接时长计算),而且其是算法本身,所以无法与算法分离,并不是特别理想的方法。

动态调度算法

通过检查服务器上当前连接的活动状态来重新决定下一步调度方式该如何实现。

最少链接(Least Connections)
“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。

算法:连接数=活动连接数*256+非活动连接数

加权最少链接(Weighted Least Connections)
在最少连接的基础上给每台Real Server分配一个权重。

“加权最少链接”是“最少连接调度”的超集,每个服务节点可以用相应的权值表示其处理能力,而系统管理员可以动态的设置相应的权值,缺省权值为1,加权最小连接调度在分配新连接请求时尽可能使服务节点的已建立连接数和其权值成正比。

算法:连接数=(活动连接数*256+非活动连接数)÷权重

基于局部性的最少链接(Locality-Based Least Connections)
针对请求报文的目标IP地址的负载均衡调度,简称LBLC。目前主要用于Cache集群系统,因为在Cache集群客户请求报文的目标IP地址是变化的。

这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和Cache命中率,从而提升整个集群系统的处理能力。

先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则使用'最少连接'的原则选出一个可用的服务器,将请求发送到服务器。

带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统,它与LBLC不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。

按'最小连接'原则从该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按'最小连接'原则从整个集群中选出一台服务器,将该服务器加入到这个服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度

最短的期望的延迟(Shortest Expected Delay)
不再考虑非活动连接数

基于加权最少链接算法,举个例子,ABC三台服务器的权重分别为1、2、3 ,那么如果使用加权最少链接的话一个新请求进入时它可能会分给ABC中的任意一个。

算法:连接数=(活动连接数+1) *256 ÷权重

最少队列调度(Never Queue)
对SED的改进,当新请求过来的时候不仅要取决于SED算法所得到的值,还要取决于Real Server上是否有活动连接。

五.特点

优点:

  • 抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低。
  • 工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案。
  • 无流量,LVS只分发请求,而流量并不从它本身出去,这点保证了均衡器IO的性能不会受到大流量的影响。
  • 工作在四层,可以对所有应用进行负载均衡,包括Web、数据库等

缺点:

  • 软件本身不支持正则表达式处理,不能做动静分离
  • 如果是网站应用比较庞大,配置和测试就会很复杂,需要很长时间。
  • 对网络依赖比较大,需要稳定的网络环境
上一篇:lvs的nat模式部署


下一篇:Frp穿透技术