镜像服务器文件实时监控同步程序
这是为我们网站解决南北电信网通互联互通问题而写的一个程序。
优游中国(www.yooyocn.com)是一个大型旅游门户网站,提供了资讯,视频,图片,博客,论坛等大数据量的业务内容。
为了使全国各地的网友都能够快速访问我们的网站,我们部署了三台服务器,一台双线主服务器,一台网通专线服务器,一台电信专线服务器。通过智能DNS解析,使网通的用户访问网通服务器,电信用户访问电信服务器。
而双线位于我们所在的城市,仅供我们网站编辑人员使用。因为我们的现状,双线就是双慢。所以,只只我们的编辑人员操作它上面的内容管理系统(CMS),把资讯,视频,图片上传到这台服务器上。然后,需要一个方法把双线主服务上新增加或修改的内容分发(也就是复制)到网通和电信的服务器,使网通电信用户都能看到同样的内容。
这就出来两个问题,一是同步,是增量同步,二是实时。
我花了很多时间寻找满足需求的工具。我记得在两年以前,镜像服务器应该是一个热门话题吧。这样的工具应该不少。但出乎意料,都是一些定时全部复制的软件。没有说是网站增加修改文件了,马上就可以同步到其它服务器上。例如,当初很流行的Update Now! ,2000年的东西,至今还有很多人在用。CuteFTP 8的文件同步功能,最少是每天运行一次,并且是遍历所有文件后把不同的文件FTP过去。
晚上和朋友郁闷地谈起这个事,他主要是做WinForm的,立马说.NET里有文件监控的类。可以实时获取增加或变更的文件。我大笑,好啊,正发愁呢!.NET的FTP类也很强,那就不如自己搞!第二天花一个上午,研究FileSystemWatcher。下午出个了DEMO,果然很强,就决定做。实现流程代码量并不多,一天半时间就搞定了,剩下三天都在解决其中的各种问题。在服务器上运行时,问题一个一个出现,被自以为完美地解决,高兴一会后,发现有更棘手问题出现…
程序主要实现了如下功能:
通过FileSystemWatcher实时监控指定的文件夹,取得文件夹下增加或修改的文件名,通过“NotifyFilters.Size”属性实现。它有很多属性,LastAccess,LastWrite,测试时把我搞得很糊涂,往这个文件夹下粘贴一个文件,会引发好几次这个事件。查了好久才明白,COPY操作确实是这样。但具体为啥,MSDN上也没说清。好在服务器上运行时没出现这个现象,也放过了。
捕获文件名后没有立即FTP,把文件信息放在了XML中,FTP从XML文件中读取文件名并上传,上传成功的信息移到另外的XML中。以上过程中的出现的异常也放在日志XML中。这个处理流程,也是我花了一晚上才想起来的。
所以,这个程序代码主要有三大块,一是监控,二是读写XML,三是FTP。
实现这些功能的代码并不多,不复杂,但我的收获不是程序本身,而是又一次体会到了编码时的快乐和乐趣。
在写这个程序时,参考了很多资料,很多网友写的代码。所以,当我也做出一些东西时,我把它开源出来,希望能让更多的人受益。
最后,这个程序到现在为止,虽然能运行,但它并未真正部署。因为,我们选择了更好的服务器架构解决方案,具体请看我的另一篇文章。
另外,这个程序还有很多遗憾没有解决,希望能够以此抛砖引玉,更多的人,做出更优秀的程序。
源码下载:/Files/xtigmh/FileSystemWatcher200801141016.rar