LVS:DR配置

LVS:DR配置
作者:Danbo 地址:http://www.cnblogs.com/danbo/p/4609202.html

安装LVS准备

1)、需要三台VM虚拟机数据库及memcache等负载均衡环境,并且三台主机都采用NAT模式。

特别提示:上面的环境为内部环境的负载均衡模式,即LVS服务是对内部业务的,如数据库及memcache等的负载均衡。

2)、web或web cache等负载均衡环境

特别提示:这个表格一般是提供web或web cache负载均衡的情况,此种情况特点为双网卡环境。这里把10.0.0.0/24假设为内网卡,192.168.128.0/24假设为外网卡。

这里我们为什么选192.168.128.0/24作为外网卡呢?这是为了方便大家环境搭配实验。

3)、实验拓扑图如下所示:

配置好简单的http服务

分别在两台RealServer安装apache服务,命令:yum -y install httpd
然后修改apache默认主页,方便后面我们做负载均衡时验证效果:
echo "Server1" >/var/www/html/index.html
echo "Server2" >/var/www.html/index.html
在RS1与RS2上使用命令:service httpd start启动apache服务器,然后用在netstat -lnt | grep 80查看apache是否成功启启动。

安装LVS

1)、下载相关软件包
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz

2)、安装lvs命令
lsmod | grep ip_vs
uname -r
ln -s /usr/src/kernels/2.6.18-406.el5-x86_64/ /usr/src/linux
如果没有源文件的话,说明缺少kernel-devel-2.6.18-398.e15,通过命令yum -y install kernel-devel
安装完毕后必须保证连接的版本与uname -r输出的版本一致。
tar -zxvf ipvsadm-1.24.tar.gz
cd ipvsadm-1.24
make   //必须安装gcc编译器:yum -y install gcc
make install
lsmod | grep ip_vs
此时发下并没有发现这个模组,需要执行/sbin/ipvsadm命令即在ip_vs到内核。
此时我们再lsmod | grep ip_vs

[root@Director ~]# lsmod | grep ip_vs
ip_vs                      122241   0
出现以上内容表示LVS已经安装完成,并加载到内核

手工添加LVS转发

1)、用户访问192.168.128.181这个步骤是在DNS配置

2)、在Director上配置LVS虚拟IP(VIP)
ifconfig eth0:0 192.168.128.181 netmask 255.255.255.0 up //注意我们启用别名的方式为:eth0:0-255都可以

3)、检查IP配置:

[root@Director ~]# ifconfig eth0:0
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:1B:C7:C9
inet addr:192.168.128.181 Bcast:192.168.128.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

4)、手工执行配置添加LVS服务器并增加两台Real Server
ipvsadm -C  //clear the whole table
ipvsadm --set 30 6 60
ipvsadm -A -t 192.168.128.181:80 -s wrr -p 20
ipvsadm -a -t 192.168.128.181:80 -r 192.168.128.131:80 -g -w 1
ipvsadm -a -t 192.168.128.181:80 -r 192.168.128.132:80 -g -w 1

删除方法:
ipvsadm -D -t 192.168.128.181:80 -s wrr
ipvsadm -d -t 192.168.128.181:80 -r 192.168.128.131:80

ipvsadm常用相关参数:
--clear           -C        clear the whole table
--add-service     -A        add virtual service with options
--tcp-service  -t service-address   service-address is host[:port]
--scheduler    -s scheduler         one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
--real-server  -r server-address    server-address is host (and port)
--masquerading -m                   masquerading (NAT)
--gatewaying   -g                   gatewaying (direct routing) (default)
--delete-server   -d        delete real server
--persistent   -p [timeout]         persistent service
--set tcp tcpfin udp        set connection timeout values
--weight          -w weight            capacity of real server
更多详细参数参考:ipvsadm --help

手工在RS端绑定VIP

在每台real server端执行:
ifconfig lo:0 192.168.128.181 netmask 255.255.255.255 up
route add -host 192.168.128.181 dev lo
每个集群节点上的lo设备上被绑定VIP地址(其广播地址是其本身,子网掩码是255.255.255.255,采取的VLSM方式把网段划分成只含有一个主机地址的目的是避免ip地址冲突)允许LVS-DR集群中的集群节点接受向该VIP地址的数据包,这会有一个非常严重的问题发生,集群内部的真是服务器将尝试回复来自正正在请求VIP客户端的ARP广播,这样所有的真是服务器都将声称自己拥有该VIP地址,这时客户端将直接发送请求数据包到真实服务器上,从而破坏了DR集群的方法,因此,必须要抑制真实服务器的ARP广播。

手工抑制ARP相应的方法

在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

