lvs

lvs_keepalived

LAN客户端判定哪个路由器应该为其到达目标主机的下一跳网关的方式有动态及静态决策两种方式,其中,觉的动态路由发现方式有如下几种:
1Proxy ARP —— 客户端使用ARP协议获取其想要到达的目标,而后,由某路由以其MAC地址响应此ARP请求;
2Routing Protocol —— 客户端监听动态路由更新(如通过RIP或OSPF协议)并以之重建自己的路由表;
3ICMP IRDP (Router Discovery Protocol) 客户端 —— 客户端主机运行一个ICMP路由发现客户端程序;

动态路由发现协议的不足之处在于它会导致在客户端引起一定的配置和处理方面的开销,并且,如果路由器故障,切换至其它路由器的过程
会比较慢。解决此类问题的一个方案是为客户端静态配置默认路由设备,这大大简化了客户端的处理过程,但也会带来单点故障类的问题。
默认网关故障时,LAN客户端仅能实现本地通信。

VRRP可以通过在一组路由器(一个VRRP组)之间共享一个虚拟IP(VIP)解决静态配置的问题,此时仅需要客户端以VIP作为其默认网关即可。

图1显示了一个基本的VLAN拓扑,其中,Router ABC共同组成一个VRRP组,其VIP为10.0.0.1,配置在路由器A的物理接口上,因此A为
master路由器,B和C为backup路由器。VRRP组中,master(路由器A)负责负责转发发往VIP地址的报文,客户端1、23都以此VIP作为其
默认网关。一旦master故障,backup路由器B和C中具有最高优先级的路由器将成为master并接管VIP地址,而当原来的master路由器A重新
上线时,其将重新成为master路由器。

VRRP是一个“选举”协议,它能够动态地将一个虚拟路由器的责任指定至同一个VRRP组中的其它路由器上,从而消除了静态路由配置的单点故障。



VRRP术语

VRRP虚拟路由(VRRP router)



VRRP的优势

冗余:可以使用多个路由器设备作为LAN客户端的默认网关,大大降低了默认网关成为单点故障的可能性;
负载共享:允许来自LAN客户端的流量由多个路由器设备所共享;
多VRRP组:在一个路由器物理接口上可配置多达255个VRRP组;
多IP地址:基于接口别名在同一个物理接口上配置多个IP地址,从而支持在同一个物理接口上接入多个子网;
抢占:在master故障时允许优先级更高的backup成为master;
通告协议:使用IANA所指定的组播地址224.0.0.18进行VRRP通告;
VRRP追踪:基于接口状态来改变其VRRP优先级来确定最佳的VRRP路由器成为master;





配置keepalived为实现haproxy高可用的配置文件示例:

! Configuration File for keepalived

global_defs {  
   notification_email {  
         linuxedu@foxmail.com
         mageedu@126.com  
   }  
   notification_email_from kanotify@magedu.com 
   smtp_connect_timeout 3  
   smtp_server 127.0.0.1  
   router_id LVS_DEVEL  
}

vrrp_script chk_haproxy {  
    script "killall -0 haproxy"  
    interval 1  
    weight 2  
}

vrrp_script chk_mantaince_down {
   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
   interval 1
   weight 2
}

vrrp_instance VI_1 {  
    interface eth0  
    state MASTER  # BACKUP for slave routers
    priority 101  # 100 for BACKUP
    virtual_router_id 51 
    garp_master_delay 1

    authentication {  
        auth_type PASS  
        auth_pass password  
    }  
    track_interface {  
       eth0    
    }  
    virtual_ipaddress {  
        172.16.100.1/16 dev eth0 label eth0:0 
    }  
    track_script {  
        chk_haproxy  
        chk_mantaince_down
    }


    notify_master "/etc/keepalived/notify.sh master"  
    notify_backup "/etc/keepalived/notify.sh backup"  
    notify_fault "/etc/keepalived/notify.sh fault"  
}


