如何实现镜像网站内容的同步

现在流行云计算,网格计算,分布式系统,网络系统。因为天气原因,国内的网站非常的不稳定,可能域名被停止解析或者无法解析,可能服务器所在的机房被停电或者服务器被关机抬走,而其中很多都是误操作,因为有人为的因素。那么怎么办呢?需要使用镜像技术。

现在的大的网站都是服务器集群,流量均衡,等等,他们自然有一套完整的方案。那么中小网站怎么办呢?

本人还未做过广泛调查,在此提出个人的浅见,抛砖引玉。

我们使用镜像技术来实现。前提:DNS必须稳定,因此要把DNS移到不经常刮风下雨的地方,比如美国的雨棚里;同时为了防止被排除在“域名白名单”之外,必须要进行域名网站的备案注册;最后且最重要的是,必须要遵守当地的法律法规,比如不能涉黄,比如不能政治反动政治敏感和企图颠覆国家政权、泄露国家机密等等,当权者不允许的,或者还没有获得许可的,不要做。我们要做的是在合法的前提下,防止人为因素的误操作,并给自己留下弥补失误的机会。

OK

一般来讲,静态页面镜像非常简单,只要把所有源文件和附件文件通过FTP上传到备份网站即可。但是对于动态页面就麻烦,它包括静态的源文件(包括图片等附件文件),动态的(用户动态上载的)附件文件,和数据库。静态源文件最简单,关键是动态附件文件和数据库的同步请注意,不是备份而是同步,备份很简单。什么是同步呢?比如有甲乙两个镜像站点互为备份要进行同步,在时间点1,二者一致,之后站点甲添加了项目A,修改了项目B,删除了项目C,而站点乙添加了项目X,修改了项目Y,删除了项目Z,需要在时间点2之前同步甲乙二站点,保证两个站点都添加了项目A,X,修改了项目B,Y,删除了项目C,Z。而且如果站点甲乙各自修改了同一样一个项目J,也要两个站点都能同步。

怎么实现?问题过于复杂,需要先简化。

首先,所谓同步,需要时间先同步

也就是说需要时间同步机制,可以使用互联网时间协议同步服务器的时间。不过有更简单的方法就是使用客户端本地的时间,作为主要的时间基准。

简单的将,就是根据服务器上的项目移到本地之后,以本地时间为准。现在多了个本地站点,以本地站点为基准,做起来就会非常的简单。

现在流行的网络架构是客户机/服务器两层模型结构,或者客户机/应用服务器/数据库服务器三层甚至更多层结构,而在应用服务器之前要有防火墙和流量均衡控制。数据库信息是最敏感最需要安全保护的,因此,千万不要尝试着不同站点的数据库之间进行直接的通讯同步,太危险(当然现在的分布式数据库除外,而我们还不能用他们)。这个时间服务器必须足够安全,不能放在经常下雨的地方。它可以是个服务器,也可以是你自己的笔记本,只要保证可靠即可。

其次,镜像服务器的服务和同步策略

学过操作系统我们知道多处理器处理分为非对称多处理和对称多处理SMP,当然对称多处理好,因为每个处理器都是相同的角色,如果有个处理器坏了,系统会自动重构。与之相比拟,我们的镜像站点之间应该也是对称多处理,即不区分谁是主服务器,谁是从服务器(刚才讲的时间服务器除外,它必须做主服务器)。服务器1坏了,服务器3马上顶上。怎么实现呢?利用域名服务器。前面讲过该域名服务必须足够可靠,不能放在风雨交加或者经常动不动就没有征兆刮风下雨的地方。例如Godwithus很与我们同在网站有四个镜像,其中一个是主站(当然这个不符合我们的规则,但是可以把主站作为时间服务器,其他三个服务器作为对称多处理SMP服务器)。主站如果Shutdown了那么没戏了。OK,我的四个域名 主站 http://godwithus.cc ,三个SMP服务器:美国站 http://us.godwithus.cc ,中国站 http://cn.godwithus.cc (http://www.godwithus.cn ),移动站 http://mobi.godwithus.cc (http://godwithus.mobi )。那么还有个首页http://www.godwithus.cc ,它实际上是指向三个SMP站点之一,哪个好指向哪个,哪个出问题了指向下一个。因此用户访问godwithus.cc或者www.godwithus.cc 应该总是能访问到服务的,除非它处在某个国家或者地区的“国域网”范围内或者他自己断网了。

