注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

冷月寒星

 
 
 

日志

 
 

用DNS+VIP方式构建高可靠NGINX前端  

2010-09-07 14:14:46|  分类: 网站架构 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1,环境描述
        用户访问域名:www.zushou365.com,通过DNS轮询的方式分配给前端两台nginx 反向代理机器!当其中一台机器异常时,保证业务的不断流,在很短的时间内由正常的机器进行业务接管!这样既能让两台机器同时工作,又能达到故障转移,通过DNS轮询也能达到一定程序上的负载均衡,比其他HA的方法节省了资源,提高了集群的可用性的同时也能满足高可靠性的需求!
(本实验参考张宴老师的 <实战nginx  取代Apache 的高性能web服务器> 部分章节)
实验环境拓扑图如下(物理IP指的是物理网卡上配置的IP地址):
用DNS+VIP方式构建高可靠NGINX前端 - lai66192 - 冷月寒星
2,配置相关
1,
www.zushou365.com通过DNS轮询的方式解析到192.168.1.23 ,192.168.1.24
 如下图:
用DNS+VIP方式构建高可靠NGINX前端 - lai66192 - 冷月寒星
2,初使化配置,服务器192.168.1.21(
nginx_1)
配置虚以IP为192.168.1.23 ,
服务器192.168.1.22(
nginx_2)
配置虚拟IP为:192.168.1.24 .在192.168.1.21上执行:
/sbin/ifconfig eth0:1 192.168.1.23 broadcast 192.168.1.255 netmask 255.255.255.0 up
/sbin/route add -host 192.168.1.23 dev eth0:1
/sbin/arping -I eth0 -c 3 -s 192.168.1.23 162.168.1.1
在192.168.1.22上执行:
/sbin/ifconfig eth0:1 192.168.1.24 broadcast 192.168.1.255 netmask 255.255.255.0 up
/sbin/route add -host 192.168.1.24 dev eth0:1
/sbin/arping -I eth0 -c 3 -s 192.168.1.24 162.168.1.1

3,如果某台机器出现异常,这里我们假设服务器192.168.1.21(nginx_1)出现故障,
这时我们的拓扑图就变成如下:
用DNS+VIP方式构建高可靠NGINX前端 - lai66192 - 冷月寒星
这时候我们需要手动转移的操作是:
在192.168.1.22(nginx_2)上面执行:
/sbin/ifconfig eth0:2 192.168.1.23 broadcast 192.168.1.255 netmask 255.255.255.0 up
/sbin/route add -host 192.168.1.23 dev eth0:2
/sbin/arping -I eth0 -c 3 -s 192.168.1.23 162.168.1.1
这样我就完成了一次故障转移!所有用户都由正常的机器来接管,接下来就可以检查服务器192.168.1.21的故障原因了!
根据这个原理:我们可以写脚本在两台机器上互相检查对方是否服务正常!
脚本原理很简单,就是自动执行检查,然后出现故障则转移!
下面是脚本内容:
192.168.1.21脚本:
#/bin/bash
LANG=C
date=`date -d "today" +"%Y-%m-%d %H:%M:%S"` #获取时间,方便记录日志
nginx_ha1=192.168.1.23    #服务器192.168.1.21(nginx_1)的虚IP
nginx_ha2=192.168.1.24   #
服务器192.168.1.22(nginx_2)的虚IP
getway=192.168.1.1          #网关
netmask=255.255.255.0    #子网掩码
broadcast=192.168.1.255   #广播地址

#定义添加虚拟IP的方法
function_bind_vip1()
{
/sbin/ifconfig eth0:ha1 $nginx_ha1 broadcast $broadcast netmask $netmask up
/sbin/route add -host $nginx_ha1 dev eth0:ha1 
}

function_bind_vip2()
{
/sbin/ifconfig eth0:ha2 $nginx_ha2 broadcast $broadcast netmask $netmask up
/sbin/route add -host $nginx_ha2 dev eth0:ha2 
}

#重启nginx,如果是服务有故障,则可以程序自动重启后再检测
function_restart_nginx()
{
kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
}

