一、规划

lvs-dr
lvs-dr

如上图所示,VIP为192.168.122.50 ,三台主机的真实IP分别为192.168.122.10/20/30 。

1, 首先用户用CIP请求VIP;

2, 根据上图可以看到,不管是Director Server还是Real Server上都需要配置VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,请求数据包的源地址为CIP目标地址为VIP,此时路由器会发广播问谁是VIP,那么我们集群中所有的节点都配置有VIP,此时谁先响应路由器那么路由器就会将用户请求发给谁,这样一来我们的集群系统是不是没有意义了,那我们可以在网关路由器上配置静态路由指定VIP就是Director Server,或者使用一种机制不让Real Server 接收来自网络中的ARP地址解析请求,这样一来用户的请求数据包都会经过Director Servre;

3,当Director Server收到用户的请求后根据此前设定好的调度算法结果来确定将请求负载到某台Real Server上去,假如说此时根据调度算法的结果,会将请求负载到Real Server 1上面去,此时Director Server 会将数据帧中的目标MAC地址修改为Real Server1的MAC地址,然后再将数据帧发送出去, 4,当Real Server1 收到一个源地址为CIP目标地址为VIP的数据包时,Real Server1发现目标地址为VIP,而VIP是自己,于是接受数据包并给予处理,当Real Server1处理完请求后,会将一个源地址为VIP目标地址为CIP的数据包发出去,此时的响应请求就不会再经过Director Server了,而是直接响应给用户。

二、lvs-dr模式配置

1、director主机配置

 1#!/bin/sh
 2VIP=192.168.122.50
 3RIP1=192.168.122.10
 4RIP2=192.168.122.20
 5. /etc/rc.d/init.d/functions
 6case "$1" in
 7  start)
 8     echo "start LVS of DirectorServer"
 9     /sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up
10     /sbin/route add -host $VIP dev eth0:1
11     #Clear IPVS Table
12     /sbin/ipvsadm -C
13     #Set Lvs
14     /sbin/ipvsadm -A -t $VIP:80 -s rr
15     /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
16     /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
17     #Run Lvs
18     /sbin/ipvsadm
19     ;;
20  stop)
21     echo "close LVS Directorserver"
22     /sbin/ipvsadm -C
23     /sbin/ifconfig eth0:1 down
24     ;;
25  *)
26     echo "Usage: $0 {start|stop}"
27     exit 1
28esac

dr 模式下,不需要开启路由转发,在很多网上给出的文档上也开启了路由转发,这个是非必须的。因为VIP和realserver都在同一网段,不涉及路由的问题 。

2、realserver主机配置

 1#!/bin/bash
 2VIP=192.168.122.50
 3LOCAL_Name=50bang
 4BROADCAST=192.168.0.255  #vip's broadcast
 5. /etc/rc.d/init.d/functions
 6case "$1" in
 7 start)
 8  echo "reparing for Real Server"
 9    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
10    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
11    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
12    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
13    ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $BROADCAST up
14     /sbin/route add -host $VIP dev lo:0
15     ;;
16 stop)
17     ifconfig lo:0 down
18    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
19    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
20    echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
21    echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
22     ;;
23 *)
24     echo "Usage: lvs {start|stop}"
25     exit 1
26esac

3、测试

经测试在director主机直接curl 是不能获取页面的,这个需要在director之外的主机上测试。如上图中的user主机测试。测试结果如下:

1[root@localhost ~]# curl http://192.168.122.50
2lvs01 host!
3[root@localhost ~]# curl http://192.168.122.50
4lvs02 host!
5[root@localhost ~]# curl http://192.168.122.50
6lvs01 host!
7[root@localhost ~]# curl http://192.168.122.50
8lvs02 host!

看到的连接情况如下:

1[root@lvs-dr ~]# ipvsadm -Ln
2IP Virtual Server version 1.2.1 (size=4096)
3Prot LocalAddress:Port Scheduler Flags
4  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
5TCP  192.168.122.50:80 rr
6  -> 192.168.122.10:80            Route   1      0          5
7  -> 192.168.122.20:80            Route   1      0          5

三、总结

负载均衡器也只是简单的分发请求,应答包通过单独的路由方法返回给客户端 。由于数据返回不走director ,而是直接由 realserver返回给用户。所认其承载能力比较强,单台lvs dr模式下后端负载的realserver 数量可以达到100台。不过也因为其比较简单,只有四层处理能力,所以其无法对后端server 的健康状态做检查。