<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[网络医生]]></title> 
<description><![CDATA[]]></description>
<link>http://www.num123.com/</link>
<language>zh-cn</language>
<generator>www.emlog.net</generator>
<item>
	<title>LAMP架构双机热备完美解决方案</title>
	<link>http://www.num123.com/post/120</link>
	<description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp; 如下图，当主服务器出现故障时执行脚本解除虚拟IP的绑定，然后从服务器检测到主服务器出现故障后执行脚本接管虚拟IP并绑定，当主服务器恢复正常后，从服务器解除虚拟IP绑定，主服务器接管虚拟IP继续提供服务。</p>
<p>MySQL采用主从复制，程序文件、图片以及附件采用rsync+inotify的方式实时同步。</p>
<p><a id="ematt:189" href="/content/uploadfile/201204/6c279d5047b87aa3b33b779a6ff94d3d20120426082307.jpg" target="_blank"></a></p>
<p><a id="ematt:190" href="/content/uploadfile/201204/59c1170b4ee4b0a126fad06d33b22b0b20120426090409.jpg" target="_blank"><img border="0" alt="点击查看原图" src="/content/uploadfile/201204/thum-59c1170b4ee4b0a126fad06d33b22b0b20120426090409.jpg" /></a>&nbsp;</p>
<p><strong>主服务器脚本server.sh：</strong></p>
<p>#!/bin/sh</p>
<p>#作者：网络医生</p>
<p>#QQ： 76908265</p>
<p>#EMAIL:&nbsp; mail@num123.com</p>
<p>#BLOG:&nbsp;&nbsp; http://www.num123.com<br />
#根据apache和mysql的壮态来判断服务器的运行情况<br />
#如果apache和mysql的任何一个停止服务，则认为服务器down掉<br />
#定义变量HTTP_NUM变量判断apache的进程数量，为0则down掉<br />
#定义变量MYSQL_PORT变量，如果mysql监听的端口号消失，则down掉<br />
#定义IF_UP变量，判断是否继续执行配置虚拟IP并启用网卡接口命令,<br />
#如果IP配置成功就不在重复执行<br />
IF_UP="1"<br />
#定义IF_DOWN变量，判断是否继续执行关闭网卡接口命令<br />
#如果关闭成功，就不在重复执行关闭命令<br />
IF_DOWN="1"<br />
##############以下开始循环执行##########<br />
while true<br />
do<br />
&nbsp;&nbsp;&nbsp;&nbsp; HTTP_NUM=`ps -A|grep httpd|wc -l`<br />
&nbsp;&nbsp;&nbsp;&nbsp; MYSQL_PORT=`netstat -ant|grep LISTEN|grep 3306|awk '{print $4}'|awk -F ":" '{print $4}'`&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; if [ "$HTTP_NUM" == "0" -o "$MYSQL_PORT" != "3306" ];then<br />
&nbsp;if [ $IF_DOWN == "1" ];then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifconfig seth0:1 down<br />
&nbsp;&nbsp;&nbsp; /etc/init.d/httpd stop<br />
&nbsp;&nbsp;&nbsp; IF_UP="1"<br />
&nbsp;&nbsp;&nbsp; IF_DOWN="0"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi<br />
&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;if [ $IF_UP == "1" ];then<br />
&nbsp;&nbsp;&nbsp; ifconfig seth0:1 115.158.113.74 netmask 255.255.255.128 up<br />
&nbsp;&nbsp;&nbsp; arping -I seth0 -c 3 -s 115.158.113.74 115.158.113.1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF_UP="0"<br />
&nbsp;&nbsp;&nbsp; IF_DOWN="1"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi<br />
&nbsp;&nbsp;&nbsp;&nbsp; fi&nbsp;<br />
sleep 5<br />
done</p>
<p>#########################END##########################</p>
<p>推到后台执行 nohup&nbsp; sh server.sh &amp;</p>
<p><strong>备服务器脚本 slave.sh</strong></p>
<p>#!/bin/sh<br />
###################################<br />
# 作者：网络医生<br />
# QQ：76908265<br />
# EMAIL: mail@num123.com<br />
# 博客:&nbsp; http://www.num123.com<br />
##################################<br />
#此循环每5秒执行一次，如果发现主服务器的http壮态码返回不是200<br />
#就断定主服务器down掉，然后开始接管虚拟IP<br />
IF_UP="1"<br />
IF_DOWN="1"<br />
while true<br />
do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STATUS=`curl -s -I http://115.158.113.72|sed -n '1p'|awk '{print $2}'`<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if [ "$STATUS" != "200" ];then<br />
&nbsp; if [ "$IF_UP" == "1" ];then<br />
&nbsp;&nbsp;&nbsp;&nbsp; ifconfig seth0:1 115.158.113.74 netmask 255.255.255.128 up<br />
&nbsp;&nbsp;&nbsp;&nbsp; arping -I seth0 -c 3 -s 115.158.113.74 115.158.113.1<br />
&nbsp;&nbsp;&nbsp;&nbsp; IF_UP="0"<br />
&nbsp;&nbsp;&nbsp;&nbsp; IF_DOWN="1"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp; if [ "$IF_DOWN" == "1" ];then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifconfig seth0:1 down<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF_DOWN="0"<br />
&nbsp;&nbsp;&nbsp;&nbsp; IF_UP="1"<br />
&nbsp;&nbsp; fi <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi<br />
sleep 5<br />
done</p>
<p>#####################END###################</p>
<p>推到后台执行 nohup sh slave.sh &amp;</p>
<p><strong>说明：</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主服务器采用的是通过判断apache的进程和mysql监听的端口号来断定服务器壮态的，也可以采用其它方法，从服务器通过判断主服务器返回的http壮态码来断定主服务器壮态的，双机热备的方法很多，也可以采用keepalive等软件。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最重要的不是如何去写脚本和使用什么软件，关键在于解决问题的思路，只要思路清晰，解决问题的方法就会有很多种。上面的方案也可以修改成双主热备，但需要DNS的配合。</p>]]></description>
	<pubDate>Thu, 26 Apr 2012 08:15:47 +0000</pubDate>
	<author>网络医生</author>
	<guid>http://www.num123.com/post/120</guid>

</item></channel>
</rss>