注意:
1、上面的state为当前节点的起始状态,通常在master/slave的双节点模型中,其一个默认为MASTER,而别一个默认为BACKUP。
2、priority为当关节点在当前虚拟路由器中的优先级,master的优先级应该大于slave的;


下面是一个notify.sh脚本的简单示例:
#!/bin/bash
# Author: MageEdu <linuxedu@foxmail.com>
# description: An example of notify script
#

vip=172.16.100.1
contact='root@localhost'

Notify() {
    mailsubject="`hostname` to be $1: $vip floating"
    mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
    echo $mailbody | mail -s "$mailsubject" $contact
}

case "$1" in
    master)
        notify master
        /etc/rc.d/init.d/haproxy start
        exit 0
    ;;
    backup)
        notify backup
        /etc/rc.d/init.d/haproxy restart
        exit 0
    ;;
    fault)
        notify fault
        exit 0
    ;;
    *)
        echo 'Usage: `basename $0` {master|backup|fault}'
        exit 1
    ;;
esac




配置keepalived为实现haproxy高可用的双主模型配置文件示例:

说明:其基本实现思想为创建两个虚拟路由器,并以两个节点互为主从。

! Configuration File for keepalived

global_defs {  
   notification_email {  
         linuxedu@foxmail.com
         mageedu@126.com  
   }  
   notification_email_from kanotify@magedu.com 
   smtp_connect_timeout 3  
   smtp_server 127.0.0.1  
   router_id LVS_DEVEL  
}

vrrp_script chk_haproxy {  
    script "killall -0 haproxy"  
    interval 1  
    weight 2  
}

vrrp_script chk_mantaince_down {
   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
   interval 1
   weight 2
}

vrrp_instance VI_1 {  
    interface eth0  
    state MASTER  # BACKUP for slave routers
    priority 101  # 100 for BACKUP
    virtual_router_id 51 
    garp_master_delay 1

    authentication {  
        auth_type PASS  
        auth_pass password  
    }  
    track_interface {  
       eth0    
    }  
    virtual_ipaddress {  
        172.16.100.1/16 dev eth0 label eth0:0 
    }  
    track_script {  
        chk_haproxy  
        chk_mantaince_down
    }


    notify_master "/etc/keepalived/notify.sh master"  
    notify_backup "/etc/keepalived/notify.sh backup"  
    notify_fault "/etc/keepalived/notify.sh fault"  
}

vrrp_instance VI_2 {  
    interface eth0  
    state BACKUP  # BACKUP for slave routers
    priority 100  # 100 for BACKUP
    virtual_router_id 52
    garp_master_delay 1

    authentication {  
        auth_type PASS  
        auth_pass password  
    }  
    track_interface {  
       eth0    
    }  
    virtual_ipaddress {  
        172.16.100.2/16 dev eth0 label eth0:1
    }  
    track_script {  
        chk_haproxy  
        chk_mantaince_down
    }    
}


说明:
1、对于VI_1和VI_2来说,两个节点要互为主从关系;











LVS + keepalived的实现:

! Configuration File for keepalived

global_defs {  
   notification_email {  
         linuxedu@foxmail.com
         mageedu@126.com  
   }  
   notification_email_from kanotify@magedu.com 
   smtp_connect_timeout 3  
   smtp_server 127.0.0.1  
   router_id LVS_DEVEL  
}

vrrp_script chk_schedown {
   script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
   interval 2
   weight -2
}

vrrp_instance VI_1 {  
    interface eth0  
    state MASTER  
    priority 101
    virtual_router_id 51 
    garp_master_delay 1

    authentication {  
        auth_type PASS  
        auth_pass password  
    }

    track_interface {  
       eth0    
    }

    virtual_ipaddress {  
        172.16.100.1/16 dev eth0 label eth0:0
    }

    track_script {  
        chk_schedown
    }    
}


