针对web服务器容灾自动切换方案

http://toptree.iteye.com/blog/1735324



我们网站的XX服务随着业务的增长我们需要配置跨IDC容灾情况,为了处理突发事件,避免影响网站的正常访问。自己在网上看了很多处理方法,结合自己的实际情况,我自己也在在局域网的测试服务器上演练了一把。


测试结果表现良好,现在把我在局域网中的部署整理如下:


思路:

当服务器A 发生故障,服务器B可以迅速接管服务器A的任务,不影响用户的正常访问。

当服务器A 故障恢复,服务器A可以马上接管服务器B的任务,服务器B恢复备机状态。


做法:

两台服务器上配置一个虚拟IP地址,主服务器先绑定虚拟ip地址,当发生故障时,备机自动接管虚拟ip地址,刷新网关路由地址。当主机恢复后,备机释放虚拟ip地址,主机再次主动接管虚拟ip地址,刷新网关路由地址。


结构图:

针对web服务器容灾自动切换方案 - ffwangkun@126 - 永恒的瞬间


主服务器:ip 192.168.190.199

备服务器: ip 192.168.190.208


vip:192.168.190.88

gateWay=192.168.190.254

netMask=255.255.255.0

bcast=192.168.190.255


步骤:

1、配置虚拟ip:192.168.190.88 到 www.test.com 绑定虚拟ip

Shell代码   收藏代码
  1. /sbin/ifconfig eth0:1 192.168.190.88 broadcast 192.168.190.255    
  2. netmask 255.255.255.0  up  
  3. /sbin/route add -host 192.168.190.88 dev eth0:1  



2、刷新网关路由

Shell代码   收藏代码
  1. /sbin/arping -i eth0 -s 192.168.190.88  192.168.190.254 > /dev/null 2>&1  



3、当发生故障时,主机192.168.190.199 ,释放虚拟ip192.168.190.88,备机192.168.190.208接管 虚拟ip192.168.190.88

Shell代码   收藏代码
  1. /sbin/ifconfig eth0:1 192.168.190.88  broadcast  192.168.190.255   netmask 255.255.255.0 down          
  2. /sbin/arping -i eth0 -s 192.168.190.88  192.168.190.254 > /dev/null 2>&1  



3、这时 www.test.com 解析到了备机服务器192.168.190.208


4、重启备机web服务器


5、若主机192.168.190.199服务恢复正常,备机192.168.190.208释放虚拟IP,主机

绑定虚拟IP 192.168.190.88

备机释放虚拟ip:

Shell代码   收藏代码
  1. /sbin/ifconfig eth0:1 192.168.190.88  broadcast  192.168.190.255   netmask 255.255.255.0 down          
  2. /sbin/arping -i eth0 -s 192.168.190.88  192.168.190.254 > /dev/null 2>&1  



6、重启启动主备机web服务


主机192.168.190.199

autoSwitchMain.sh切换脚本

