<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[张宴的博客]]></title> 
<link>http://zyan.cc/index.php</link> 
<description><![CDATA[Web系统架构与底层研发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[张宴的博客]]></copyright>
<item>
<link>http://zyan.cc/post/379/</link>
<title><![CDATA[Nginx+PHP+MySQL双机互备、全自动切换方案[原创]]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[Web服务器]]></category>
<pubDate>Wed, 19 Nov 2008 15:20:00 +0000</pubDate> 
<guid>http://zyan.cc/post/379/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2008.11.19 转载请注明原文链接：<a href="http://blog.zyan.cc/post/379/" target="_blank">http://blog.zyan.cc/post/379/</a>]<br/><br/>　　在生产应用中，某台“Nginx+PHP+MySQL”接口数据服务器，扮演的角色十分重要，如果服务器硬件或Nginx、MySQL发生故障，而短时间内无法恢复，后果将非常严重。为了避免单点故障，我设计了此套方案，编写了failover.sh脚本，实现了双机互备、全自动切换，故障转移时间只需几十秒。<br/><br/>　　<strong>一、双机互备、全自动切换方案：</strong><br/>　　<strong>1、拓扑图：</strong><br/>　　<a href="http://zyan.cc/attachment/200811/nginx_php_mysql_ha.png" target="_blank"><img src="http://zyan.cc/attachment/200811/nginx_php_mysql_ha.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　<strong>2、解释：</strong><br/>　　(1)、假设外网域名blog.zyan.cc解析到外网虚拟IP 72.249.146.214上，内网hosts设置db10对应内网虚拟IP 192.168.146.214<br/><br/>　　(2)、默认情况下，由主机绑定内、外网虚拟IP，备机作为备份，当主机的MySQL、Nginx或服务器出现故障无法访问时，备机会自动接管内、外网虚拟IP。两台服务器都启动负责监控、自动切换虚拟IP的守护进程/usr/bin/nohup /bin/sh /usr/local/webserver/failover/failover.sh 2>&1 > /dev/null &<br/><br/>　　(3)、主机和备机上的MySQL服务器互为主从，互相同步。在主机处于活动状态（即由主机绑定虚拟IP）时，读写主机的MySQL，写到主机的数据会同步到备机；在备机处于活动状态时，读写备机的MySQL，写到备机的数据会同步到主机（如果主机上的MySQL死掉暂时无法同步，主机上的MySQL恢复后，数据会自动从备机上同步过来，反之亦然）。<br/><br/>　　(4)、主机处于活动状态时，每20秒会把/data0/htdocs/（网页、程序、图片存放目录）、/usr/local/webserver/php/etc/（php.ini等配置文件目录）、/usr/local/webserver/nginx/conf/（Nginx配置文件目录）三个目录下的文件通过rsync推送到备机服务器上的对应目录（增量推送，两台服务器上一样的文件不会重复推送），反之如果备机处于活动状态时，每20秒会尝试把文件推送到主机。rsync的配置文件见两台服务器的/etc/rsyncd.conf，rsync守护进程的启动命令为rsync --daemon<br/><br/>　　<strong>3、自动切换流程</strong><br/>　　(1)、主机默认绑定内、外网虚拟IP，当主机的MySQL、Nginx无法访问或服务器宕机，主机上的failover.sh守护进程会自动摘除自己绑定的内、外网虚拟IP（如果主机上的failover.sh死掉，无法摘除自己绑定的虚拟IP也没关系），备机上的failover.sh守护进程会自动接管备机原来绑定的内、外网虚拟IP，并发送ARPing包给内、外网网关更新MAC，强行接管。<br/><br/>............<br/><br/>Tags - <a href="http://zyan.cc/tags/linux/" rel="tag">linux</a> , <a href="http://zyan.cc/tags/php/" rel="tag">php</a> , <a href="http://zyan.cc/tags/mysql/" rel="tag">mysql</a> , <a href="http://zyan.cc/tags/nginx/" rel="tag">nginx</a> , <a href="http://zyan.cc/tags/ha/" rel="tag">ha</a>
]]>
</description>
</item><item>
<link>http://zyan.cc/post/379/#blogcomment2015</link>
<title><![CDATA[[评论] Nginx+PHP+MySQL双机互备、全自动切换方案[原创]]]></title> 
<author>xi2008wang &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 20 Nov 2008 00:53:50 +0000</pubDate> 
<guid>http://zyan.cc/post/379/#blogcomment2015</guid> 
<description>
<![CDATA[ 
	沙发, 先顶再看
]]>
</description>
</item><item>
<link>http://zyan.cc/post/379/#blogcomment2016</link>
<title><![CDATA[[评论] Nginx+PHP+MySQL双机互备、全自动切换方案[原创]]]></title> 
<author>sunix &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 20 Nov 2008 01:16:55 +0000</pubDate> 
<guid>http://zyan.cc/post/379/#blogcomment2016</guid> 
<description>
<![CDATA[ 
	顶你，学习+测试中...
]]>
</description>
</item><item>
<link>http://zyan.cc/post/379/#blogcomment2017</link>
<title><![CDATA[[评论] Nginx+PHP+MySQL双机互备、全自动切换方案[原创]]]></title> 
<author>jackie &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 20 Nov 2008 01:46:05 +0000</pubDate> 
<guid>http://zyan.cc/post/379/#blogcomment2017</guid> 
<description>
<![CDATA[ 
	学习，脚本写的不错，好文章!但是这个方案其实在实际环境中并不适用。有点浪费机器。真正在高可用的时候也不会采用这种方案。
]]>
</description>
</item><item>
<link>http://zyan.cc/post/379/#blogcomment2018</link>
<title><![CDATA[[评论] Nginx+PHP+MySQL双机互备、全自动切换方案[原创]]]></title> 
<author>jason &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 20 Nov 2008 02:03:58 +0000</pubDate> 
<guid>http://zyan.cc/post/379/#blogcomment2018</guid> 
<description>
<![CDATA[ 
	要rsync的目录文件不多？如果多的话，读取文件列表也不只20秒了...累积起来会很多个同时开着了
]]>
</description>
</item><item>
<link>http://zyan.cc/post/379/#blogcomment2021</link>
<title><![CDATA[[评论] Nginx+PHP+MySQL双机互备、全自动切换方案[原创]]]></title> 
<author>joecen &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 20 Nov 2008 06:29:18 +0000</pubDate> 
<guid>http://zyan.cc/post/379/#blogcomment2021</guid> 
<description>
<![CDATA[ 
	hi，张宴。脚本写得不错，我在里面也找到几个不熟悉的知识点，增长了知识。<br/>只是有一点问题我觉得必须要指出的，感觉两台机器切换的条件有点草率。你只对服务，也就是http和mysql进行判断，从而进行是否切换的操作不是很妥当。<br/>如果一个服务负载比较高，出现回应缓慢或者没有回应是很正常的事情，如果一监测到没有回应就进行切换，很容易会变成互相争IP的情况。<br/>我记得BipIP之类的商业级的机器，两台机器之间会用串口线来做一条heart line，用来判断对方是否有死机。<br/>当然你不必这样，但也可以进行多次判断，或者对主机层面进行判断是否有问题。
]]>
</description>
</item><item>
<link>http://zyan.cc/post/379/#blogcomment2022</link>
<title><![CDATA[[评论] Nginx+PHP+MySQL双机互备、全自动切换方案[原创]]]></title> 
<author>steven &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 20 Nov 2008 08:18:16 +0000</pubDate> 
<guid>http://zyan.cc/post/379/#blogcomment2022</guid> 
<description>
<![CDATA[ 
	张兄你好。你这上拓扑图是拿什么工具画的。
]]>
</description>
</item><item>
<link>http://zyan.cc/post/379/#blogcomment2025</link>
<title><![CDATA[[评论] Nginx+PHP+MySQL双机互备、全自动切换方案[原创]]]></title> 
<author>joecen &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 20 Nov 2008 09:54:22 +0000</pubDate> 
<guid>http://zyan.cc/post/379/#blogcomment2025</guid> 
<description>
<![CDATA[ 
	不好意思。由于事前不知道在你这里留言的话邮箱会显示出来，所以留了邮箱。为了避免不必要的spam，麻烦博主将我刚才留言的邮箱去掉吧。thx～
]]>
</description>
</item><item>
<link>http://zyan.cc/post/379/#blogcomment2028</link>
<title><![CDATA[[评论] Nginx+PHP+MySQL双机互备、全自动切换方案[原创]]]></title> 
<author>lphy &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 20 Nov 2008 12:21:31 +0000</pubDate> 
<guid>http://zyan.cc/post/379/#blogcomment2028</guid> 
<description>
<![CDATA[ 
	Mysql瞬间压力大的会导致mysql无响应，会有误判吧？
]]>
</description>
</item><item>
<link>http://zyan.cc/post/379/#blogcomment2032</link>
<title><![CDATA[[评论] Nginx+PHP+MySQL双机互备、全自动切换方案[原创]]]></title> 
<author>ShiningRay &lt;tsowly@hotmail.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Fri, 21 Nov 2008 06:56:56 +0000</pubDate> 
<guid>http://zyan.cc/post/379/#blogcomment2032</guid> 
<description>
<![CDATA[ 
	为何不使用heartbeat？
]]>
</description>
</item><item>
<link>http://zyan.cc/post/379/#blogcomment2034</link>
<title><![CDATA[[评论] Nginx+PHP+MySQL双机互备、全自动切换方案[原创]]]></title> 
<author>RADISH &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Fri, 21 Nov 2008 09:23:37 +0000</pubDate> 
<guid>http://zyan.cc/post/379/#blogcomment2034</guid> 
<description>
<![CDATA[ 
	脚本功夫不错，不过这个架构不怎么实用！！
]]>
</description>
</item><item>
<link>http://zyan.cc/post/379/#blogcomment2036</link>
<title><![CDATA[[评论] Nginx+PHP+MySQL双机互备、全自动切换方案[原创]]]></title> 
<author>ttplay &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Fri, 21 Nov 2008 14:23:35 +0000</pubDate> 
<guid>http://zyan.cc/post/379/#blogcomment2036</guid> 
<description>
<![CDATA[ 
	张兄, 麻烦你讲一下mysql互备好吗? 我google了, 但网上的讲地都没你细, 看不明白了. 谢谢!
]]>
</description>
</item><item>
<link>http://zyan.cc/post/379/#blogcomment2038</link>
<title><![CDATA[[评论] Nginx+PHP+MySQL双机互备、全自动切换方案[原创]]]></title> 
<author>LEO &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Fri, 21 Nov 2008 19:33:00 +0000</pubDate> 
<guid>http://zyan.cc/post/379/#blogcomment2038</guid> 
<description>
<![CDATA[ 
	图文并茂，赞一个！<br/><br/>图是用什么软件做的，很清晰啊
]]>
</description>
</item><item>
<link>http://zyan.cc/post/379/#blogcomment2055</link>
<title><![CDATA[[评论] Nginx+PHP+MySQL双机互备、全自动切换方案[原创]]]></title> 
<author>johnathan &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Mon, 24 Nov 2008 07:15:20 +0000</pubDate> 
<guid>http://zyan.cc/post/379/#blogcomment2055</guid> 
<description>
<![CDATA[ 
	讲的很细,你开发的APMServ偶朋友在直在用.很好用的说.
]]>
</description>
</item><item>
<link>http://zyan.cc/post/379/#blogcomment2068</link>
<title><![CDATA[[评论] Nginx+PHP+MySQL双机互备、全自动切换方案[原创]]]></title> 
<author>huifeideluotuo &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Tue, 25 Nov 2008 03:47:40 +0000</pubDate> 
<guid>http://zyan.cc/post/379/#blogcomment2068</guid> 
<description>
<![CDATA[ 
	张兄，能具体说下mysql互相的方法吗，这个是最关键的地方
]]>
</description>
</item><item>
<link>http://zyan.cc/post/379/#blogcomment2071</link>
<title><![CDATA[[评论] Nginx+PHP+MySQL双机互备、全自动切换方案[原创]]]></title> 
<author>小奇 &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Tue, 25 Nov 2008 07:08:52 +0000</pubDate> 
<guid>http://zyan.cc/post/379/#blogcomment2071</guid> 
<description>
<![CDATA[ 
	我也是很想知道mysql互备
]]>
</description>
</item>
</channel>
</rss>