以脚本方式实现另类的高可用性方案(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停掉,我想到的是这样的思路,希望能抛砖引玉,可以把这个方案更加完善!