主机环境 rhel6.5
nginx1 172.25.254.11
nginx2 172.25.254.12
具体架构如下
出现故障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
分别后台运行脚本
可以看出脚本已经自动配好 vip
关闭nginx1的nginx,同时发现其 vip没了
此时nginx2有两个vip,其中一个是nginx1上的地址
访问web ,注意我已经提前搭好了dns,设定了dty.org 可以解析到两个 vip
然后我们再次开启nginx1主机的nginx服务,看出vip又回来了~~~~~
ok正常访问
~~~~~~~~~