第二章 负载均衡LB服务之LVS

2019-08-26 16:02:43 浏览数 (1)

第二章 负载均衡LB服务之LVS

2.1 LB服务简介

上一章我们介绍过,负载均衡服务是由一组服务器共同完成同一个服务,它的具体原理是:一组服务器中选择一台作为主管理服务器,其他服务器其在它管辖之下,称为内部服务节点服务器,由管理服务器负责接收客户端请求,然后按照一定的算法、策略,分配给内部节点服务器具体处理客户请求,从而实现统一管理,分流业务的功能。

这台管理服务器我们又称负载均衡LB服务器,为了便于与客户方的网络通信,它必定有一块网卡配置合理的ip地址,并可被客户机访问到,客户段申请访问服务时,通信的目的ip即为该ip,所以该IP被称为服务IP。由于LB服务器收到客户请求后,会转发给内部节点服务器,但是客户端通信封装中的目的ip却还是服务ip,所以在内部节点服务器上除了自身原有的IP外,还需要绑定服务ip,那么这个服务ip实质上是以虚拟地址的形式存在于内部节点服务器上的,因此服务ip又称虚拟IP,简写为VIP,VIP是可以以网卡子接口的形式存在于网卡上。而节点服务器网卡上原有的IP地址,是真实的固定ip,被称为真IP,简写为RIP。

有了LB服务器、节点服务器、VIP、RIP的概念,下面我们来具体介绍一下LVS服务的工作原理。

2.2 LVS工作原理

LVS(LinuxVirtual Server)是RHEL系统默认支持的LB服务工具,在系统安装光盘上自带其安装包。LVS功能强大,性能稳定,被多应用于实际的生产环境的各种应用服务平台。

LVS最为核心的原理是它的工作模式与分配算法,下面逐一介绍。

2.2.1 LVS工作模式

LVS的LB服务器对内部节点的管理方式,即如何将客户请求转发给内部节点、并控制内部节点如何相应客户端,被称为工作模式。LB服务器共有三种工作模式:nat模式、TUN隧道模式、DR直连模式。

1、nat模式

nat模式是将LB服务器架设为一台nat服务器,两块网卡,一块连外网,一块连内网,内部节点都被封闭在一个内部子网中。LB服务器接收客户机请求,其外网卡ip即服务ip,无需做虚拟ip设置。LB服务器接收到客户请求后,转发给内部某个节点,节点相应客户时,先回给LB服务器,再由LB服务器通过nat原理转给外网客户(nat原理请参考《Linux服务》书中“iptables防火墙”章中的nat介绍)。

由此可知,在nat模式下,进出节点的数据,都必须经过LB服务器代理,也就是说,客户端只和LB服务器通信,不会与内部节点直接通信,客户机根本不知道内部节点的存在,这与nat的封闭功能是完全符合的。

nat模式的优点是对内部节点服务器起到了很好的保护作用,内部服务器其外封闭,外网无法直接进入内网。但是nat模式的缺点也很明显,由于数据进出都需要LB服务器的转发,无形中就增加了LB服务器的工作量,增加了系统资源的消耗,降低性能及可承载的并发量。而且由于进出数据都需要做nat转换,即封装数据包的改变,所以对客户的相应速度也会降低很多。

如下图所示:假设用LVS构建web集群,使用nat模式,则LVS服务器两块网卡,一连内,一连外,当客户端请求网站时,目的地址是LVS的外网卡ip(当然,DNS对网站FQDN的A记录解析也是指向LVS外网卡ip的),再由LVS转发给内部web节点,类似于DNAT;内部web服务器给客户相应时,回复的数据也是先交给LVS服务器,再由LVS采用SNAT模式转发出去,到达客户机。

由此,我们可知LVS的nat模式下,LVS服务器必须处于nat路由器的身份,再开启LVS负载均衡功能,且内部节点服务器必须在同一个内部子网内,不支持节点服务器在不同子网的情况。

2、TUN隧道模式