virtual_server 172.16.100.1 80 {
    delay_loop 6
    lb_algo rr 
    lb_kind DR
    persistence_timeout 50
    protocol TCP

#    sorry_server 192.168.200.200 1358

    real_server 172.16.100.11 80 {
        weight 1
        HTTP_GET {
            url { 
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 172.16.100.12 80 {
        weight 1
        HTTP_GET {
            url { 
              path /
              status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}


如果要使用TCP_CHECK检测各realserver的健康状态,那么,上面关于realserver部分的定义也可以替换为如下内容:
virtual_server 172.16.100.1 80 {
    delay_loop 6
    lb_algo rr 
    lb_kind DR
    persistence_timeout 300
    protocol TCP

    sorry_server 127.0.0.1 80

    real_server 172.16.100.11 80 {
        weight 1
        TCP_CHECK {
            tcp_port 80
            connect_timeout 3
        }
    }

    real_server 172.16.100.12 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
          }
    }
}

说明:其中的sorry_server是用于定义所有realserver均出现故障时所用的服务器。










keepalived通知脚本进阶示例:

下面的脚本可以接受选项,其中:
-s, --service SERVICE,...:指定服务脚本名称,当状态切换时可自动启动、重启或关闭此服务;
-a, --address VIP: 指定相关虚拟路由器的VIP地址;
-m, --mode {mm|mb}:指定虚拟路由的模型,mm表示主主,mb表示主备;它们表示相对于同一种服务而方,其VIP的工作类型;
-n, --notify {master|backup|fault}:指定通知的类型,即vrrp角色切换的目标角色;
-h, --help:获取脚本的使用帮助;

#!/bin/bash
# Author: MageEdu <linuxedu@foxmail.com>
# description: An example of notify script
# Usage: notify.sh -m|--mode {mm|mb} -s|--service SERVICE1,... -a|--address VIP  -n|--notify {master|backup|
falut} -h|--help

#contact='linuxedu@foxmail.com'
helpflag=0
serviceflag=0
modeflag=0
addressflag=0
notifyflag=0

contact='root@localhost'

Usage() {
  echo "Usage: notify.sh [-m|--mode {mm|mb}] [-s|--service SERVICE1,...] <-a|--address VIP>  <-n|--notify {master|
  backup|falut}>" 
  echo "Usage: notify.sh -h|--help"
}

ParseOptions() {
  local I=1;
  if [ $# -gt 0 ]; then
    while [ $I -le $# ]; do
      case $1 in
      -s|--service)
        [ $# -lt 2 ] && return 3
         serviceflag=1
         services=(`echo $2|awk -F"," '{for(i=1;i<=NF;i++) print $i}'`)
        shift 2 ;;
      -h|--help)
         helpflag=1
        return 0
        shift
        ;;
      -a|--address)
        [ $# -lt 2 ] && return 3
        addressflag=1
        vip=$2
        shift 2
        ;;
      -m|--mode)
        [ $# -lt 2 ] && return 3
        mode=$2
        shift 2
        ;;
      -n|--notify)
        [ $# -lt 2 ] && return 3
        notifyflag=1
        notify=$2
        shift 2
        ;;
      *)
        echo "Wrong options..."
        Usage
        return 7
        ;;
       esac
    done
    return 0
  fi
}

#workspace=$(dirname $0)

RestartService() {
  if [ ${#@} -gt 0 ]; then
    for I in $@; do
      if [ -x /etc/rc.d/init.d/$I ]; then
        /etc/rc.d/init.d/$I restart
      else
        echo "$I is not a valid service..."
      fi
    done
  fi
}

StopService() {
  if [ ${#@} -gt 0 ]; then
    for I in $@; do
      if [ -x /etc/rc.d/init.d/$I ]; then
        /etc/rc.d/init.d/$I stop
      else
        echo "$I is not a valid service..."
      fi
    done
  fi
}


Notify() {
    mailsubject="`hostname` to be $1: $vip floating"
    mailbody="`date '+%F %H:%M:%S'`, vrrp transition, `hostname` changed to be $1."
    echo $mailbody | mail -s "$mailsubject" $contact
}


# Main Function
ParseOptions $@
[ $? -ne 0 ] && Usage && exit 5

[ $helpflag -eq 1 ] && Usage && exit 0

if [ $addressflag -ne 1 -o $notifyflag -ne 1 ]; then
  Usage
  exit 2
fi

mode=${mode:-mb}

case $notify in
'master')
  if [ $serviceflag -eq 1 ]; then
      RestartService ${services[*]}
  fi
  Notify master
  ;;
'backup')
  if [ $serviceflag -eq 1 ]; then
    if [ "$mode" == 'mb' ]; then
      StopService ${services[*]}
    else
      RestartService ${services[*]}
    fi
  fi
  Notify backup
  ;;
'fault')
  Notify fault
  ;;
*)
  Usage
  exit 4
  ;;
esac



在keepalived.conf配置文件中,其调用方法如下所示:
    notify_master "/etc/keepalived/notify.sh -n master -a 172.16.100.1"  
    notify_backup "/etc/keepalived/notify.sh -n backup -a 172.16.100.1"  
    notify_fault "/etc/keepalived/notify.sh -n fault -a 172.16.100.1"

配置

yum -y install httpd 的方式安装好httpd服务。
分别在192.168.1.103192.168.1.104上做如下操作:
[root@centos ~]# yum -y install httpd
echo 103 >/var/www/html/index.html   #(104上的要把 103字段改成 104)
[root@centos ~]# setenforce 0   #关闭SELinux
[root@centos ~]# /etc/rc.d/init.d/iptables stop   #关闭防火墙

4、开始安装LVS
下载相关软件包:
[root@centos1 ~]# mkdir download
[root@centos1 ~]# cd download/
[root@centos1 download]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz  
5、安装命令
注:以下安装需要在192.168.1.101192.168.1.104上面操作:
[root@centos1 download]# uname -r   #查看linux内核版本  
2.6.32-220.el6.x86_64  
[root@centos1 download]# ln -s /usr/src/kernels/2.6.32-220.el6.x86_64/ /usr/src/linux #不做此步骤,安装会报错 
注:此ln命令的路径要和uname -r输出内核版本一致,如果没有 /usr/src/kernels/2.6.32-220.el6.x86_64/ 需要安装 kernel-devel软件包。 
[root@centos1 download]# tar zxvf ipvsadm-1.24.tar.gz  
[root@centos1 download]# cd ipvsadm-1.24  
[root@centos1 ipvsadm-1.24]# make  
[root@centos1 ipvsadm-1.24]# make install  
[root@centos1 ipvsadm-1.24]# ipvsadm  #执行ipvsadm命令,把LVS添加到linux内核中  
IP Virtual Server version 1.2.1 (size=4096)  
Prot LocalAddress:Port Scheduler Flags  
  -> RemoteAddress:Port       Forward Weight ActiveConn InActConn  
[root@centos1 ipvsadm-1.24]# lsmod | grep ip_vs  #查看LVS是否已经添加到linux内核了,如果有如下输出表示已经成功。  
ip_vs                 108133  0   
ipv6                  322029  154 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6  
6配置LVS 服务端
在192.168.1.101192.168.1.114上分别配置LVS DR模式
1)、配置LVS,建立一个脚本配置LVS
注:192.168.1.101192.168.1.114上配置都是一样的
[root@centos1 bin]# vim lvs_dr.sh
#!/bin/bash 
. /etc/init.d/functions 
vim lvs_dr.sh 
#!/bin/bash 
GW=192.168.1.1 
# website director vip. 
SNS_VIP=192.168.1.181 
SNS_RIP1=192.168.1.103 
SNS_RIP2=192.168.1.104 

logger $0 called with $1 
case "$1" in 
start) 
  # set squid vip 
  /sbin/ipvsadm --set 30 5 60 
  /sbin/ifconfig eth0:0 $SNS_VIP broadcast $SNS_VIP netmask 255.255.255.255 up 
  /sbin/route add -host $SNS_VIP dev eth0:0 
  /sbin/ipvsadm -A -t $SNS_VIP:80 -s wrr -p 3 
  /sbin/ipvsadm -a -t $SNS_VIP:80 -r $SNS_RIP1:80 -g -w 1 
  /sbin/ipvsadm -a -t $SNS_VIP:80 -r $SNS_RIP2:80 -g -w 1 
  touch /var/lock/subsys/ipvsadm >/dev/null 2>&1 
  ;; 
