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
/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
页:
[1]