Shell代码   收藏代码
  1. #!/bin/sh  
  2. #############################################################  
  3. #desc:服务器宕机自动切换服务  
  4. #author:gaozhonghui  
  5. #mail:toptreegzh@163.com  
  6. #date:20121101  
  7. #############################################################  
  8.   
  9. vip=192.168.190.88  
  10. gateWay=192.168.190.254  
  11. netMask=255.255.255.0  
  12. bcast=192.168.190.255  
  13.   
  14. function_bind_vip1(){  
  15. /sbin/ifconfig eth0:1 {vip}&nbsp;broadcast&nbsp; {vip}&nbsp;broadcast&nbsp; {bcast}  netmask {netMask}&nbsp;up&nbsp;&nbsp;</span></span></li><li><span>/sbin/route&nbsp;add&nbsp;-host&nbsp; {netMask}&nbsp;up&nbsp;&nbsp;</span></span></li><li><span>/sbin/route&nbsp;add&nbsp;-host&nbsp; {vip} dev eth0:1  
  16. }  
  17.   
  18. function_remove_vip1(){  
  19. /sbin/ifconfig eth0:1 {vip}&nbsp;broadcast&nbsp; {vip}&nbsp;broadcast&nbsp; {bcast}  netmask {netMask&nbsp;down&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>function_vip_arping1(){&nbsp;&nbsp;</span></li><li><span>/sbin/arping&nbsp;-i&nbsp;eth0&nbsp;-s&nbsp;${vip}&nbsp;${gateWay}&nbsp;&gt;&nbsp;/dev/null&nbsp;<span>2</span><span>&gt;&amp;</span><span>1</span><span>&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>function_restart_nginx(){&nbsp;&nbsp;</span></li><li><span>/web/webserver/nginx/sbin/nginx&nbsp;-s&nbsp;reload&nbsp;&nbsp;</span></li><li><span>}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>bind_time_vip=<span>"N"</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li><span>while&nbsp;true&nbsp;&nbsp;</span></li><li><span>do&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;httpCode_rip1=`/usr/bin/curl&nbsp;-o&nbsp;/dev/null&nbsp;-s&nbsp;-w&nbsp;%{http_code}&nbsp;http://<span>192.168</span><span>.</span><span>190.199</span><span>`&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[&nbsp;x {netMask&nbsp;down&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>function_vip_arping1(){&nbsp;&nbsp;</span></li><li><span>/sbin/arping&nbsp;-i&nbsp;eth0&nbsp;-s&nbsp;${vip}&nbsp;${gateWay}&nbsp;&gt;&nbsp;/dev/null&nbsp;<span>2</span><span>&gt;&amp;</span><span>1</span><span>&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>function_restart_nginx(){&nbsp;&nbsp;</span></li><li><span>/web/webserver/nginx/sbin/nginx&nbsp;-s&nbsp;reload&nbsp;&nbsp;</span></li><li><span>}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>bind_time_vip=<span>"N"</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li><span>while&nbsp;true&nbsp;&nbsp;</span></li><li><span>do&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;httpCode_rip1=`/usr/bin/curl&nbsp;-o&nbsp;/dev/null&nbsp;-s&nbsp;-w&nbsp;%{http_code}&nbsp;http://<span>192.168</span><span>.</span><span>190.199</span><span>`&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[&nbsp;x {httpCode_rip1} == ”x200” ];  
  20.     then  
  21.         if [ {bind_time_vip}&nbsp;==&nbsp;<span>"N"</span><span>&nbsp;];&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function_bind_vip1&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function_vip_arping1&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind_time_vip=<span>"Y"</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function_vip_arping1&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[&nbsp; {bind_time_vip}&nbsp;==&nbsp;<span>"N"</span><span>&nbsp;];&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function_bind_vip1&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function_vip_arping1&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind_time_vip=<span>"Y"</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function_vip_arping1&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[&nbsp; {bind_time_vip} == ”Y” ]  
  22.         then  
  23.             function_remove_vip1  
  24.             bind_time_vip=”N”  
  25.         fi  
  26.     fi  
  27.     sleep 10  
  28. done  



然后linux 启动守候进程

/usr/bin/nohup /bin/sh  /home/Gzh/shell/ autoSwitchMain.sh   2>&1 > /dev/null &


备机192.168.190.208:

autoSwitchSlave.sh

Shell代码   收藏代码
  1. #!/bin/sh  
  2. #############################################################  
  3. #desc:服务器宕机自动切换服务  
  4. #author:gaozhonghui  
  5. #mail:toptreegzh@163.com  
  6. #date:20121101  
  7. #############################################################  
  8.   
  9. vip=192.168.190.88  
  10. gateWay=192.168.190.254  
  11. netMask=255.255.255.0  
  12. bcast=192.168.190.255  
  13.   
  14. function_bind_vip1(){  
  15. /sbin/ifconfig eth0:1 {vip}&nbsp;broadcast&nbsp; {vip}&nbsp;broadcast&nbsp; {bcast}  netmask {netMask}&nbsp;up&nbsp;&nbsp;</span></span></li><li><span>/sbin/route&nbsp;add&nbsp;-host&nbsp; {netMask}&nbsp;up&nbsp;&nbsp;</span></span></li><li><span>/sbin/route&nbsp;add&nbsp;-host&nbsp; {vip} dev eth0:1  
  16. }  
  17.   
  18. function_remove_vip1(){  
  19. /sbin/ifconfig eth0:1 {vip}&nbsp;broadcast&nbsp; {vip}&nbsp;broadcast&nbsp; {bcast}  netmask {netMask}&nbsp;down&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>function_vip_arping1(){&nbsp;&nbsp;</span></li><li><span>/sbin/arping&nbsp;-i&nbsp;eth0&nbsp;-s&nbsp;${vip}&nbsp;${gateWay}&nbsp;&gt;&nbsp;/dev/null&nbsp;<span>2</span><span>&gt;&amp;</span><span>1</span><span>&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>function_restart_nginx(){&nbsp;&nbsp;</span></li><li><span>/web/webserver/nginx/sbin/nginx&nbsp;-s&nbsp;reload&nbsp;&nbsp;</span></li><li><span>}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>bind_time_vip=<span>"N"</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li><span>while&nbsp;true&nbsp;&nbsp;</span></li><li><span>do&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpCode_rip1=`/usr/bin/curl&nbsp;-o&nbsp;/dev/null&nbsp;-s&nbsp;-w&nbsp;%{http_code}&nbsp;http://<span>192</span><span>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>168.190</span><span>.</span><span>199</span><span>`&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[&nbsp;x {netMask}&nbsp;down&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>function_vip_arping1(){&nbsp;&nbsp;</span></li><li><span>/sbin/arping&nbsp;-i&nbsp;eth0&nbsp;-s&nbsp;${vip}&nbsp;${gateWay}&nbsp;&gt;&nbsp;/dev/null&nbsp;<span>2</span><span>&gt;&amp;</span><span>1</span><span>&nbsp;&nbsp;</span></span></li><li><span>}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>function_restart_nginx(){&nbsp;&nbsp;</span></li><li><span>/web/webserver/nginx/sbin/nginx&nbsp;-s&nbsp;reload&nbsp;&nbsp;</span></li><li><span>}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>bind_time_vip=<span>"N"</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li><span>while&nbsp;true&nbsp;&nbsp;</span></li><li><span>do&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;httpCode_rip1=`/usr/bin/curl&nbsp;-o&nbsp;/dev/null&nbsp;-s&nbsp;-w&nbsp;%{http_code}&nbsp;http://<span>192</span><span>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>168.190</span><span>.</span><span>199</span><span>`&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[&nbsp;x {httpCode_rip1} == ”x200” ];  
  20.         then  
  21.                 if [ {bind_time_vip}&nbsp;==&nbsp;<span>"Y"</span><span>&nbsp;];&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function_remove_vip1&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind_time_vip=<span>"N"</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function_vip_arping1&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[&nbsp; {bind_time_vip}&nbsp;==&nbsp;<span>"Y"</span><span>&nbsp;];&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function_remove_vip1&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind_time_vip=<span>"N"</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function_vip_arping1&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[&nbsp; {bind_time_vip} == ”N” ]  
  22.                 then  
  23.                         function_bind_vip1  
  24.                         function_vip_arping1  
  25.                         bind_time_vip=”Y”  
  26.                 fi  
  27.         fi  
  28.   
  29.         sleep 10  
  30. done  



启动守候进程

/usr/bin/nohup /bin/sh  /home/Gzh/shell/autoSwitchSlave.sh   2>&1 > /dev/null &


参考资料:

http://blog.s135.com/post/379/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值