stop) 
  /sbin/ipvsadm -C 
  /sbin/ipvsadm -Z 
  ifconfig eth0:0 down 
  ifconfig eth0:1 down 
  route del $SNS_VIP 
  route del $SS_VIP 
  rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1 
  echo "ipvsadm stoped" 
  ;; 
status) 
  if [ ! -e /var/lock/subsys/ipvsadm ];then 
  echo "ipvsadm stoped" 
  exit 1 
  else 
  echo "ipvsadm OK" 
  fi 
  ;; 
*) 
 echo "Usage: $0 {start|stop|status}" 
 exit 1 
esac 
 exit 0 
[root@centos1 bin]# chmod +x lvs_dr.sh
[root@centos1 bin]# cp lvs_dr.sh /etc/rc.d/init.d/   #方便启动
[root@centos1 bin]# service lvs_dr.sh start   #启动lvs服务
用ipvsadm -Ln 命令查看是否有如下输出,如有证明LVS配置成功
[root@centos1 bin]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.181:http wrr persistent 3
  -> 192.168.1.104:http           Route   1      0          0         
  -> 192.168.1.103:http           Route   1      0          0         
7、配置LVS RS服务器
[root@centos bin]# vim lvs_dr.sh
#!/bin/bash
. /etc/init.d/functions
SNS_VIP=192.168.1.181

