一、规划
如上图所示,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主机配置
#!/bin/sh
VIP=192.168.122.50
RIP1=192.168.122.10
RIP2=192.168.122.20
. /etc/rc.d/init.d/functions
case "$1" in
start)
echo "start LVS of DirectorServer"
/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev eth0:1
#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"
/sbin/ipvsadm -C
/sbin/ifconfig eth0:1 down
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
dr 模式下,不需要开启路由转发,在很多网上给出的文档上也开启了路由转发,这个是非必须的。因为VIP和realserver都在同一网段,不涉及路由的问题 。
2、realserver主机配置
#!/bin/bash
VIP=192.168.122.50
LOCAL_Name=50bang
BROADCAST=192.168.0.255 #vip's broadcast
. /etc/rc.d/init.d/functions
case "$1" in
start)
echo "reparing for 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
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $BROADCAST up
/sbin/route add -host $VIP dev lo:0
;;
stop)
ifconfig lo:0 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
;;
*)
echo "Usage: lvs {start|stop}"
exit 1
esac
3、测试
经测试在director主机直接curl 是不能获取页面的,这个需要在director之外的主机上测试。如上图中的user主机测试。测试结果如下:
[root@localhost ~]# curl http://192.168.122.50
lvs01 host!
[root@localhost ~]# curl http://192.168.122.50
lvs02 host!
[root@localhost ~]# curl http://192.168.122.50
lvs01 host!
[root@localhost ~]# curl http://192.168.122.50
lvs02 host!
看到的连接情况如下:
[root@lvs-dr ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.122.50:80 rr
-> 192.168.122.10:80 Route 1 0 5
-> 192.168.122.20:80 Route 1 0 5
三、总结
负载均衡器也只是简单的分发请求,应答包通过单独的路由方法返回给客户端 。由于数据返回不走director ,而是直接由 realserver返回给用户。所认其承载能力比较强,单台lvs dr模式下后端负载的realserver 数量可以达到100台。不过也因为其比较简单,只有四层处理能力,所以其无法对后端server 的健康状态做检查。