客户端向VS发出请求,源IP为CIP目的IP为VIP,然后给请求数据包在封装一层,源IP为DIP,目标IP为RIP,然后RS收到数据包,先解开一看,嗯目标地址是自己,再继续解封装,因为RS肯定也得支持隧道,所以就知道是CIP发来的请求,然后就可以用vip发出响应从RIP所在的接口发出直接到达客户端。此类型特殊,用的也不多,就简单这样讲讲~既然是要跨网络的,所以所有的RIP和VIP以及DIP都得是公网地址~
第三种是full-nat,和LVS-nat模式其是差不太多。在LVS-nat中,后端服务器为了能发送数据包给客户端,必须得经过VS,���以RS的网关得设置为DIP,即RS和VS必须在同一网段中,也就是不能跨网络,那如果我们非要让它实现跨网络怎么办?因为LVS-nat只是把目的地址VIP转换为RIP,以至于其不能跨网络,所以为了实现跨网络,我们就可以把请求数据包的源目ip地址都进行转换,这就是所谓的full-nat啦~
full-nat理解起来是最简单的,客户端向VS发送请求,VS接收到请求后,根据调度策略选择某一个RS,然后把请求的源ip地址从CIP改为DIP,目的IP从VIP改为RIP,发送到后端服务器,后端服务器收到请求后,再向VS响应请求,发送到VS,然后VS在通过地址转换发送到客户端,整个过程就是这么简单~~~所以VS和RS之间只要网络可达,无论RS在世界的哪个角落都能收到VS转发过来的请求,然后通过VS响应客户端。完美解决异地问题。
嗯嗯,到此呢,LVS的类型就将完了~除了dr复杂点其他都还好把。我们从宏观的角度描述了各类的LVS,我们很明白其实整个LVS负载均衡集群的核心就是那个调度器啦、而调度器的核心就是各种调度策略咯。所以,接下来我们就再讲讲各种调度方法把~我们可以把调度方法分为静态方法和动态方法,静态方法就是仅仅根据算法本身调度,动态方法就是根据算法及各RS当前的负载状态进行调度。
静态方法有如下几种:
RR,Round Robin,轮询调度,也就是无论个RS的性能,一个一个的进行调度。
WRR,Weighted RR,加权轮询,就是根据每个RS的性能不同,给每个设备不同的权值,权值大的就调度次数更多,比如有两台机器一个权值是3,一个权值是2,那么可以简单理解为先调用第一台机器3此,在调用第二台机器两次,这样一直轮询。
SH,Source Hashing,源地址哈希,假如我们提供服务的网站要保存用户的信息,比如说session会话之类的东东,如果用户1第一次访问被分配到RS1响应,然后把session之类的信息保存到了RS1,然后用户1第二次访问时,被分配到了RS2响应,以前保存的用户相关的信息没了?!这写问题就闹大了。所以,为了解决这类问题,就出现了所谓的源地址哈希,就是如果某个请求是第一次收到,我们就对请求报文的源ip地址进行hash计算,保存到一个哈希表中,并对应这个请求的RS地址 ,当第后面收到请求时,查看哈希表找到这个请求对应的RS,就直接传给上次访问的RS。这样就解决了,上述问题啦~
DH,Destination Hashing,目标地址哈希
动态方法如下:
LC:least connections,最少连接:即后端服务器那个处理的请求连接数最少就选哪个RS,公式为OverHead=Active*250+Inactive,活动链接数乘以250加上非活动连接数,越小越优先选择。不过此方式的虽然考虑到了后端的负载,但是并没区别出不同性能的服务器,所以此方法还是有不足之处、
WLC,Weight LC,加权最少连接,既然要烤炉每个设备的不同性能,我们也可以给不同性能的RS以不同的权重值,公式为OverHead=(Active*256+inactive)/weight,假如有三台机器,权重值分别是5,2,1.当第一个请求进来时,因为三台机器都没有链接,都是0,调度器就会根据RS列表从上到下一次调度,但是如果放在最前面的是性能最差的机器怎么办,如果我们想从第一个请求开始就根据负载能力调度,那么就有了下面这种方法。
SED,Shortest Expection Delay,最短延迟预期,因为相对于活动连接来说,非活动链接的消耗,小的可以忽略不计,所以我们可以直接不计算非活动链接数,以此来减小计算,SED公式如下Overhead=(activeconns+1)*256/weight,这样权重值大的一定会被先选到。不过依然有个问题,假如有两台机器,一台权重为1,另一台权重为10,当地一个请求进来时,经过计算第一台为256,第二个为25.6,然后就把第一个请求给第二台服务器,第二请求过来,经过计算依然给第2台服务器,如果一次过来9个请求,都会全部给第二台主机,那么第一台就一直处于等待状态,就算能力再差也至少得处理一个请求把~所以有下面这种调度方法。