case "$1" in
start)
      ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
      /sbin/route add -host $SNS_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
      echo "RealServer Start OK"
      ;;
stop)
     ifconfig lo:0 down
      route del $SNS_VIP >/dev/null 2>&1
      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 "RealServer Stoped"
      ;;
*)
      echo "Usage: $0 {start|stop}"
      exit 1
esac
exit 0
[root@centos bin]# cp lvs_dr.sh /etc/rc.d/init.d/
[root@centos bin]# service lvs_dr.sh start  #启动lvs RS服务器
RealServer Start OK 

yum install -y keepalived
global_defs { 
   notification_email { 
         edisonchou@hotmail.com 
   } 
   notification_email_from sns-lvs@gmail.com 
   smtp_server 192.168.80.1 
   smtp_connection_timeout 30
   router_id LVS_DEVEL  # 设置lvsid,在一个网络内应该是唯一的
} 
vrrp_instance VI_1 { 
    state MASTER   #指定Keepalived的角色,MASTER为主,BACKUP为备         
    interface eth1  #指定Keepalived的角色,MASTER为主,BACKUP为备
    virtual_router_id 51  #虚拟路由编号,主备要一致
    priority 100  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR   
    advert_int 1  #检查间隔,默认为1s
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.80.200  #定义虚拟IP(VIP)192.168.2.33,可多设,每行一个
    } 
} 
# 定义对外提供服务的LVSVIP以及port
virtual_server 192.168.80.200 80 { 
    delay_loop 6 # 设置健康检查时间,单位是秒                   
    lb_algo wrr # 设置负载调度的算法为wlc                  
    lb_kind DR # 设置LVS实现负载的机制,有NATTUNDR三个模式  
    nat_mask 255.255.255.0               
    persistence_timeout 0         
    protocol TCP                 
    real_server 192.168.80.102 80 {  # 指定real server1IP地址
        weight 3   # 配置节点权值,数字越大权重越高             
        TCP_CHECK { 
        connect_timeout 10        
        nb_get_retry 3 
        delay_before_retry 3 
        connect_port 80 
        } 
    } 
    real_server 192.168.80.103 80 {  # 指定real server2IP地址
        weight 3  # 配置节点权值,数字越大权重越高 
        TCP_CHECK { 
        connect_timeout 10 
        nb_get_retry 3 
        delay_before_retry 3 
        connect_port 80 
        } 
     } 
}

