以脚本方式实现另类的高可用性方案(LVS-DR模型):
拓扑图
VIP
/ \
/ \
[lvs-master]eth1------eth1[lvs-salve]
eth0 \ / eth0
\ /
\ /
[SW交换机]
/ \
/ \
[web1] [web2]
lvs-master eth0:192.168.127.132 eth1:192.168.127.100 这里的eth1可以不设置ip地址,因为在这个方案里根本就没有心跳这一说
lvs-master eth0:192.168.127.133 eth1:192.168.127.101 这里的eth1也是可以不设置ip
web1 eth0:192.168.127.10
web2 eth0:192.168.127.11
此方案思路如下:lvs-master作为主服务器,lvs-salve作为从服务器,两服务器上都安装LVS套件,并分别测试可以正常工作。VIP这个IP作为一个浮动的ip地址,对外提供
www服务,正常情况下这个ip地址是配置在主服务器的eth0:0上的,但当主服务器出现故障,那VIP以及ipvsadm资源在合理的时间里都将转移到从服务器上继续提供服务,当
主服务器故障排除后也能将VIP和ipvsadm资源从从服务器上夺回来,由于centos6.0不能用yum来安装heartbeat,又在源代码编译安装时出现太多的问题,所以全部用脚本的方式
来实现这个方案。此方案各个脚本功能描述:
1、/etc/rc.d/init.d/lvs
这个脚本存在两服务器上,主要功能就是可以独立的开启LVS-DR模型,添加真实的web服务器到ipvsadm列表,使运行此脚本的服务器成为lvs服务器。
2、/etc/rc.d/init.d/lvscheckstart
这个脚本放在从服务器上,用来检测主服务器是否正常工作,如果主服务器的eth0这个网卡不能ping通,那就视为故障,那么这个脚本就将开启定义好的LVS功能来接替主服务器,
3、/etc/rc.d/init.d/lvscheckstop
这个脚本也放在从服务器上,用来检测主服务器的状态,如果主服务器故障后得到维护后,故障排除,那么从服务器就会关闭LVS以及配置的VIP,让主服务器来提供服务,而从服务
器又成为监视状态。
因为是通过脚本方式来达到高可用,得配合crontab来实现,技巧性也在这里,管理crontab时不可再用crontab -e这样的方式来管理,我们先在crontablist文件里写好规则,再用
crontab crontablist导入规则。当从服务器判断主服务器故障,得到相应资源为外提供服务后,lvscheckstart这个脚本就不应该在被crontab调用,而此时lvscheckstop这个脚本
才应该被crontab调用,
环境:
[root@lvs-master ~]# cat /etc/redhat-release
CentOS release 6.3 (Final)
检测核心是否支持ip_vs模块,没有挂载就挂载上
[root@lvs-master ~]# lsmod | grep ip_vs
[root@lvs-master ~]# modprobe ip_vs
[root@lvs-master ~]# lsmod | grep ip_vs
ip_vs 115490 0
libcrc32c 1246 1 ip_vs
ipv6 322541 30 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6
[root@lvs-master ~]# yum -y install ipvsadm 安装用户工具
用脚本来配置LVS
[root@lvs-master ~]# vi /etc/rc.d/init.d/lvs
#!/bin/bash
RIP1=192.168.127.10
RIP2=192.168.127.11
VIP1=192.168.127.254
/etc/rc.d/init.d/functions
case "$1" in
start)
echo "start LVS of DirectorServer"
#set the Virtual IP Address and sysctl parameter
/sbin/ifconfig eth0:0 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up
/sbin/route add -host $VIP1 dev eth0:0
echo "1" > /proc/sys/net/ipv4/ip_forward
#Clear IPVS table
/sbin/ipvsadm -C
#set LVS
#Web Apache
/sbin/ipvsadm -A -t $VIP1:80 -s rr
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP1: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 "Usgae: $0 {start|stop}"
exit1
esac
/etc/rc.d/init.d/functions这个文件在我centos6.3上安装好后是没有执行权限的,我直接chmod 755 /etc/rc.d/init.d/functions
这个脚本两服务器上同时存在!
在从服务器上得有lvscheckstart和lvscheckstop两个脚本,还有/root/crontabstartlvs和/root/crontabstoplvs两个文件,文件的位置随便
[root@lvs-slave ~]# vi /etc/rc.d/init.d/lvscheckstart
#!/bin/sh
RIP1=192.168.127.10
RIP2=192.168.127.11
VIP1=192.168.127.254
/etc/rc.d/init.d/functions
/bin/ping -c 4 192.168.127.132 >> /dev/null 2>&1
if [ "$?" = "0" ]
then
echo "lvs-master is runing"
else
echo "lvs-master is NOT runing"
echo "start LVS of DirectorServer"
#set the Virtual IP Address and sysctl parameter
/sbin/ifconfig eth0:0 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up
/sbin/route add -host $VIP1 dev eth0:0
echo "1" > /proc/sys/net/ipv4/ip_forward
#Clear IPVS table
/sbin/ipvsadm -C
#set LVS
#Web Apache
/sbin/ipvsadm -A -t $VIP1:80 -s rr
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP2:80 -g
#Run LVS
/sbin/ipvsadm
#reset crontab
/usr/bin/crontab /root/crontabstoplvs
fi
[root@lvs-slave ~]# vi /etc/rc.d/init.d/lvscheckstop
#!/bin/sh
RIP1=192.168.127.10
RIP2=192.168.127.11
VIP1=192.168.127.254
/etc/rc.d/init.d/functions
/bin/ping -c 4 192.168.127.132 >> /dev/null 2>&1
if [ "$?" = "0" ]
then
echo "lvs-master is runing"
echo "close LVS DirectorServer"
echo "0" > /proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ifconfig eth0:0 down
#reset crontab
/sbin/crontab /root/crontabstartlvs
else
echo "lvs-master is NOT runing"
fi
[root@lvs-slave ~]# cat /root/crontabstartlvs
*/1 * * * * date > /root/datenow #这个测试用的
*/1 * * * * /etc/rc.d/init.d/lvscheckstart
[root@lvs-slave ~]# cat /root/crontabstoplvs
*/1 * * * * date > /root/datenow
*/1 * * * * /etc/rc.d/init.d/lvscheckstop
在计划任务中我设置每分钟就调用一次相应的脚本
现在转到realserver上,在192.168.127.10这服务器上
[root@web1 ~]# vi /etc/rc.d/init.d/lvsrealserver
#!/bin/bash
#description start realserver
VIP1=192.168.127.254
/etc/rc.d/init.d/functions
case "$1" in
start)
echo "start LVS of realserver"
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 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up
/sbin/route add -host $VIP1 dev lo:0
;;
stop)
echo "close LVS realserver"
/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 "Usage:$0 {start|stop}"
exit 1
esac
这个脚本在各个web服务器都是相同的,主要的目的就是禁用arp,配置VIP
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore 一共四行,目的是关闭arp响应,不然在lvs-master上和web1上都配置了VIP地址会导致IP冲突的。
这套系统的使用方法如下:
首先启动lvs-master上的lvs脚本(/etc/rc.d/init.d/lvs start),再启动web1与web2上的lvsrealserver脚本(/etc/rc.d/init.d/lvsrealserver start),
为了达到lvs的高可用,启用lvs-slave上的计划任务,即crontab /root/crontabstartlvs,这时从服务器就开始每一分钟调用/etc/rc.d/init.d/lvscheckstart
这个脚本来检测lvs-master的状态,如果发现有故障后,马上执行脚本的内容,接替主服务的业务,转换时间能控制在2分钟内。当主服务器故障排除后又能把资源
交给主服务器。
在判断主服务器是否故障有多种方法,我这里就用了ping了得次,如果ping不通了就认为主服务器已经故障,如果主服务器出现间隙的故障,一会ping得,一会ping
不通,那么从服务就在不断的切换,最终也不能对外提供服务,这种情况下,我是这样想的,可以在从服务器的监测脚本上用ssh命令远程执行一个ifdown命令,让
主服务器的eth0停掉,我想到的是这样的思路,希望能抛砖引玉,可以把这个方案更加完善!