现在的位置: 首页 > 综合 > 正文

lvs的安装和dr模式的配置脚本

2013年05月10日 ⁄ 综合 ⁄ 共 4721字 ⁄ 字号 评论关闭

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.    之后编译通过,makemakeinstall

 

其次是配置,我们延续上一次的配置

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

 

问题1arp_ignorearp_announce一定要更改么

首先来介绍下arp_ignore(官方配置这里就不说明,说下自己的理解)

0:当有人发送arp请求时,如果任何一个设备上面有这个ip,就响应arp请求,并且发送mac地址应答

(例如:我做了实验,在200eth0=192.168.30.200lo:0=192.168.30.149,如果arp_ignore0,那么从192.168.0.237发过来对192.168.30.149arp消息,200ech0也会相应,但是这个消息原本应该有LinuxDirector相应,这就导致的负载均衡的失效,所有的请求(不止是80端口),都会被192.168.30.200接受-------话说当初没有配置,这个问题也困扰了我好久好久)

1:当有人发送arp请求时,如果接受设备上面有这个ip,就响应arp请求(例如:对于上面的例子,如果设置arp_ignore1,那么即使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.1arp查询会回应())

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回应的网络接口来进行发送

问题2dr模式中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默认的eth0arp_ignorearp_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

 

 

 

抱歉!评论已关闭.