3.5 配置从负载服务器

从负载服务器与主负载服务器大致相同,只是在keepalived的配置文件中需要改以下两处:

(1)将stateMASTER改为BACKUP2)将priority100改为99

vrrp_instance VI_1 { 
    state BACKUP # 这里改为BACKUP
    interface eth1 
    virtual_router_id 51 
    priority 99 # 这里改为99master优先级是100
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.80.200 
    } 
} 

模式

LVS 简介
         LVS  Linux  Virtual Server Linux 虚拟服务器;是一个虚拟的服务器集群【多台机器 LB IP】。LVS 集群分为三层结构:
·负载调度器(load balancer):它是整个LVS 集群对外的前端机器,负责将client请求发送到一组服务器[多台LB IP]上执行,而client
认为是返回来一个同一个IP【通常把这个IP 称为虚拟IP/VIP
·服务器池(server pool):一组真正执行client 请求的服务器,一般是我们的web服务器;除了web,还有FTPMAILDNS
·共享存储(shared stored):它为 server pool 提供了一个共享的存储区,很容易让服务器池拥有相同的内容,提供相同的服务[不是很理解]
LVS 4中常用的模式,分别讲一下4中模式的区别:
LVS  DR 模式
1.   DR(Direct  Routing)模式的网络结构:

        2.  工作的基本原理:
        (1). client 发送一个pv请求给VIPVIP 收到这请求后会跟LVS设置的LB算法选择一个LB 比较合理的realserver,然后把此请求的
        package MAC地址修改为realserverMAC地址;下面是我们通信的package的基本格式:


在这个通信的Package 有六个主要的字段:src mac  dst mac  src ip  src prot   dst ip  dst ip   现在这个包里面的 
dst mac LVS VIP的网卡MAC [TCP 三次握手完成时就只知道dsp ip dsp mac]
· DR 模式会把packet 里面的dst mac  改成 realserverMAC 地址;然后VIP会把这个包广播到当前的这个LAN里面;所以,要提前保证VIP
  所有的realserver 在同一个网段,也就是在用过LAN里面。
同一个网段:用子网掩码来实现的,我们知道我们的网络中有局域网,一个局域网有很多台机器,这些LAN里面的所有机器都公用一个外网IP;我
们是怎样界定这个LAN的呢?用的就是网段号;IP只是是32位二进制数表示,这32位分为:网络位 + 主机位;表现在子网掩码是就是:网络位是1
主机位是0;这样网络位 = IP  按位   子网掩码;所以,我们在把realserver 挂到LVS上前,需要确认DR模式,且IP 在同一个网段内。
·ARP协议会把这个包发送给真正的realserver【根据MAC 找到机器】
·把这个src ip----->realserver mac 地址建立一个hash表;这此次连接未断开前,同一个client发送的请求通过查询hash表,在次发送到
这台realserver上面;
·realserver 收到这个pachet后,首先判断dst ip 是否是自己的IP地址;如果不是就丢掉包;如果是就处理这个包。所以,DR模式还要在所有
realserver 的机器上面绑定VIPip地址:
[html] view plain copy
1.  /sbin/ifconfig lo:0 inet VIP netmask 255.255.255.255   -----> 这个要注意!  
· 这样realserver 发现package dst 自己能识别【绑定了2IP】,会处理这个包,处理完后把packagesrc  mac  dst mac  src ip 
  dst ip 都修改后再通过ARP 发送给VIP,通过VIP 发送给client   realserver 发送给 VIPpackage的格式:

· realserver 处理这个包后,会跟dst client ip 直接发送给 client ip;不经过lvs ;这样虽然效率比较高,但是有安全漏洞。 

                  LVS DR 工作的基本原理package 的详细信息:http://os.51cto.com/art/201105/264303.htm
         3.  LVS DR模式的注意情况:
