1.LVS-DR模式原理图:

lvs-dr原理_dr

  过程:①客户端发送请求数据包,包的源地址为CIP,目标地址为VIP。

         ②lvs根据合适的算法选择出提供服务的真实服务器,然后将数据包的mac地址改成选择的真实服务器的mac地址,并通过交换机发送给真实服务器。

         ③真实服务器的数据链路层收到报文,往上传给IP层,IP层验证请求的目标IP。由于包的目标IP是VIP,只有目标mac地址是真实服务器的。所以,在真实服务器的lo接口(不会跟lvs的ip冲突)上绑定VIP。

         ④lvs调度器和真实服务器群在一个局域网内,当客户端进行arp广播时,调度器和真实服务器都能收到,会白白浪费很多资源。我们只需要让调度器对用户响应,因此要在真实服务器端抑制arp。具体方法:修改/etc/sysctl.conf文件

       net.ipv4.ip_forward = 1

        net.ipv4.conf.lo.arp_ignore = 1
        net.ipv4.conf.lo.arp_announce = 2
        net.ipv4.conf.all.arp_ignore = 1
        net.ipv4.conf.all.arp_announce = 2

        ⑤真实服务器处理完后。将应答直接给客户端。RS最好为带公网IP的服务器(也可以无公网ip,直接走机房网关,但效率较低)。


2. lvs三种模式比较:

   lvs-nat模式:调度器重写请求报文的目的地址,根据调度算法将请求分派给realserver;realserver的响应报文通过调度器时,报文的源地址被重写,再返回给客户(lvs调度器可能成为瓶颈)。

   lvs-tun模式:调度器把请求通过ip隧道转发至realserver,realserver响应报文直接给客户,调度器只处理请求报文(ip隧道,花销较大)。

  lvs-dr原理_lvs_02

3. 十种调度算法:

   ① 四种静态算法,不考虑后端服务器实际负载情况:

      RR:  根据规则依次论调,不考虑RS的性能。轮到谁就转发给谁。

    WRR:加权轮询,加入了weight(权重),可以根据RS的性能为其设置权重值,权重越大功能越强,但是不能发硬当前的服务器的运行的情况。

     DH:目标地址hash,适用于前段是一个drector后端是几个缓存服务器,当客户端第一次访问到的是RS1的时候,DH这种算法保证,在客户端刷新后还是访问的是RS1。

       SH:源地址hash,用于保证响应的报文和请求的报文是同一个路径。

    ② 六种动态算法,考虑后端服务器当前负载后再进行分配:

    LC:least connection,当一个用户请求过来的时候,就计算下哪台RS的链接谁最小,那么这台RS就获得了下次响应客户端请求的机会,计算的方法Overhead=active*256+inactive,如果两者的结果是相同的则从LVS中的规则依次往下选择RS。这种算法也是不考虑服务器的性能的。

    WLC: 这个就是加了权重的LC,考虑了RS的性能,即是性能好的就给的权重值大一些,不好的给的权重值小一些。缺点就是如果Overhead相同,则会按规则表中的顺序,由上而下选择RS,Overhead=(active*256+inactive)/weight 

     SED: 就是对WLC的情况的补充,Overhead=(active+1)*256/weight,加一,就是为了让其能够比较出大小。

     NQ: never queue 基本和SED相同,避免了SED当中的性能差的服务器长时间被空闲的弊端,它是第一个请求给性能好的服务器,第二个请求一定是给的空闲服务器不论它的性能的好与坏。以后还是会把请求给性能好的服务器

     LBLC: 它就是动态DH和LC的组合,适用于cache群,对于从来没有来过的那些新的请求会分给当前连接数较少的那台服务器。

      LBLCR:带有复制功能的LBLC,它的适用场景这里举例说明一下,比如说现在又RS1和RS2,第一次访问RS1的5个请求第二次又来了,理所应到Director将会将其交给RS1,而此时在RS2是非常闲的,所以此时最好的处理方法就是可以将后来的这5个请求分别交给RS1和RS2,所以此时就需要把客户端第一次请求的资源复制下来。(特殊情况)