参考上图,我们来介绍一下TUN隧道模式:TUN模式中,LVS服务器可以与节点在同一个子网中,单网卡连接,配置固定ip,然后绑定VIP(即服务ip),显性存在,即可被访问;同时节点服务器也配置固定ip,也绑定VIP,但是是隐性的,即客户端是直接访问不到的。当客户机访问时,目标ip为VIP,会被路由器转发到LVS服务器上,再由LVS分配给节点服务器。

这里在LVS服务器上事先创建出集群,并加入节点服务器的固定ip,当LVS转给节点时,采用网络层二次封装的方式,如图:第三层网络层封装两次,外层封装安装实际固定ip封装寻址,实现数据传输,到达节点服务器,而内层封装使用VIP作为目的地址,源地址即客户端地址,这样节点主机接收到请求后,可以直接给客户端回复,无需再经过LVS服务器转发了。因此减少了LVS服务器的工作量,也就可以提升LVS的可承载的并发量了。但由于LVS服务器需要对数据包做二次封装的操作,所以在转发速度上略有延时,效率并不是最佳的。

而且由于外层封装是按实际固定ip寻址的,所以LVS服务器与节点主机是可以不在同一子网内的,这样就更加灵活了。

再者,因为LVS与节点服务器都绑定VIP,所以会产生ip冲突的报错,我们知道ip冲突的检测是由网络层arp协议负责的,所以在TUN模式下,需要在LVS与节点上关闭arp协议。好了,这种二次封装的技术,相当于在客户机与节点服务器之间开辟了一个小的专用通信链路,被称为隧道技术。

3、DR直连模式

参考上图,DR直连模式下,LVS服务器同样配置固定ip,并绑定VIP(显性存在)。节点服务器也配置固定ip,绑定VIP(隐性存在)。客户端的请求以VIP为目的ip,会通过路由被发送到LVS服务器上,LVS服务器再转发给节点服务器,在转发时,LVS服务器会把数据封装中数据帧部分重新封装,改成到节点服务器的寻址(如图),而网络层(目的地址仍为VIP)及内部各层则不变,这个新的数据帧转发到节点服务器后,拆帧并被节点服务器识别VIP接收请求。

而节点服务器在回复客户时,也不需要通过LVS,可以直接给客户机回复,同样也减少了对LVS的影响,降低了LVS的压力,提升了LVS承载的并发量。而且这种更改数据帧寻址的方式,无需改动网络层数据包的封装,转发速度更快,效率更高。但是由于DR模式通过更改数据帧封装,属于OSI数据链路层的功能,即只能在同子网内操作,所以LVS服务器与节点服务器必须在同一子网中。

同TUN模式一样,DR模式下,由于LVS与各几点都绑定VIP,为了避免IP冲突报警,所以LVS与节点都必须关闭arp协议。在实际生产环境中,我们一般也都是把LVS服务器与节点服务器放在同一子网中的,所以DR直连模式由于速度、效率的优势,被广泛应用。

2.2.2 LVS工作模式小结

上一节我们介绍了LVS的三种工作模式,总结来说,这三种模式各有各的特点与优势,总结如下:

NAT模式:LVS服务器充当NAT代理路由器及LB服务器身份,数据进出都经过LVS服务器,工作效率较低;但内部节点服务器被封闭在内部子网内,外界无从访问与得知,所以更加安全。

TUN模式:采用隧道技术,即网络层二次封装技术,由LVS给节点服务器转发客户请求,由于需要做二次封装,所以效率略低;但TUN模式支持LVS与节点在不同子网内,灵活度更好;另外TUN模式下,LVS与节点都有固定ip,并绑定VIP,需要关闭arp协议。

DR模式:采用数据帧改写技术,直接在第二层(即数据链路层)寻址,转发速度快,效率高;但仅支持LVS与节点在同一子网内;同样,LVS与节点都有固定ip,并绑定VIP,需要关闭arp协议。

