zoukankan      html  css  js  c++  java
  • LVS的DR模式

    DR模式:

    请求由LVS接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过LVS。

    DR模式下需要LVS和绑定同一个VIP(RS通过将VIP绑定在loopback实现)。

    一个请求过来时,LVS只需要将网络帧的MAC地址修改为某一台RS的MAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变,LVS只是做了一下移花接木。

    RS收到LVS转发来的包,链路层发现MAC是自己的,到上面的网络层,发现IP也是自己的,于是这个包被合法地接受,RS感知不到前面有LVS的存在。

    而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVS。

    DR模式是性能最好的一种模式。

     
     
    1. ARP广播会产生的问题
     
    当客户端发起访问VIP 对应的域名的请求时,根据网络通信原理会产生ARP 广播,因为负载均衡器和真实的服务器在同一网络并且VIP设置在集群中的每个节点上此时集群内的真实服务器会尝试回答来自客户端计算机的查找VIP的ARP广播,这就会产生问题,大家都说我是"VIP"
     
    2. 为了达到负载均衡的目的,必须想法办让真实服务器忽略来自客户端计算机的ARP广播请求
     
    虚拟ip地址的广播地址是它本身,子网掩码是255.255.255.255。 为什么要这样呢?因为有若干机器要使用同一个ip地址,
    用本身做广播地址和把子网掩码设成4个255就不会造成ip地址冲突了,否则lvs将不能正常转发访问请求。
    方法一:在真实服务器上设置lo 忽略ARP 广播
    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 
     
     如果VIP 是设置在真实服务器的非lo接口,那么做如下设置
    net.ipv4.conf.ethN.arp_ignore = 1 
    net.ipv4.conf.ethN.arp_announce = 2 (N 为网卡接口)
    net.ipv4.conf.all.arp_ignore = 1 
    net.ipv4.conf.all.arp_announce = 2 
     
    方法二: 隐藏真实服务器上VIP 的网络接口
     
    #to activate the hidden feature 
     echo 1 > /proc/sys/net/ipv4/conf/all/hidden
    #to make lo:0 not arp, put lo here 
     echo 1 > /proc/sys/net/ipv4/conf/<interface_name>/hidden
     
    3、session
    客户端与服务端的通信,一次请求可能包含多个TCP包,LVS必须保证同一连接的TCP包,必须被转发到同一台RS,否则就乱套了。为了确保这一点,LVS内部维护着一个Session的Hash表,通过客户端的某些信息可以找到应该转发到哪一台RS上。
     
     
    参考资料:http://www.cnblogs.com/likehua/archive/2014/06/19/3796849.html
    --------------------------------------------------------------------------------
    实例列举:

    DR模式中LVS主机与实际服务器都有一块网卡连在同一物理网段上。

    IP分配

    VIP:10.10.3.170

    RIP1:10.10.3.140

    RIP2:10.10.3.141

    1、安装所需的依赖包

    yum install -y wget make kernel-devel gcc gcc-c++ libnl* libpopt* popt-static

    2、创建一个软链接,防止后面编译安装ipvsadm时找不到系统内核

    ln -s /usr/src/kernels/2.6.32-358.18.1.el6.x86_64/ /usr/src/linux

    3、下载安装ipvsadm

    wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
    tar zxvf ipvsadm-1.26.tar.gz
    cd ipvsadm-1.26
    make && make install

    4、编写并运行脚本(LVS服务器的脚本)

    vi lvs.sh
    复制代码
    #!/bin/bash
    
    VIP=10.10.3.170
    RIP1=10.10.3.140
    RIP2=10.10.3.141
    
    /etc/rc.d/init.d/functions
    
    logger $0 called with $1
    case "$1" in
    
    start)
    echo " start LVS of DirectorServer"
    /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
    /sbin/route add -host $VIP dev eth0:0
    echo "1" >/proc/sys/net/ipv4/ip_forward
    
    #Clear IPVS table
    /sbin/ipvsadm -C
    #set LVS
    /sbin/ipvsadm -A -t $VIP:80 -s rr
    /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
    /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
    
    #Run LVS
    /sbin/ipvsadm
    ;;
    stop)
    echo "close LVS Directorserver"
    echo "0" >/proc/sys/net/ipv4/ip_forward
    /sbin/ipvsadm -C
    /sbin/ifconfig eth0:0 down
    ;;
    *)
    
    echo "Usage: $0 {start|stop}"
    exit 1
    esac
    复制代码

    注:/sbin/ipvsadm -A -t $VIP:80 -s rr (rr代表轮询,还有分配方式)

    /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g (-g代表DR模式,还有其他模式)

    5、给脚本加权限,并执行

    chmod +x lvs.sh
    chmod 755 /etc/rc.d/init.d/functions ./lvs.sh start

    6、配置后端的WEB服务器脚本

    vi realserver.sh
    复制代码
    #!/bin/bash
    # 2013-09-07 by kgdxpr
    VIP=10.10.3.170
    /etc/rc.d/init.d/functions
    case "$1" in
    start)
    echo " start LVS of REALServer"
    /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
    #受限广播,它不被路由发送,但会被送到相同物理网络段上的所有主机IP地址的网络字段和主机字全为1就是地址255.255.255.255
    /sbin/route add -host $VIP dev lo:0 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 sysctl -p >/dev/null 2>&1 ;; stop) /sbin/ifconfig lo:0 down echo "close LVS Directorserver" echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce ;; *) echo "Usage: $0 {start|stop}" exit 1 esac
    复制代码

     7、给脚本加权限,并执行 

    chmod +x realserver.sh chmod 755 /etc/rc.d/init.d/functions
    ./realserver.sh start

    --------------------------------------------------------------------------
    Realserver VIP自动设置脚本:

    #vim /etc/init.d/vipd
    
    #!/bin/bash
    # Script to start LVS DR virtual server.
    # description: LVS DR virtual server
    # chkconfig: 345 85 15
    .  /etc/rc.d/init.d/functions
    VIP1=10.1.1.18
    VIP2=10.1.1.19
    host=`/bin/hostname`
    case "$1" in
    start)
           # Start LVS-DR virtual server on this machine.
            /sbin/ifconfig lo down
            /sbin/ifconfig lo up
            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
            /sbin/ifconfig lo:1 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up
            /sbin/ifconfig lo:2 $VIP2 broadcast $VIP2 netmask 255.255.255.255 up
            /sbin/route add -host $VIP1 dev lo:1
            /sbin/route add -host $VIP2 dev lo:2
    ;;
    stop)
            # Stop LVS-DR virtual server loopback device(s).
            /sbin/ifconfig lo:1 down
            /sbin/ifconfig lo:2 down
            echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
            echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
            echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
            echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    ;;
    status)
            # Status of LVS-DR virtual server.
            islothere1=`/sbin/ifconfig lo:1 | grep $VIP1`
            islothere2=`/sbin/ifconfig lo:2 | grep $VIP2`
            isrothere1=`netstat -rn | grep "lo" | grep $VIP1`
            isrothere2=`netstat -rn | grep "lo" | grep $VIP2`
            if [ ! "$islothere1" -o ! "$isrothere1" ];then
                echo "LVS-DR virtual server 10.1.1.18 Stopped."
            else
                echo "LVS-DR virtual server 10.1.1.18 Running."
            fi
            if [ ! "$islothere2" -o ! "$isrothere2" ];then
                echo "LVS-DR virtual server 10.1.1.19 Stopped."
            else
                echo "LVS-DR virtual server 10.1.1.19 Running."
            fi
    ;;
    *)
                # Invalid entry.
                echo "$0: Usage: $0 {start|status|stop}"
                exit 1
    ;;
    esac
    
    
    #chkconfig --add vipd
    View Code


     

  • 相关阅读:
    Hadoop技术内幕——Hadoop配置信息处理
    协程,线程池
    线程知识点(锁,信号量,队列,条件)
    进程的概念
    socketserver网络编程简单的小例子
    socket 发送文件
    网络编程
    正则表达式
    面对对象--多态封装
    创建可管理的属性:property
  • 原文地址:https://www.cnblogs.com/wjoyxt/p/4626216.html
Copyright © 2011-2022 走看看