zoukankan      html  css  js  c++  java
  • LVS-DR工作原理图文详解

    为了阐述方便,我根据官方原理图另外制作了一幅图,如下图所示:VS/DR的体系结构:

    LVS-DR工作原理

    我将结合这幅原理图及具体的实例来讲解一下LVS-DR的原理,包括数据包、数据帧的走向和转换过程。

    官方的原理说明:Director接收用户的请求,然后根据负载均衡算法选取一台realserver,将包转发过去,最后由realserver直接回复给用户。

    实例场景设备清单:

    实例场景设备清单

    说明:我这里为了方便,client是与vip同一网段的机器。如果是外部的用户访问,将client替换成gateway即可,因为IP包头是不变的,变的只是源mac地址。

    ① client向目标vip发出请求,Director接收。此时IP包头及数据帧头信息如下:

    client向目标vip发出请求

    ② VS根据负载均衡算法选择一台active的realserver(假设是192.168.57.122),将此RIP所在网卡的mac地址作为目标mac地址,发送到局域网里。此时IP包头及数据帧头信息如下:

    ③ realserver(192.168.57.122)在局域网中收到这个帧,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文。随后重新封装报文,发送到局域网。此时IP包头及数据帧头信息如下:

    ④ 如果client与VS同一网段,那么client(192.168.57.135)将收到这个回复报文。如果跨了网段,那么报文通过gateway/路由器经由Internet返回给用户。

    LVS/DR模式工作原理的常见问题。

    1. LVS/DR如何处理请求报文的,会修改IP包内容吗?

    1.1 vs/dr本身不会关心IP层以上的信息,即使是端口号也是tcp/ip协议栈去判断是否正确,vs/dr本身主要做这么几个事:

    1)接收client的请求,根据你设定的负载均衡算法选取一台realserver的ip;

    2)以选取的这个ip对应的mac地址作为目标mac,然后重新将IP包封装成帧转发给这台RS;

    3)在hash table中记录连接信息。

    vs/dr做的事情很少,也很简单,所以它的效率很高,不比硬件负载均衡设备差多少。

    数据包、数据帧的大致流向是这样的:client --> VS --> RS --> client

    1.2 前面已作了回答,vs/dr不会修改IP包的内容.

    2. RealServer为什么要在lo接口上配置VIP?在出口网卡上配置VIP可以吗?

    2.1 既然要让RS能够处理目标地址为vip的IP包,首先必须要让RS能接收到这个包。

    在lo上配置vip能够完成接收包并将结果返回client。

    2.2 答案是不可以将VIP设置在出口网卡上,否则会响应客户端的arp request,造成client/gateway arp table紊乱,以至于整个load balance都不能正常工作。

    3. RealServer为什么要抑制arp帧?

    这个问题在上一问题中已经作了说明,这里结合实施命令进一步阐述。我们在具体实施部署的时候都会作如下调整:

           echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
           echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
           echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
           echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

    我相信很多人都不会弄懂它们的作用是什么,只知道一定得有。我这里也不打算拿出来详细讨论,只是作几点说明,就当是补充吧。

    3.1

    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

    这两条是可以不用的,因为arp对逻辑接口没有意义。

    3.2 如果你的RS的外部网络接口是eth0,那么

    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

    其实真正要执行的是:

    echo "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce

    所以我个人建议把上面两条也加到你的脚本里去,因为万一系统里上面两条默认的值不是0,那有可能是会出问题滴。

    arp_ignore:

    定义对目标地址为本地IP的ARP询问不同的应答模式0

    0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求

    1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求

    2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内

    3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应

    4-7 - 保留未使用

    8 -不回应所有(本地地址)的arp查询

    确定了向外发送ARP请求的发出地址 也即使VIP 地址

    arp_announce - INTEGER

    对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制:  

    确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口

    0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址

    1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP 不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.

    2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出 访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.

    限制了使用本地的vip地址作为优先的网络接口

    4. LVS/DR load balancer(director)与RS为什么要在同一网段中?

    从第一个问题中大家应该明白vs/dr是如何将请求转发给RS的了吧?它是在数据链路层来实现的,所以director必须和RS在同一网段里面。

    5. 为什么director上eth0接口除了VIP另外还要配一个ip(即DIP)?

    5.1 如果是用了keepalived等工具做HA或者Load Balance,则在健康检查时需要用到DIP。

    5.2 没有健康检查机制的HA或者Load Balance则没有存在的实际意义。

    6. LVS/DR ip_forward需要开启吗?

    不需要。因为director跟realserver是同一个网段,无需开启转发。

    7. director的vip的netmask一定要是255.255.255.255吗?

    lvs/dr里,director的vip的netmask 没必要设置为255.255.255.255,也不需要再去

    route add -host $VIP dev eth0:0

    director的vip本来就是要像正常的ip地址一样对外通告的,不要搞得这么特殊.

    转自:http://www.cnblogs.com/czh-liyu/archive/2011/11/29/2267963.html

  • 相关阅读:
    7.21 高博教育 数组 内存
    【基础扎实】Python操作Excel三模块
    PAT 甲级 1012 The Best Rank
    PAT 甲级 1011  World Cup Betting
    PAT 甲级 1010 Radix
    链式线性表——实验及提升训练
    循环程序设计能力自测
    链表应用能力自测
    PAT 甲级 1009 Product of Polynomials
    1008 Elevator (20分)
  • 原文地址:https://www.cnblogs.com/pricks/p/3811869.html
Copyright © 2011-2022 走看看