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 $*