• LVS 之 DR model arp_announce arp_ignore转


    DR模式的收发流程:


    1)客户端发起请求到调度器的vip.
    2)调度器根据调度算法在各个服务器中动态选择一台服务器,但它不修改ip报文,而是将数据帧的MAC地址改为选出服务器的MAC地址.再将修改名的数据帧在服务器的局域网发送.
    3)被选中服务器收到这个数据帧,从中获得ip报文,在解包的过程中它发现目标地址VIP是在本地的网络设备上,所以它会处理这个报文,然后根据路由表将响应报文直接返回客户端.

    在使用DR模式时,为什么要在real server上做如下的配置呢?
    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

    要想搞清理上面配置的作用,首先要了解arp的工作原理:
    ARP即地址解析协议,实现通过IP地址得知其物理地址,例如主机A要向主机B发送数据,它首先要查找arp表,寻找对映主机B的mac地址.知道了主机B的MAC地址,直接把目标MAC地址写入帧里面发送就可以了.
    如果在ARP缓存表中没有找到目标IP地址,主机A就会在网络上发送一个广播,告之局域网中所有的主机自己的IP地址及mac地址,并询问主机B的MAC地址是什么?
    网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应.
    这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了.同时A和B还同时都更新了自己的ARP缓存表(因为A在询问的时候把自己的IP和MAC地址一起告诉了B).
    下次A再向主机B或者B向A发送信息时,直接从各自的ARP缓存表里查找就可以了.


    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    系统只回答目的IP为是本地IP的包,也就是对广播包不做响应.
    默认是0,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求,并发送mac地址应答.

    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    当内网的机器要发送一个到外部的ip包,那么它就会请求路由器的Mac地址,发送一个arp请求,这个arp请求里面包括了自己的ip地址和Mac地址,
    而linux默认是使用ip的源ip地址作为arp里面的源ip地址,而不是使用发送设备上面的,这样在lvs这样的架构下,所有发送包都是同一个VIP地址,那么arp请求就会包括VIP地址和设备Mac,
    而路由器收到这个arp请求就会更新自己的arp缓存,这样就会造成ip欺骗了,VIP被抢夺,所以设置arp_announce为2,即只使用真正发送数据包的网络设备上的ip,而不使用vip.


     
    DR模型之 可伸缩Cache服务

    DR核心:响应过程不经过Director
    DR模型 要点:
     A.以下3种办法 都能达到:   仅让Director 会响应  Router的 关于VIP 的动态ARP 广播请求,禁止RS上的VIP直接跟前端路由通信
    1、修改路由,使用静态ARP;
    2、在RS上使用arptables,禁止响应对VIP的ARP广播请求;
    3、在RS上修改其内核参数,并向VIP配置在与RIP不同的接口的别名上;
           B. Diretor 转交报文 给 Real Server 时 ,必须 以VIP 为 目标 IP ,并且 Diretor 对报文的做如下动作:修改 报文的目标MAC 为 Real Server MAC,确保报文送到的是 Real Server
     
           C. 强行定义 路由规则,明确告诉linux: 只要访问目标为 VIP 那么响应的 源IP 就必须是VIP
     

       D. 响应报文从eth0出来后    交给的下一个 主机 ,那么 下个主机一定是 eth0(RIP)的网关。

     

     对调整的内核参数解释:

     
     我们一般采用修改 kernel 参数,来屏蔽 Real Server 对VIP 的ARP响应与通告,对此过程做如下解释:
    背景:
            HOST上有多个网卡,却在不同一网段,例如 eth0:net0    eth1:net1    eth2:net2 ..... ,这时 如果 net0 网段的主机 发起ARP请求,那么HOST 会把 eth0,eth1,eth2... 这些在HOST的网卡设备的 IP 与MAC 都发给 net0 里的请求端,但是 请求端 拿到了3个 设备的IP与MAC (eth0:IP MAC , eth1:IP MAC  eth2 : IP MAC)  以为这3个 IP 都能通信,而实际上 ,只有net0 内的eth0 网卡给他的IP和MAC 才能通信 , 而 eth1,eth2 给的IP与MAC 对于 请求端来说 是没有意义的,
            如何是 arp请求 能准确的 找到能通信的地址?
     
          在 kernel 2.4.26  和2.6.4 之后,引入了2个网卡设备标识:arp_ignor/arp_announc ,用于实现 调整ARP协议栈 工作模式
          arp_ignore      用于定义响应 限制级别
          arp_announce 用于定义通告 限制级别
    例如:
    通告:当主机接入 net 3.0 时
    之前内核:  通告  设备1.1 IP 和MAC  与  设备3.1 IP 与MAC
    之后内核:告诉内核:arp_announce=2     则仅 通告 设备 3.1 IP 与MAC
    仅宣告: 接入该网络的网卡的IP与MAC
    APR忽略:当ARP广播 来自 net 3.0 时
    之前内核: 响应 设备1.1 IP 和MAC  与 设备3.1 IP 与MAC
    之后内核:告诉内核:arp_ignore=1        则仅  响应 设备3.1 IP 与MAC
    对 进入该网卡 arp请求,仅回应 进入网卡的 IP与MAC
    那个设备向内核 宣布 arp_announce=2 arp_ignore=1  这表示 那个设备 自己管理自己的设备,不用别的设备 帮我通告了,这样arp 广播 就能找到 用于 准确 通信的 地址了。
     
      

    一个公网地址 的LVS DR 模型
    缺点: 需要直接 做 路由,使请求到 达 互联网
    公网地址的LVS DR 模型(VIP 与RIP 同网段)
    当然 这个是 比较 常用的 ,省下路由费 ,也解决了路由引起的 负载瓶颈,当然公网IP 需要自己掏钱的
    规划:(192.168.195.0 是我虚拟机 网关所在网段,能够自由上网,这里当公网IP用了)

    Real Server 配置
    解决arp问题
     
    配置所以接口的
         echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
         echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
    特地配置lo (告诉kernel 我的设备 我自己管,其他人 就别插手了)
           echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
           echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    不是用来通信的,只是用在响应客户端的时候,把 VIP 作为源地址而已(屏蔽掉自己响应 VIP 请求)
    /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
     
    定义 目标地址是  VIP 的报文   出去报文的 设备是lo:0
    /sbin/route add -host $VIP dev lo:0  

    Real Server 1:

    [root@nod3 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
    [root@nod3 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    [root@nod3 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    [root@nod3 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    [root@nod3 ~]# ifconfig lo:0 192.168.195.150 broadcast 192.168.195.171 netmask 255.255.255.255 up
    [root@nod3 ~]# route add -host 192.168.195.150 dev lo:0
    [root@nod3 ~]# route -n
    Kernel IP routing table
    Destination Gateway Genmask Flags Metric Ref Use Iface
    192.168.195.150 0.0.0.0 255.255.255.255 UH 0 0 0 lo
    192.168.195.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
    169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
    0.0.0.0 192.168.195.2 0.0.0.0 UG 0 0 0 eth0

    [root@nod3 ~]# ifconfig eth0
    Link encap:Ethernet HWaddr 00:0C:29:6F:42:49
    inet addr:192.168.195.171 Bcast:192.168.195.255 Mask:255.255.255.0
    inet6 addr: fe80::20c:29ff:fe6f:4249/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:746 errors:0 dropped:0 overruns:0 frame:0 TX packets:471 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:68969 (67.3 KiB) TX bytes:53295 (52.0 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) lo:0 Link encap:Local Loopback
    inet addr:192.168.195.150 Mask:255.255.255.255 UP LOOPBACK RUNNING MTU:16436 Metric:1

     

    Real Server 2

    [root@nod2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    [root@nod2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    [root@nod2 ~]# echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
    [root@nod2 ~]# echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
    [root@nod2 ~]# ifconfig lo:0 192.168.195.150 broadcast 192.168.195.170 netmask 255.255.255.255 up
    [root@nod2 ~]# route add -host 192.168.195.150 dev lo:0
    Director 配置
     
    ipvs报文需要 的出口 需要 打开ipforward
    echo 1 > /proc/sys/net/ipv4/ip_forward
     
    因为Director的VIP 是用来 提供服务的,必须配置 在出口网卡上,而且 Direcotor 有DIP 所以必须定义路由
     /sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up
     /sbin/route add -host $VIP dev eth0:1
    清空iptables 避免冲突,清空 ipvsadm ,重新设置 rules  
    [root@nod1 ~]# iptables -F
    [root@nod1 ~]# iptables -Z
    [root@nod1 ~]# ipvsadm -Z
    提供集群服务
     /sbin/ipvsadm -A -t $VIP:80 -s wlc
    提供Real  Server
     /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w $RSWEIGHT1
     /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w $RSWEIGHT2

    Director 配置

    [root@nod1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward 
    [root@nod1 ~]# ifconfig eth0:1 192.168.195.150 broadcast 192.168.195.150 netmask 255.255.255.255 up
    [root@nod1 ~]# route add -host 192.168.195.150 dev eth0:1
    [root@nod1 ~]# iptables -F
    [root@nod1 ~]# iptables -Z
    [root@nod1 ~]# ipvsadm -Z
    [root@nod1 ~]# ipvsadm -A -t 192.168.195.150:80 -s wlc
    [root@nod1 ~]# ipvsadm -a -t 192.168.195.150:80 -r 192.168.195.170 -g -w 1
    [root@nod1 ~]# ipvsadm -a -t 192.168.195.150:80 -r 192.168.195.171 -g -w 2

    IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port         
    Conns InPkts OutPkts InBytes OutBytes
    -> RemoteAddress:Port TCP 192.168.195.150:80 5091 25495 0 1824257 0
    -> 192.168.195.170:80 1703 8534 0 612007 0 -> 192.168.195.171:80 3388 16961 0 1212250 0
  • 相关阅读:
    HDU 5302(Connect the Graph- 构造)
    Redis 集群
    HDFS集中式缓存管理(Centralized Cache Management)
    JavaScript语言基础12
    【IOS】启动画面
    小贝_mysql优化学习
    hdu2099 整除的位数(暴力)
    Receiver type ‘X’ for instance message is a forward declaration
    动态游标(比如表名作为參数)以及动态SQL分析
    mongodb与SQL相应关系表
  • 原文地址:https://www.cnblogs.com/zengkefu/p/5491945.html
Copyright © 2020-2023  润新知