好了,了解了LVS的工作模式,下面再来看LVS的节点选择算法。

2.3 LVS算法

LVS服务器在转发客户端请求时,会选择一个最佳的节点服务器,但是由于节点的硬件配置、正承载的业务都会有不同,该如何选择节点呢?所以LVS内部就制定了十种选择算法,最为常见的是前八种,我们可以根据实际情况选择一种更为合适的算法。

具体算法如下

rr 轮询算法,轮流给内部服务器分配客户请求

wrr 加权轮询,每台服务器设定一个权值,权值高的会优先分配,常用

lc 最少连接数算法

wlc 加权最少连接数算法

lblc 局部最小连接,当服务节点在不同网络中时,LVS先估算离客户端最近的网络中的一组node(节点),再按最少连接数分配

lblcr 带有复制的局部最小优先,先估算最近的一组node,先给该组中最近的,若超载,则给最少连接的

dh 目标地址散列算法 根据目标地址ip按hash算法,相当于随机

sh 源地址散列算法 根据源地址ip按hash算法,相当于随机

sed 最短延迟调度或称最短期望延迟算法,是在WLC基础上加以改进,不再考虑非活动状态。

NQ:永不排队算法。SED算法的改进;(首先挑选一个主机分配一个请求,然后挑选下一个主机分配请求,直到把所有主机轮询一遍之后,再根据SED算法进行分配)。即无需队列,如果有台realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空闲。

下面介绍一下这些算法的特点:

rr轮询算法,顾名思义,就是把客户请求轮流分配给每个应用节点,分配平均,但不管具体每个节点现有的负载量,所以可能会造成不同节点承载压力不均衡的现象。

wrr加权轮询,也是轮询的方式,但并不是平均分配客户访问。人为的给每个节点设置一个权重中,LVS在分配客户访问时会优先分配给权重值高的节点。其实,本质上,权重我们可以人为是节点主机性能、能力的体现,CPU较快、内存较大的主机,本身处理能力就强,可承接的并发量也大,所以就可以设置较大的权重,以承载更多的客户访问;反之,硬件配置略低的节点主机就可以设置较小些的权重。权重值都是由数字表示,设定后基本可以认为LVS服务器是按权重数值的比重来分配的,比如两台节点主机,一台是3,另一台是2,则第一台会获得3/5的客户访问,第二台会获得2/5的客户。

lc最小连接数算法,lc算法是根据节点上正在承载的连接数,把新的客户请求分配给连接数最小的一台节点服务器,这相对比较合理,尤其是在各节点主机硬件配置基本一致的情况下,可以考虑此种方式

wlc加权最小连接数,是在lc的基础上给每个节点主机设置权重,这样就能更加合理的分配客户访问了,比较适合于各节点主机硬件配置不同的集群中。wlc在核算时采用Overhead=(Active*256 Inactive)/weight的公式计算出最终比重值,按最小的分配。其中Active表示活动连接数,Inactive是非活动连接数,weight是权重值。但此算法容易受到非活动连接(即连接上后不做任何操作的客户)的影响。

sed算法,是把当前处于活动状态的数目 1来实现,数目最小的,接受下次请求, 1的目的是为了考虑加权的时候,非活动连接过多的缺陷:当权限过大的时候,会导致空闲服务器一直处于无连接状态。公式是:Overhead=(Active 1)/weight。

SH算法,是根据请求服务的客户端的域名或IP地址,进行哈希计算,计算后的值对Real Server(即节点服务器)的个数取模求余,从而保证可以将同一域名或IP的请求始终分发到后端的同一个Real Server上,常用于Session保持等场景;

DH算法,不同于SH是根据客户端的信息进行哈希计算,DH算法是根据请求的目标资源进行哈希计算,比如请求的URL,此方式的目的在于:能够保证对相同资源的请求始终分发到后端同样的Real Server上;

以上算法中,lc、wlc、sed、nq、lblc、lblcr算法统称为动态算法,其他四种被称为静态算法。

0 人点赞