·  LVS VIP  realserver 必须在同一个网段,不然广播后所有的包都会丢掉: 提前确认LVS/硬件LB 是什么模式,是否需要在同一个网段
·  所有的realserver 都必须绑定VIPIP地址,否则realserver 收到package后发现dst 不是自己的I怕,所有包都会丢掉。
·  realserver·处理完包后直接把package 通过dst IP 发送给 client ,不通过LVS/迎接IP 了这样的LVS /VIP 效率会更高一点。
【通过把realserverip暴漏给外界,不是很安全】
LVS  NAT 模式
1.    LVS NAT 模式的网络结构:

            2.   NAT 模式的基本原理:
·   NAT 模式工作原理的模拟图:

·   client202.100.1.2 
    VIP:     202.103.106.5    
                  realserver : 172.16.0.2  172.16.0.3  分别提供http ftp服务
        (1). 首先client 发送请求[package] VIP
[html] view plain copy
1.  #client 发送给VIPpackage  
2.SOURCE 202.100.1.2:3478  EDST   202.103.106.5:80  
        (2). VIP 收到package后,会根据LVS设置的LB算法选择一个合适的realserver,然后把package DST IP 修改为realserver   
[html] view plain copy
1.  # VIP 发送给realserverpackage  
2. SOURCE   202.100.1.2:3478  EDST   172.16.0.38000  
        (3). realserver 收到这个package后判断dst ip 是自己,就处理这个package ,处理完后把这个包发送给LVS VIP
[html] view plain copy
1.  # realserver 处理完成后发送给VIPpackage  
2.   SOURCE   172.16.0.38000  EDST     202.100.1.2:3478    # lvs 收到这个package 后发现dst ip 不是自己的会不会
丢掉?感觉有错误  
       (4). LVS 收到这个package 后把sorce ip改成VIPIPdst ip改成 client ip然后发送给client
[html] view plain copy
1.  #VIP收到package 后修改sourceip 发送给client的包:  
2.  SOURCE   202.103.106.5.8080  EDST   202.100.1.2:3478  
           3. NAT 模式的注意事项:
· NAT 模式修改的是dst IP,直接走 switch pub 不需要修改MAC 所以,不需要VIP realserver 同在一个网段内。
· NAT 模式 package in  package out 都需要经过LVS ;因此LVS 的可能会成为一个系统瓶颈问题。
LVS  FULL NAT 模式
1.     FULL NATT的基本原理:
              FULL NAT  client请求VIP 时,不仅替换了package dst ip,还替换了package src ip;但VIP 返回给
              client时也替换了src ip;还是通过上面NAT 模式的工作原因的图进行分析 FULL NAT 的工作原理:
         (1). 首先client 发送请求[package] VIP
[html] view plain copy
1.  #client 发送给VIPpackage  
2.SOURCE 202.100.1.2:3478  EDST   202.103.106.5:80  
        (2). VIP 收到package后,会根据LVS设置的LB算法选择一个合适的realserver,然后把package DST IP 修改为
        realserver;把sorce ip 改成 lvs 集群的LB IP   
[html] view plain copy
1.  # VIP 发送给realserverpackage  
2. SOURCE   172.24.101.135[lb ip]  EDST   172.16.0.38000  
        (3). realserver 收到这个package后判断dst ip 是自己,就处理这个package ,处理完后把这个包发送给LVS VIP
[html] view plain copy
1.  # realserver 处理完成后发送给VIPpackage  
2.   SOURCE   172.16.0.38000  EDST     172.24.101.135[这个ip LVS VIP 集群的一太机器]     
       (4). LVS 收到这个package 后把sorce ip改成VIPIPdst ip改成 client ip然后发送给client
[html] view plain copy
1.  #VIP收到package 后修改sourceip 发送给client的包:  
2.SOURCE   202.103.106.5.8080  EDST   202.100.1.2:3478  
      2. FULL NAT 模式的注意事项:
