lvs-dr模式的原理在上一节已经讲过了,今天详细讲解下lvs的安装和dr模式的配置。
转载注明出处:http://blog.csdn.net/lengzijian/article/details/8107082
首先是下载:
1. 查看自己的linux内核版本
[root@master ~]#uname -a
Linux master2.6.18-128.el5 #1 SMP Wed Dec 17 11:42:39 EST 2008 i686 i686 i386 GNU/Linux
由于是2.6.18 所以下载ipvsadm-1.24-6.src.rpm版本的ipvs
2. 解压出源码压缩包:ipvsadm-1.24.tar.gz,解压后得到文件夹ipvsadm-1.24,进入文件夹,make
这里大多数人会报一个错误,一般是显示缺少头文件,我的错误是:
libipvs.h:14:23:error: net/ip_vs.h: No such file or directory
如何解决:
a. 首先查看是否存在文件夹“/usr/src/kernels/”
b. 如果没有,则用yum或者源码方式安装kernel
yum search kernel
c. 如果存在,建立软连接
ln -s/usr/src/kernels/2.6.18-308.13.1.el5-i686/ /usr/src/linux
d. 之后编译通过,make、makeinstall
其次是配置,我们延续上一次的配置
LinuxDirector 192.168.30.149(VIP)
RealServer 192.168.30.200
RealServer 192.168.30.201
附上网上推荐配置文件
1. LinuxDirector配置脚本
#!/bin/sh TIMEOUT=30 # set the vip and port VIP=192.168.30.149 VPORT1=80 # set the rip and port # web slave3=192.168.30.201 slave2=192.168.30.200 # port RPORT1=80 Usage () { echo "Usage:`basename $0` (start|stop|status) " exit 1 } if [ $# -ne 1 ];then Usage fi case $1 in start) echo "start LVS of DirectorServer" echo 1 > /proc/sys/net/ipv4/ip_forward # set the vip /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 # add lvs vip and port /sbin/ipvsadm -A -t $VIP:$VPORT1 -s rr # add rip and port /sbin/ipvsadm -a -t $VIP:$VPORT1 -r $slave3:$RPORT1 -g -w 1 /sbin/ipvsadm -a -t $VIP:$VPORT1 -r $slave2:$RPORT1 -g -w 1 /sbin/ipvsadm -L -n ;; stop) echo "close LVS DirectorServer" /sbin/ipvsadm -C /sbin/ifconfig eth0:1 down ;; status) /sbin/ipvsadm -L -n ;; *) Usage esac
2. realserver配置
#!/bin/sh VIP=192.168.30.149 BROADCAST=192.168.30.255 #vip's broadcast Usage () { echo "Usage:`basename $0` (start|stop)" exit 1 } if [ $# -ne 1 ];then Usage fi 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 /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $BROADCAST up /sbin/route add -host $VIP dev lo:0 ;; stop) /sbin/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 "stop Real Server" ;; *) Usage esac
问题1:arp_ignore和arp_announce一定要更改么
首先来介绍下arp_ignore:(官方配置这里就不说明,说下自己的理解)
0:当有人发送arp请求时,如果任何一个设备上面有这个ip,就响应arp请求,并且发送mac地址应答
(例如:我做了实验,在200上eth0=192.168.30.200lo:0=192.168.30.149,如果arp_ignore为0,那么从192.168.0.237发过来对192.168.30.149的arp消息,200的ech0也会相应,但是这个消息原本应该有LinuxDirector相应,这就导致的负载均衡的失效,所有的请求(不止是80端口),都会被192.168.30.200接受-------话说当初没有配置,这个问题也困扰了我好久好久)
1:当有人发送arp请求时,如果接受设备上面有这个ip,就响应arp请求(例如:对于上面的例子,如果设置arp_ignore为1,那么即使192.168.30.200收到访问192.168.30.149的消息,也不会做出相应,因为lo:0并非接受设备)
2:当有人发送arp请求时,如果接受设备上面有这个ip,且源ip必须在该网络接口的子网段内的就响应arp请求(比如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查询会回应(转))
3:不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应(这里本人也不是很理解,希望有人帮助解答)
内核文档原文是说:
do not reply for local addresses configured with scope host,only resolutions for global and link addresses are replied
ip有个scope属性,host,link,global分别表示ip属于本机、本子网和所有域。应该是说ip的scope配置为host时不响应arp广播吧。没有测试过。
4-7:保留位
8:不回应所有(本地地址)的arp查询
再来看下arp_announce介绍,理解起来应该不难:
0:(默认)在任意网络接口上的任何本地地址
1:尽量避免不在该网络接口子网段的本地地址.当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2:对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址.如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送
问题2:dr模式中LinuxDirector要和RealService在一个网段内么?
查看昨天的tcp流图,可以看出,vs/dr转发请求是通过修改源/目的mac地址来完成的,也就是说在数据链路层完成了上述操作,所以必须在同一个网段内。
问题3:设置/proc/sys/net/ipv4/conf/lo/arp_ignore有没有意义?
网上有人说lo数据逻辑接口,对逻辑接口设置这些没有意义,本人也做了测试,目前没有发现任何问题,所以可以去掉。
问题4:为何不设置/proc/sys/net/ipv4/conf/eth0/arp_ignore?
在设置/proc/sys/net/ipv4/conf/all/时,其实主要想要执行的就是eth0的配置修改。但是有一种情况,就是linux默认的eth0的arp_ignore和arp_announce的值如果不是0,那么即使设置了all也有可能不会生效。这里需要特殊主义,建议加上如下两句
echo "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignore
echo "2">/proc/sys/net/ipv4/conf/eth0/arp_announce
根据如上的叙述,RealServer的配置脚本应该改为:
#!/bin/sh VIP=192.168.30.149 BROADCAST=192.168.30.255 #vip's broadcast Usage () { echo "Usage:`basename $0` (start|stop)" exit 1 } if [ $# -ne 1 ];then Usage fi case $1 in start) echo "reparing for Real Server" echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce echo "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $BROADCAST up /sbin/route add -host $VIP dev lo:0 ;; stop) /sbin/ifconfig lo:0 down echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_announce echo "stop Real Server" ;; *) Usage esac