共计 1873 个字符,预计需要花费 5 分钟才能阅读完成。
本篇文章为大家展示了怎么理解 Sersync 服务器同步程序项目与设计框架,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
本项目利用 inotify 与 rsync 对服务器进行实时同步,其中 inotify 用于监控文件系统事件,rsync 是目前广泛使用的同步算法,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。
目前使用的比较多的同步程序版本是 inotify-tools,另外一个是 google 开源项目 Openduckbill(依赖于 inotify-tools),这两个都是基于脚本语言编写的,其设计思路同样是采用 inotify 与 rsync 命令。相比较上面两个项目,本项目优点是:
1.sersync 是使用 c ++ 编写,而且对 linux 系统文件系统产生的临时文件和重复的文件操作进行过滤(我稍后会提到),所以在结合 rsync 同步的时候,节省了运行时耗和网络资源。因此更快。
2. 相比较上面两个项目,sersync 配置起来很简单: 在 http://code.google.com/p/sersync/downloads/list 处下载源码(分为 32 版本,与 64 位版本),其中 bin 目录下已经有我编译好的 2 进制文件,配合 bin 目录下的 xml 文件直接使用即可。
3. 另外本项目相比较其他脚本开源项目,使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。
4. 本项目自带出错处理机制,通过失败队列对出错的文件重新出错,如果仍旧失败,则每 10 个小时对同步失败的文件重新同步。
5. 本项目自带 crontab 功能,只需在 xml 配置文件中开启,即可按您的要求,隔一段时间整体同步一次。
6. 本项目自带 socket 与 http 协议扩展,满足您二次开发的需要。
基本架构:
设计简析
如上图所示,线程组线程是等待线程队列的守护线程,当队列中有数据的时候,线程组守护线程逐个唤醒,当队列中 inotify 事件交多的时候就会被全部唤醒一起工作。这样设计的目的是能够同时处理多个 inotify 事件,重发利用服务器的并发能力(核数 *2+2)。
之所以称之为线程组线程,是因为每个线程在工作的时候,会根据服务器的数量建立子线程,子线程可以保证所有的文件与各个服务器同时同步,当要同步的文件较大的时候,这样设计可以保证各个远程服务器可以同时获得要同步的文件。
服务线程的作用有三个,首先是处理同步失败的文件,将这些文件再次同步,对于再次同步失败的文件会生成 rsync_fail_log.sh 脚本,记录失败的事件。同时每隔 10 个小时执行脚本一次,同时清空脚本。服务线程的第三个作用是 crontab 功能,可以每隔一定时间,将所有路径整体同步一次。
过滤队列的建立是为了过滤短时间内产生的重复的 inotify 信息,例如在删除文件夹得时候,inotify 就会同时产生删除文件夹里的文件与删除文件夹得事件,通过过滤队列当删除文件夹事件产生的时候,会将之前加入队列的删除文件的事件全部过滤掉,这样只产生一条事件减轻了同步的负担。同时对于修改文件的操作的时候,会产生临时文件与重复操作。
举例:
当我们在 vi 的一个 test 文件,进行 wq 操作的时候会产生如下事件:
即使把 . 开头与 ~ 结尾的世界过滤了,对于 test 文件仍旧有 3 次操作,分别是删除,创建与保存,通过过滤队列,就只剩下一个事件,一定程度上也提高了效率。
过滤队列第二个作用,即当你在本机删除目录的时候,假设你删除一个有 5 个文件的目录,inotify 会产生 6 个事件,分别是 5 个文件删除事件,和一个删除目录事件,如果使用过滤队列,正常情况下会只产生一个删除目录的事件,大大减少了 rsync 通信次数。(当然,这不是绝对的。如果这 6 个事件分多次读到进入队列,那么可能还没来得及过滤,就已经被同步线程从队列中取走同步了。但一定程度上可以减少删除文件夹得同步通信次数)。
过滤队列的第三个作用,可以过滤监控目录下的文件夹,如果不想同步目录下的一些文件夹,或者一些后缀的文件。对于不需监控的子文件夹,在 inotify 启动时候 remove 掉监控,对于不需监控子文件,产生的文件事件就会从在入同步队列前过滤掉。如果使用 rsync 用 –exclude,这样虽然也可以过滤,但还是与 rsync 守护进程进行了一次交互。
上述内容就是怎么理解 Sersync 服务器同步程序项目与设计框架,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注丸趣 TV 行业资讯频道。