shell脚本配合VIP转移的自配高可用策略

主机环境 rhel6.5

nginx1 172.25.254.11

nginx2 172.25.254.12

具体架构如下


142156_tV5h_2342806.png



142038_bMW9_2342806.png

出现故障VIP转移到另一台机子即可!~~~~~~~~~~~~~~~~ 配合DNS轮询的高可用

脚本思想:

定义函数绑vip,解除vip

首先用一个无限循环无限检测nginx主机是否正常,正常给他绑上自己的vip,绑定过后我们把他的标记1修改为y(本来是n),如果是不正常的,且标记是y意味着绑过vip,那移除他的vip并且把标记1设为n。

下来又进入判断,判断副机nginx是否正常,如果布正常,且是默认标记2为n,那么我们给主机绑上副机的vip。并且标记2设为y.如果副机正常了,并且我们是绑定过vip2的(通过标记2判断),那么移除vip2。。 后台运行脚本无限循环的去检测

172.25.254.11上  运行脚本


#########################################################################
# File Name: dtykeepalive.sh
# Author: dty
# mail: 576786031@qq.com
# Created Time: Sun 09 Aug 2015 10:40:39 AM CST
#########################################################################
#!/bin/bash
vip1=172.25.254.100
vip2=172.25.254.101
BIND_VIP1(){
    ifconfig eth0:1 $vip1 netmask 255.255.255.0 up
    
}
BIND_VIP2(){

    ifconfig eth0:2 $vip2 netmask 255.255.255.0 up
}
REMOVE_VIP1(){

    ifconfig eth0:1 $vip1 netmask 255.255.255.0 down
}
REMOVE_VIP2(){

    ifconfig eth0:2 $vip2 netmask 255.255.255.0 down
}
RESTART_NGINX(){
    kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
}
bind_time_vip1="n"
bind_time_vip2="n"

while :
do

httpcode_rip1=`curl -o /dev/null -s -w  %{http_code} 172.25.254.11`
httpcode_rip2=`curl -o /dev/null -s -w  %{http_code} 172.25.254.12`
if [ x$httpcode_rip1 == "x200" ];then 
    if [ $bind_time_vip1 == "n" ];then
        BIND_VIP1
        RESTART_NGINX
        bind_time_vip1=y
    fi
else
    if [ $bind_time_vip1 == "y" ];then
        REMOVE_VIP1
        bind_time_vip1=n
   fi
fi

if [ "x$httpcode_rip2" == "x200" ];then
        if [ $bind_time_vip2 == "y" ];then
        REMOVE_VIP2
        bind_time_vip2=n
        fi
else
    if [ $bind_time_vip2 == "n" ];then
        BIND_VIP2
        RESTART_NGINX
        bind_time_vip2=y
    fi
fi
sleep 5
done

现在对其中这些循环进行解释

if [ x$httpcode_rip1 == "x200" ];then  //首先判断了nginx1即本机的nginx是否正常
    if [ $bind_time_vip1 == "n" ];then 正常,并且bind_time_vip1 == "n"的话就给他加上vip1,我们开始设定了n,所以第一次nginx正常就会成功绑定vip
        BIND_VIP1
        RESTART_NGINX
        bind_time_vip1=y //注意,绑定过后我们用bind_time_vip1=y作为绑定过的标记,表示被绑过vip1了
    fi
else
    if [ $bind_time_vip1 == "y" ];then //如果nginx1即本机的nginx连接失败,且之前绑定过vip1
        REMOVE_VIP1
        bind_time_vip1=n
   fi    //删除了本机的vip
fi

if [ "x$httpcode_rip2" == "x200" ];then //判断连接nginx2是否正常,如果正常,下面这个判断初始的时候我们设过bind_time_vip2=n,因此不做判断,也就是什么没做。
,如果我们之前绑定过了vip2,我们要把他去掉,因为nginx2正常,我们要他自己绑vip2
     if [ $bind_time_vip2 == "y" ];then
        REMOVE_VIP2
        bind_time_vip2=n
        fi
else
    if [ $bind_time_vip2 == "n" ];then //如果nginx2不正常且$bind_time_vip2 == "n" 即初始状态的设定,我们给他绑定vip2,因为是轮询的vip,我们得到vip了,
    d就把对nginx的访问都弄到了本机上
        BIND_VIP2
        RESTART_NGINX
        bind_time_vip2=y
    fi
fi

下面脚本是server2上的只是微小的改动。原理同上,还需要自己仔细想像,这个逻辑很美~~                                     原作者张宴就是NB!!!

172.25.254.12运行脚本

#########################################################################
# File Name: dtykeepalive.sh
# Author: dty
# mail: 576786031@qq.com
# Created Time: Sun 09 Aug 2015 10:40:39 AM CST
#########################################################################
#!/bin/bash
vip1=172.25.254.101
vip2=172.25.254.100
BIND_VIP1(){
    ifconfig eth0:1 $vip1 netmask 255.255.255.0 up
    
}
BIND_VIP2(){

    ifconfig eth0:2 $vip2 netmask 255.255.255.0 up
}
REMOVE_VIP1(){

    ifconfig eth0:1 $vip1 netmask 255.255.255.0 down
}
REMOVE_VIP2(){

    ifconfig eth0:2 $vip2 netmask 255.255.255.0 down
}
RESTART_NGINX(){
    kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
}
bind_time_vip1="n"
bind_time_vip2="n"
while :
do
httpcode_rip1=`curl -o /dev/null -s -w  %{http_code} 172.25.254.11`
httpcode_rip2=`curl -o /dev/null -s -w  %{http_code} 172.25.254.12`
if [ x$httpcode_rip2 == "x200" ];then
    if [ $bind_time_vip1 == "n" ];then
        BIND_VIP1
        RESTART_NGINX
        bind_time_vip1=y
    fi
else
    if [ $bind_time_vip1 == "y" ];then
        REMOVE_VIP1
        bind_time_vip1=n
   fi
fi

if [ "x$httpcode_rip1" == "x200" ];then
        if [ $bind_time_vip2 == "y" ];then
            REMOVE_VIP2
        bind_time_vip2=n
        fi
else
    if [ $bind_time_vip2 == "n" ];then
        BIND_VIP2
        RESTART_NGINX
        bind_time_vip2=y
    fi
fi
sleep 5
done


下面展示测试效果,实际应用我们两个nginx应该是完全相同的,这里我们用不一样的主页和 ip 显示出效果。

启动nginx

143325_Tq51_2342806.png

分别后台运行脚本

143325_gssK_2342806.png

可以看出脚本已经自动配好 vip

143326_2V5W_2342806.png

关闭nginx1的nginx,同时发现其 vip没了

143327_3HUP_2342806.png

此时nginx2有两个vip,其中一个是nginx1上的地址

 143610_HZpq_2342806.png

访问web ,注意我已经提前搭好了dns,设定了dty.org   可以解析到两个 vip



143328_uAtT_2342806.png

然后我们再次开启nginx1主机的nginx服务,看出vip又回来了~~~~~

143329_EPZY_2342806.png

ok正常访问

143329_TczB_2342806.png

~~~~~~~~~


                                                                   完结



转载于:https://my.oschina.net/loveleaf/blog/489756

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值