#定义移除虚IP的方法
function_remove_vip1()
{
/sbin/ifconfig eth0:ha1 $nginx_ha1 broadcast $broadcast netmask $netmask down
}

function_remove_vip2()
{
/sbin/ifconfig eth0:ha2 $nginx_ha2 broadcast $broadcast netmask $netmask down
}

#定义发送ARP广播的方法
function_vip_arping1()
{
/sbin/arping -I eth0 -c 3 -s $nginx_ha1 $getway > /dev/null 2>&1
}

function_vip_arping2()
{
/sbin/arping -I eth0 -c 3 -s $nginx_ha2 $getway > /dev/null 2>&1
}
#定义报警方法
function_mail_send()
{
echo "192.168.1.22 is down" | mutt -s "The server is error!" 1501306835xx@139.com
}
#初使化
bind_time_vip1="N";
bind_time_vip2="N";

while true
do 
#检测本身和对方是否存活
httpcode_rip1=`/usr/bin/curl -o /dev/null -s -w %{http_code} http://$nginx_ha1`
httpcode_rip2=`/usr/bin/curl -o /dev/null -s -w %{http_code} http://$nginx_ha2`
if [ x$httpcode_rip1 == "x200" ];
then
if [ $bind_time_vip1 == "N" ]; #初使第一次执行
then
function_bind_vip1
function_vip_arping1
function_restart_nginx
bind_time_vip1="Y"
fi
function_vip_arping1 #如果自己存活,只需要定时发送ARP广播
else
if [ $bind_time_vip1 == "Y" ];     #如果不存活,并且初始值为Y,则移除本身的虚IP
then
function_remove_vip1
bind_time_vip1="N"
fi
fi
if [  x$httpcode_rip2 == "x200" ];  #检查对方的结果进行操作
then 
if [ $bind_time_vip2 == "Y" ];   #如果对方正常则不做操作
then
function_remove_vip2
bind_time_vip2="N"
fi
else
if [ $bind_time_vip2 == "N" ];  #如果对方异常,则执行业务的接管,把虚IP配置到本机来,并进行邮件报警给管理员!
then
function_bind_vip2
function_vip_arping2
bind_time_vip2="Y"
function_mail_send
fi
function_vip_arping2
fi
sleep 5 #每隔五秒执行一次脚本
done

#nohup /bin/sh ./nginx_ha1.sh 2>&1 >/dev/null & #把脚本放到192.168.1.21上后台执行

在192.168.1.22上面跑的脚本,
请把  
nginx_ha1=192.168.1.23        改成 : 
nginx_ha1=192.168.1.24
        
nginx_ha2=192.168.1.24        改成:
nginx_ha1=192.168.1.23

关于报警:
        报警可以采用大家平时统一的报警平台,比如cacti,nagos,hostmonit等,也可以使用出现故障就马上报警方的方法,直接报警!就如本例中采用的故障实时报警!
         报警方方法可以使用飞信直接发短信到手机,飞信报警方请参考:www.it-adv.net 
也可以使用邮箱报警,我这里采用的是邮箱发邮件到139邮箱,通过139邮箱设置发送短信到手机!
附上邮箱报警的配置脚本(mutt+msmtp):
 
#!/bin/bash
mkdir -p /dist/dist
cd /dist/dist
wget http://sourceforge.net/projects/msmtp/files/msmtp/1.4.21/msmtp-1.4.21.tar.bz2/download
tar jxvf msmtp-1.4.21.tar.bz2
cd msmtp-1.4.21
./configure --prefix=/usr/local/msmtp
make &&make install
cat > ~/.msmtprc <<EOF
# Set default values for all following accounts.
defaults
# The SMTP server of the provider.
account robot
host smtp.163.com
from huzhiyiemail@163.com
auth login
user huzhiyiemail@163.com
password yourpasswd
#Set a default account
account default : robot
EOF
yum -y install mutt
echo 'set sendmail="/usr/local/msmtp/bin/msmtp"' >>/etc/Muttrc
echo 'set editor="vi"' >>/etc/Muttrc
echo "you can test example:"
echo 'echo "test_text" | mutt -s "test_sub" tomail@mail.com'

 
 
  评论这张
 
阅读(1080)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018