zgdy 发表于 2019-1-2 13:37:58

LVS_DR 实验

实验拓扑
http://blog.运维网.com/pmghong/../attachment/201305/164230334.png

IP分配
client      192.168.30.1
Router   e0/0       10.0.0.123
         e0/1       192.168.30.200 (网关)

Director    eth0:    192.168.30.105
         eth0:1    192.168.30.254 (VIP)

Real 1      lo:1      192.168.30.254 (VIP)
         eth0      192.168.30.113

Real 2      lo:1      192.168.30.254 (VIP)
         eth0      192.168.30.114



注意:由于是用DR方式做负载均衡的,所以Real server 都要配置vip,并且指向路由器e0/1作为网关


一、路由器配置
路由器配置比较简单,只需要配置两个接口地址即可。
Router>en
Router#conf t
Router(config)#int e0/1
Router(config-if)#ip addr 10.0.0.123 255.255.255.0
Router(config-if)#no shutdown
Router(config)#int e0/0
Router(config-if)#ip address 192.168.30.200 255.255.255.0
Router(config-if)#no shutdown



二、配置Real 服务器
1、主页服务
由于前面的实验中已经配置好,这里就不再重复


2、配置VIP 地址
这里以第一台Real server 为例:
配置RIP
# ifconfig eth0 192.168.30.113/24
配置VIP
# ifconfig lo:1 192.168.30.254 netmask 255.255.255.255 broadcast 192.168.30.254



3、配置网关
# route add -host 192.168.30.254 dev lo:1
# route add default gw 192.168.30.200
# route add -host 192.168.30.254 dev lo:1
# route add default gw 192.168.30.200


# route
Kernel IP routing table
Destination      Gateway      Genmask   Flags Metric RefUse Iface
192.168.30.254      *          255.255.255.255UH   0    0    0 lo
192.168.30.0      *          255.255.255.0    U    0    0    0 eth0
link-local          *            255.255.0.0   U   10020    0 eth0
default       192.168.30.200       0.0.0.0       UG   0    0    0 eth0


三、配置Director 服务器
1、配置IP
# ifconfig eth0 192.168.30.105/24
# ifconfig eth0:1 192.168.30.254 netmask 255.255.255.255 broadcast 192.168.30.254



2、配置网关
# route add default gw 192.168.30.200
# route add -host 192.168.30.254 dev eth0:1


# route
Kernel IP routing table
Destination   Gateway         Genmask       Flags Metric RefUse Iface
192.168.30.254   *            255.255.255.255   UH0   0    0 eth0
192.168.30.0   *            255.255.255.0      U   0   0    0 eth0
link-local       *            255.255.0.0          U   10020    0 eth0
default   192.168.30.200       0.0.0.0         UG0   0    0 eth0



3、配置lvs
# ipvsadm -A -t 192.168.30.254:80 -s rr
# ipvsadm -a -t 192.168.30.254:80 -r 192.168.30.113 -g
# ipvsadm -a -t 192.168.30.254:80 -r 192.168.30.114 -g



4、设置不允许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


#sysctl -p


# 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
// arp_ignore=1系统只回答目的IP 为本地IP 的包(也就是对广播包不做响应)
// arp_announce=2系统忽略IP 包的源地址,而根据目标主机,选择本地地址


arp_ignore : INTEGER定义对目标地址为本地IP的ARP询问不同的应答模式,默认为0
0 : 回应任何网络接口上对任何本地IP地址的arp 查询请求
比如eth0=192.168.0.1/24,eth1=10.1.1.1/24 那么即使eth0 收到来自10.1.1.2 这样地址发起的对10.1.1.1 的arp查询也会回应,而原本这个请求该是出现在eth1上,也该由eth1 回应的。


1: 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,eth1 收到来自10.1.1.2 这样地址发起的对192.168.0.1的查询不会回答,而对192.168.0.2 发起的对192.168.0.1 的ARP 查询会回应。


2 : 不回应该网络接口的ARP请求,而只对设置的唯一和连接地址做出回应


注意:
如果是通过路由器连接的,那么对于每个Real Server 服务器改变后,客户端的浏览器里可能还会只显示其中一台Real 服务器的主页,原因是router 还保存着旧的ARP对应关系,所以要清除一下router 的缓存,执行如下命令:
Router# clear arp-cache