·FULL NAT 模式也不需要 LBIP realserver ip 在同一个网段;
·full nat nat 相比的优点是:保证RS回包一定能够回到LVS;因为源地址就是LVS--> 不确定
·full nat  因为要更新sorce ip 所以性能正常比nat 模式下降 10%
LVS  IP TUNNEL 模式
1.IP TUNNEL 模式的网络结构图:


       2. IP TUNNEL 模式的基本原理:
还是按NAT 模式的基本框架来说明TUNNEL 模式的基本原理:
        (1). 首先client 发送请求[package] VIP
[html] view plain copy
1.  #client 发送给VIPpackage  
2.SOURCE 202.100.1.2:3478  DST   202.103.106.5:80  
        (2). VIP 收到package后,会根据LVS设置的LB算法选择一个合适的realserver;并把client发送的package 包装到一个
        新的IP包里面;新的IP包的dstrealserverIP
[html] view plain copy
1.  # VIP 发送给realserverpackage  
2. client 发送的包  <strong>DST   172.16.0.38000</strong>  
        (3). realserver 收到这个package后判断dst ip 是自己,然后解析出来的packagedstVIP;会检测我们的网卡上是否
        帮了VIPip地址;如果帮了就会处理这个包,如果没有直接丢掉。 我们一般在realserver上面 lo:0 绑定了VIPip地址,
        就可以处理
[html] view plain copy
1.  # realserver 处理完成后直接发送给client响应包:  
2. SOURCE   172.16.0.38000  DST      202.100.1.2:3478  client ip  
      3. IP TUNNEL 模式的注意:
·TUNNEL 模式必须在所有的realserver 机器上面绑定VIPIP地址
·TUNNEL 模式的vip ------>realserver 的包通信通过TUNNEL 模式,不管是内网和外网都能通信,所以不需要lvs viprealserver 
在同一个网段内
·TUNNEL 模式 realserver会把packet 直接发给client 不会给lvs
·TUNNEL 模式走的隧道模式,所以运维起来比较难,所以一般不用

  LVS  DRNATFULL NATIP TUNNEL 模式的区别:
1.    是否需要lvs viprealserver 在同一个网段:
             DR 模式因为只修改 package MAC地址通过ARP广播的形势找到realserver,所以 要求LVS VIP realserverIP
              必须在同一个网段内,也就是在挂载VIP 时先确认LVS的工作模式,如果是DR模式需要先确认这个IP 只是否能挂在这个LVS下面。
其他模式因为都会修改DST ip  realserverIP 地址,所以不需要在同一个网段内
        2.   是否需要在realserver 绑定LVS vip IP 地址:
              realserver 收到package后会判断dst ip 是否是自己的ip,如果不是就直接丢掉包;因为DR模式dst 没有修改还是LVS
              VIP;所以需要在realserver上面绑定VIPIP TUNNEL 模式只是对package 重新包装一层,realserver解析后的IP
              DST  仍然是 LVSVIP ;也需要在realserver上面绑定VIP;其他的都不需要
        3.   四种模式的性能比较:
因为DR模式   TP TUNELL 模式都是在package in 时经过LVS ;在package out是直接返回给client;所以二者的性能比NAT 模式高;
IP TUNNEL 因为是TUNNEL 模式比较复杂,其性能不如DR模式;FULL NAT 模式因为不仅要更换 DST IP 还更换 SOURCE IP  所以性能比
NAT 下降10%
所以,4中模式的性能如下:DR  --> IP TUNNEL  --->NAT ----->FULL NAT
 LVS 实践中的积累
1. lvs 不会主动断开连接
比如 client 通过LVS VIP 采用长链接方式访问server,即使我们把LVS下面的realserverstatus.html文件删除了;本来通过LVS 
这台realserver 链接的请求也不会被LVS
强制断开;要等到client自己断开连接;【在client主动断开期间;client可以跟这台realserver 正常通信】;这样有个好处时在网络
抖动时;LVS不会频繁的流量截断,到不同的RS上面