arp抑制技术参数说明:
arp_ignore - INTEGER
0 -(默认值):回应任何网络接口上对任何本地IP地址的arp查询请求。
1 - 只回答目标IP地址是来访问网络接口本地地址的ARP查询请求。
2 - 只回答目标IP地址是来访问网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内。
3 - 部回应该网路界面的arp请求,而只最设置的唯一和连接地址作出回应。
4-7 - 保留未使用。
8 -  不回应所有(本地地址)的arp查询

arp_announce - INTEGER
对网络接口上,本地IP地址的发出的ARP回应,作出相应基本的限制:
确定不同程度的限制,宣布对来自本地源IP地址发出的ARP请求的接口
0 - (默认值):在任意网络接口上任何本地地址
1 - 尽量避免不在该网络接口子网段的本地地址做出arp回应,当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用。此时会检查来访IP是否为所有接口上的子网段内IP之一。如果该来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理。
2 - 对查询目标使用最适当的本地地址。在此模式将忽略这个IP数据包源地址并尝试选择与能与改地址通信的本地地址。首要是选择所有的网络接口的子网中包含该目标IP地址的本地地址。如果没有合适的地址被发发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送,限制了使用本地的VIP地址作为优先的网络接口。

测试结果

 

Shell脚本自动配置

  1 #!/bin/bash
  2 . /etc/init.d/functions
  3 VIP=192.168.128.181
  4 SUBNET=eth0: echo $VIP|cut -d  -f4
  5 PORT=80
  6 GW=192.168.128.2
  7 
  8 #w=3
  9 RIP1=(
 10 
 11             192.168.128.131
 12 
 13 )
 14 #w=1
 15 RIP2=(
 16 
 17              192.168.128.132
 18 
 19 )
 20 IFCONFIG=/sbin/ifconfig
 21 ROUTE=/sbin/route
 22 IPVSADM=/sbin/ipvsadm
 23 ARPING=/sbin/arping
 24 
 25 #functions
 26 function usage(){
 27 
 28              local script_name
 29              script_name $1
 30              echo "Usage:$script_name [ start | stop | restart ]"
 31              echo ""
 32              return 1
 33              return 0
 34 
 35 }
 36 
 37 function checkSubnet (){
 38 
 39              #judge if $SUBNET  is exit.
 40              if [ $(checkSubnet) $(SUBNET) -ne 0]; then
 41                              $IFCONFIG $SUBNET down
 42              fi
 43              local rs
 44              #$IFCONFIG $SUBNET $VIP broadcast $VIP netmask 255.255.255.255 up
 45              $IFCONFIG $SUBNET $VIP broadcast $VIP netmask 255.255.255.0 up
 46              #$ROUTE add -host $VIP dev $SUBNET
 47              $IPVSADM -C
 48              $IPVSADM -A -t $VIP:$PORT -s wrr -p 60
 49 
 50              for ((i=0; i< echo ${#RIP1[*]}; i++))
 51              do
 52                            $IPVSADM -a -t $VIP:$PORT -r ${RIP1[$i]}:$PORT -g -w 3
 53              done
 54 
 55              for ((i=0; i< echo ${#RIP2[*]}; I++))
 56              do
 57                            $IPVSADM -a -t $VIP:$PORT -r ${RIP2[$i]}:$PORT -g -w 1
 58              done
 59              rs=$?
 60              $IPVSAD >/uestc/log/ipvs.log
 61 
 62              #update MAC
 63              NetIf=$(echo ${SUBNET} | awk -F ":" '{print $1}')
 64              $ARPING -c 1 -I ${NetIf} -s $VIP $GW >>/uestc/log/ipvs.log
 65              [ $rs -eq 0 ] && action "Ipvsadm start." /bin/true
 66              return $rs
 67 }
 68 
 69 function ipvsStop(){
 70             local rs
 71             rs=1
 72             #clean ipvs
 73             #IFCONFIG $SUBNET down
 74             #IPVSADM -C
 75             #IPVSADM -Z
 76 
 77             rs=$?
 78             #$ROUTE del $VIP
 79             $ARPING -c 1 -I ${NetIf} -s $VIP $GW >/dev/null 2>&1
 80             [ $rs -eq 0 ] && action "Ipvsadm stoped." /bin/true
 81             return $rs
 82 }
 83 
 84 main ()
 85 {
 86                #judge argv num by danbo
 87                if [ $# -ne 1 ]; then
 88                                       usage $0
 89                fi
 90 
 91                case "$1" in
 92                           start)
 93                                       ipvsStart
 94                                       ;;
 95                           stop)
 96                                       ipvsStop
 97                                       ;;
 98                            restart)
 99                                       ipvsStop
100                                       ipvsStart
101                                       ;;
102 
103                             *)
104                                        usage $0
105                                       ;;
106                  esac
107 }
108 
109 $start operating
110 main $*

 

posted @ 2015-06-30 00:00  Danbocn  阅读(1154)  评论(0编辑  收藏  举报