2015/5/24 LVS原理与使用

    继续我们的LVS学习,上篇中,我们讲解了LVS-NAT模式的负载均衡,本篇我们将继续学习LVS-Tun模式的负载均衡机制。

    本篇内容中,我们将学习讨论:

      (1)、LVS-Tun模式的构架拓扑以及原理。

      (2)、LVS-Tun模式的具体操作以及注意事项。

      (3)、扩展知识(选读·难)。 


    一、LVS-Tun模式的构架拓扑以及原理

    为了讲明LVS-Tun的构架,我们会例牌的上一张我自己用Excel画的草图。

    可以看出它的拓扑结构跟LVS-NAT有巨大的差别。首先它的所有服务器(包括LVS以及真实服务器)都是直接连接在公网的交换机上,而NAT中的真实服务器则是连接在私网的交换机上;其次我们可以看到LVS服务器至少只需要一张网卡即可;最后还有一点最大的区别就是多了个Vip的东西。

    当来自因特网的用户想访问我们的服务/网站的时候,电信的DNS会把域名解析成我们的主机IP也就是VIP,接着数据包通过交换机从我们的LVS服务器的网卡进入,LVS服务器根据我们预设的负载均衡算法,自动的将数据包加工并推送到相应的真实服务器中。真实服务器在接收并处理响应的数据包从(真实)服务器的网卡推送出来后将直接通过交换机传输给用户不再通过LVS服务器。

    事实上,一般一次的“请求-响应”的处理过程,请求的报文往往都是小而短,大部分的网络流量都产生在响应的报文之中,因此使用LVS-Tun技术作为负载均衡能比使用LVS-NAT获得更高(数倍或更高)的吞吐量。但同样的这也有一个缺点,那就正如拓扑图所示的那样,所有的服务器都需要公网IP,并且真是服务器都是暴露在外网当中,有潜在被不法分子攻击的危险。

 

    二、LVS-Tun模式的具体操作以及注意事项

    同样LVS-NAT一样,我们需要准备几台机器,以下是它们的配置

      LVS服务器:ech0:192.168.1.100/24

      真实服务器A:eth0:192.168.1.201/24

      真实服务器B:eth0:192.168.1.202/24

      VIP:192.168.1.55/32

    首先,我们需要先配置LVS服务器:

      ifconfig eth0:0 192.168.1.55 netmask 255.255.255.255 up  #添加一张Tun网卡

      route add -host 192.168.1.55 dev eth0:0    #添加一个路由规则

      ipvsadm -C    #清空ipvsadm

      ipvsadm -A -t 192.168.1.55:80 -s rr    #添加一个需要负载均衡的IP及端口(即vip)

      ipvsadm -a -t 192.168.1.55:80 -r 192.168.1.201 -i    #注册一个真实服务器

      ipvsadm -a -t 192.168.1.55:80 -r 192.168.1.202 -i    #注册另一个真实服务器

      echo '0' >/proc/sys/net/ipv4/ip_forward      #关闭转发

      echo '1' >/proc/sys/net/ipv4/conf/all/send_redirects    

      echo '1' >/proc/sys/net/ipv4/conf/default/send_redirects

      echo '1' >/proc/sys/net/ipv4/conf/eth0/send_redirects

    至此,LVS服务器已经配置完成。

    接下来我们配置真实服务器(A与B一样):      

      ifconfig tunl0 192.168.1.55 netmask 255.255.255.255 up  #添加一张Tun网卡 

      route add -host 192.168.1.55 dev tunl0    #添加一个路由规则

      echo '0'>/proc/sys/net/ipv4/ip_forward    #关闭转发

      echo '1'>/proc/sys/net/ipv4/conf/tunl0/arp_ignore  #增加一些arp设置,以下均是

      echo '1'>/proc/sys/net/ipv4/conf/all/arp_ignore

      echo '2'>/proc/sys/net/ipv4/conf/all/arp_announce

      echo '2'>/proc/sys/net/ipv4/conf/tunl0/arp_announce

      echo '0'>/proc/sys/net/ipv4/conf/tunl0/rp_filter

      echo '0'>/proc/sys/net/ipv4/conf/all/rp_filter

    同样这里也有几点需要注意的:

      (1)、由于IP隧道需要特殊的协议支持,因此请确认您的计算机是支持该协议的(具体检测方法请百度谷歌)。

      (2)、关闭Linux的路由功能(如果已经打开)。

      (3)、确保教程上的所有命令都用上(而非网上找到的)。

 

    三、拓展知识(选读·难)

    而事实上IP隧道(IP tunneling)技术也被称为IP封装技术(IP encapsulation),它是将一段IP报文封装到另一段报文的技术,它的调度与管理与LVS-NAT模式一样,只是报文转发方法不同,其过程可由下图表示:

    “既然VIP是DNS解析的主机IP,并且所有的请求都需要先到达LVS服务器,为何不直接把VIP作为LVS网卡的公网IP,真实服务器不用再配置VIP。”除了我以外,应该有不少脑筋灵敏的读者也会有这么个疑问。我们来作一个假设,假设我们主机把VIP作为LVS的网卡IP,真实服务器不再配置VIP,看看会发生什么事(假设通讯可行)。我们模拟了通讯:

   我们再来看看各个步骤数据包的参数结构。

    不知各位读者有没有看懂这个图,步骤1-6是用户第一次向服务器发送请求,请求经过LVS并转发到真实服务器(这里是B服务器),最后由真实服务器处理并直接响应给用户,当用户再次发起请求时,问题出现了,由于计算机会使用上一次接收到的数据包的源IP和源Mac作为下一次发送的数据包的目的IP和目的Mac,于是,当新来的数据包到达交换机后,数据包将直接推送到真实服务器,不再经过LVS。问题不仅如此的是,由于请求不再经过LVS,LVS调度表中的状态数据的值将远低于真实状况,这也使得LVS对当前真实服务器的压力产生误判,不仅没有达到负载均衡的效果,还有可能造成单台服务器负载过重。而让真实服务器加入tunl0网卡并设置vip后效果就大不相同,响应的报文会把源IP自动的回写VIP,然后用户二次发起请求时,数据包仍然是可达LVS的。

     “所有服务器都可以用同一个IP?为何?”在所有服务器都设置了相同的VIP后,更机智的读者可能会马上意识到这个问题,是的,一个IP是不能直接用于多个网络设备的,否则会造成网络冲突。网络冲突(特指这种)是怎么检测到呢?秘密就在交换机的ARP广播中,交换机为了维持自身的ARP缓存表会不断的发送ARP广播,收到广播的网络设备会进行响应,交换机收到设备的回应之后将更新缓存表,如果在单一的ARP广播中,却收到了多个网络设备的相应,交换机将无法判断那个才是真正的ARP关系(亚哈?的一声傻掉了)。这是,真实服务器中的那几句ARP忽略和ARP宣言就成了解决的关键,它的作用就是忽略交换机发出的VIP的MAC查询,只响应eth0(真实网卡)上的IP的MAC查询,这样,每次交换机发的ARP广播有且只有LVS服务器是做出回应的。

    最后,我还想再补充一个知识,就是Tun网卡子网掩码的秘密,它的作用就是分割网段,就这样完了。 


     本篇内容就到这里结束,下一篇,我们将学习LVS-DR模式,我们下回见。

  [ 负载均衡 ]   [ LVS ]   [ Linux ]
知识共享许可协议 本作品由小蝶惊鸿创作,采用知识共享署名 4.0 国际许可协议进行许可,转载时请保留本文署名及链接。