第三,具体的同步方法

利用时间主服务器,一切都以他为基准。学过数据库的都知道,备份策略分为海量(整体)备份和增量备份;支持事务处理的DBMS往往要先写日志在写数据以保证ACID。时间服务器上的数据永远是一致的。在时间点1,所有的SMP服务器都和时间服务器一致,之后服务器甲乙各自修改了其内容,到了时间点2,需要同步了。

这里插一段,SMP很好,但是实现很复杂,还有个简单的方法就是采用主从结构,而这个主服务器是根据情况切换的。实现很简单,每到一个同步时刻,直接把主服务器上的源文件、附件和数据库数据复制到各个从服务器即可。它的缺点是会丢失从服务器上的修改数据,但是我们如果可以保证让从服务器上只读,而只让用户访问主服务器即可。例如,在时间段A,我的http://www.godwithus.cc 是指向 http://cn.godwithus.cc 的,这个时候大家都访问的http://cn.godwithus.cc ,修改的都在它上面,把它作为主服务器。某个时间以后,cn坏了,我就把http://www.godwithus.cc 指向http://us.godwithus.cc ,把它作为主服务器。当然时间服务器http://godwithus.cc 是我自己的,它不会坏。

那么SMP呢?比如让美国人访问美国服务器,电信用户访问电信服务器,联通用户访问联通服务器,而移动用户访问移动服务器,这样用户体验很好,因为速度快。它怎么实现呢?也很简单,在时间点2,按照顺序把每个SMP服务器与时间服务器的数据比较,产生差异数据DIFF,所有服务器的DIFF文件都产生好之后生成总体的DIFF,然后在恢复到各个SMP服务器去。

具体实现,如果是自己写代码很简单,每个表格除了ID字段之外,增加一个全局ID(GID)和全局时间(GTime),用来同步用,GID是全球唯一的,平时local的SMP服务器在添加字段的时候GID和GTIME字段是NULL,只有同步后才有了值。如果是使用商业工具护着开源工具,就不能修改其代码,必须要保证其可升级性。方法就是采用附加字段的方法。在这里我呼吁一下,大家尽量使用开源或者商业工具,比自己一个人写的代码好很多,问道有先后,树叶有专攻,人家一个大的开发团队,肯定别我们个人写的东西要好。我们在其工具的基础上修改,然而只修改其允许我们修改的地方,必须保证其兼容性和可升级性。例如对于Wordpress博客程序,我们可以来设计我们自己的主题模板,但是千万不要动其数据库的字段。

我们附加的数据库只存在于时间服务器上,只用作作于同步,目的就是给每个表格的记录增加GID和GTIME字段。我们其实只要建立一张表即可,它包括:SERVER_ID, DB_ID, TABLE_ID, RECORD_ID, GID, GTIME。相信其他的不需要我多说了。

第四,题外话

关于华人主内网站整合,我发现真的很难。因为没有人会愿意放弃自己的品牌和域名和自己辛辛苦苦开发和经营的程序及服务。但是我们必须要虚己,必须要首先看到现在需要的是什么,其次是我什么可以做到最好,然后再做,不要贪多自己什么都要做,也要学会放弃,选择其实就是放弃,为了神,生命都可以摆上祭坛,还有什么不可以放弃的呢?目的只有一个,“做”“好”该做的东西,且只做一件事但是要把它做到最好,然后再去做其他的。因此要让一个已有的网站来合作很难,看来只有新建立网站来实现,需要的是人,而真正做工的是神。

学过分布式处理的都知道,我们要使用松散耦合技术,比如我做搜索,谁的社区做得好而且跟我可以同工,我就和谁联合社区,谁的新闻做的好且可以和我同工,我就联合谁联合新闻,谁的博客做得好且可以和我同工,我就和谁联合博客,还有视频、音乐等等。一定要联合可以同工的,且要联合最好的。因为我自己不做这些,或者即使我做,我发现我做的没有人家做得好,我要放弃我自己的而使用其他的。还有一点就是一定要尽量利用现成的公共资源,千万不要凭着一腔热忱,搞个烧钱的视频服务器。我们要做人的同工和信息服务的整合。

 

说这么多,全是自己的虾想的,不对的地方肯定很多。抛砖引玉,希望各位拍砖。

你可能感兴趣的:(如何实现镜像网站内容的同步)