经过客户端几次访问后,在router上便看不到同一个MAC即对应Director 又对应Real Server
http://blog.运维网.com/pmghong/../attachment/201305/164313707.png


http://blog.运维网.com/pmghong/../attachment/201305/164327183.png
# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port      Forward Weight ActiveConn InActConn
TCP 192.168.30.254:80 rr
-> 192.168.30.113:80         Route      1       0   22
-> 192.168.30.114:80         Route      1       1   22





Real Server 还有Director 的配置也可以写成shell脚本
===========Director=========
#!/bin/bash
# description: start LVS of Director Server
GW=192.168.30.1
# website director vip
VIP=192.168.30.254
DIP=192.168.30.105
RIP1=192.168.30.111
RIP2=192.168.30.112
RIP3=192.168.30.113
RIP4=192.168.30.114


/etc/rc.d/init.d/functions


logger $0 called with $1


case "$1" in
    start)
      /sbin/ipvsadm --set 30 5 60
      /sbin/ip addr add dev eth1 $DIP
      /sbin/ip link set dev eth1 up
      /sbin/ip addr add dev eth0 $VIP brd $VIP
      /sbin/ip link set dev eth0 up
      /sbin/ip route add default via $GW


      /sbin/ipvsadm -A -t $VIP:80 -S wrr
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g -w 1
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g -w 1
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP3:80 -g -w 2
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP4:80 -g -w 2


      touch /var/locak/subsys/ipvsadm > /dev/null 2>&1
      /sbin/arping -I eth0 -c 5 -s $VIPO $GW > /dev/null 2>&1
      ;;


    stop)
      /sbin/ipvsadm -C
      /sbin/ipvsadm -Z
      /sbin/ip link set dev eth0 down
      /sbin/ip link set dev eth1 down
      rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1
      echo "ipvsadm stoped"
      ;;


    status)
      if[ ! -e /var/lock/subsys/ipvsadm ];then
            echo "ipvsadm stoppd"
            exit 1
      /sbin/ip route add default via $GW


      /sbin/ipvsadm -A -t $VIP:80 -S wrr
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g -w 1
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g -w 1
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP3:80 -g -w 2
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP4:80 -g -w 2


      touch /var/locak/subsys/ipvsadm > /dev/null 2>&1
      /sbin/arping -I eth0 -c 5 -s $VIPO $GW > /dev/null 2>&1
      ;;


    stop)
      /sbin/ipvsadm -C
      /sbin/ipvsadm -Z
      /sbin/ip link set dev eth0 down
      /sbin/ip link set dev eth1 down
      rm -rf /var/lock/subsys/ipvsadm >/dev/null 2>&1
      echo "ipvsadm stoped"
      ;;


    status)
      if[ ! -e /var/lock/subsys/ipvsadm ];then
            echo "ipvsadm stoppd"
            exit 1
      else
            echo "ipvsadm ok"
      fi
      ;;
    *)
      echo "Usage: $0 {start|stop|stauts}"
      exit 1
    esac
exit 0



===========Real Server=========
#!/bin/bash
# description:Config real server lo and apply noarp
VIP=192.168.30.254


case "$1" in
    start)
      /sbin/ip addr add dev lo $VIP brd $VIP


      echo "1" > /proc/sys/net/ipv4/conf/eth0/arp_ignore
      echo "2" > /proc/sys/net/ipv4/conf/eth0/arp_announce
      echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
      echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
      ;;
    stop)
      /sbin/ip link set dev lo down
      echo "0" > /proc/sys/net/ipv4/conf/eth0/arp_ignore
      echo "0" > /proc/sys/net/ipv4/conf/eth0/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
exit 0



小结:

[*]  配置比较复杂,原理不太好理解
[*]  工作环境中用的最多
[*]  在DR调试模式下,最好在搭建完Real 上的服务后,就把ARP广播限制住
[*]  由于Director本身不处理请求,而是后端Real Server直接处理,并通过路由表直接回应客户端,所以Director本身并不会成为瓶颈

  




页: [1]
查看完整版本: LVS_DR 实验