本项目利用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协议扩展,满足您二次开发的需要。
基本架构:

sersync+rsync数据同步_sersync+rsync数据同步


设计简析:

    如上图所示,线程组线程是等待线程队列的守护线程,当队列中有数据的时候,线程组守护线程逐个唤醒,当队列中inotify事件交多的时候就会被全部唤醒一起工作。这样设计的目的是能够同时处理多个inotify事件,重发利用服务器的并发能力(核数*2+2)。

    之所以称之为线程组线程,是因为每个线程在工作的时候,会根据服务器的数量建立子线程,子线程可以保证所有的文件与各个服务器同时同步,当要同步的文件较大的时候,这样设计可以保证各个远程服务器可以同时获得要同步的文件。

服务线程的作用有三个,首先是处理同步失败的文件,将这些文件再次同步,对于再次同步失败的文件会生成rsync_fail_log.sh脚本,记录失败的事件。同时每隔10个小时执行脚本一次,同时清空脚本。服务线程的第三个作用是crontab功能,可以每隔一定时间,将所有路径整体同步一次。

    过滤队列的建立是为了过滤短时间内产生的重复的inotify信息,例如在删除文件夹得时候,inotify就会同时产生删除文件夹里的文件与删除文件夹得事件,通过过滤队列当删除文件夹事件产生的时候,会将之前加入队列的删除文件的事件全部过滤掉,这样只产生一条事件减轻了同步的负担。同时对于修改文件的操作的时候,会产生临时文件与重复操作。

 举例:

当我们在vi的一个test文件,进行wq操作的时候会产生如下事件:

sersync+rsync数据同步_sersync+rsync数据同步_02

即使把"."开头与"~"结尾的世界过滤了,对于test文件仍旧有3次操作,分别是删除,创建与保存,通过过滤队列,就只剩下一个事件,一定程度上也提高了效率。

    过滤队列第二个作用,即当你在本机删除目录的时候,假设你删除一个有5个文件的目录,inotify会产生6个事件,分别是5个文件删除事件,和一个删除目录事件,如果使用过滤队列,正常情况下会只产生一个删除目录的事件,大大减少了rsync通信次数。(当然,这不是绝对的。如果这6个事件分多次读到进入队列,那么可能还没来得及过滤,就已经被同步线程从队列中取走同步了。但一定程度上可以减少删除文件夹得同步通信次数)。

    过滤队列的第三个作用,可以过滤监控目录下的文件夹,如果不想同步目录下的一些文件夹,或者一些后缀的文件。对于不需监控的子文件夹,在inotify启动时候remove掉监控,对于不需监控子文件,产生的文件事件就会从在入同步队列前过滤掉。如果使用rsync用--exclude, 这样虽然也可以过滤,但还是与rsync守护进程进行了一次交互。


架构图:

sersync+rsync数据同步_sersync+rsync数据同步_03

2.安装环境资源列表


sersync+rsync数据同步_sersync+rsync数据同步_04


2.2检查系统环境

cat /etc/redhat-release

检查内核版本  uname-r  检查系统位数 uname -m

2.3检查升级rsync到3.0

rrync --version | head -2    (如果没有安装可以用 yum install rsync -y 命令升级)


2.4.配置rsync的配置文件(这里要在168和169机器同时创建)

(这里系统不会自动生成,我这里要手动创建rsync.conf配置文件)

(配置文件中创建了3个实时同步的目录)

sersync+rsync数据同步_sersync+rsync数据同步_05


2.5创建三个同步目录

sersync+rsync数据同步_sersync+rsync数据同步_06

2.6.创建配置认证的权限

sersync+rsync数据同步_sersync+rsync数据同步_07

2.7.开启rsync的守护进程

sersync+rsync数据同步_sersync+rsync数据同步_08

sersync+rsync数据同步_sersync+rsync数据同步_092.8.rsync服务加入开机自启动服务

sersync+rsync数据同步_sersync+rsync数据同步_102.9.关闭rsync服务器

 pkill rsync

 rsync --deamon

 ps -ef |grep rsync


3.配置master167服务器上的rsync

3.1在master上配置rsync权限(这里配置的传输密码要和s1和s2一致)sersync+rsync数据同步_sersync+rsync数据同步_11

3.2.在master上创建同步的三个目录(www/bbs /www/blog www/www)

sersync+rsync数据同步_sersync+rsync数据同步_12

3.3手动执行同步测试(在这里我为了不影响测试,关闭ipabes防火墙 service iptables stop)


sersync+rsync数据同步_sersync+rsync数据同步_13

查看执行的结果:

sersync+rsync数据同步_sersync+rsync数据同步_14sersync+rsync数据同步_sersync+rsync数据同步_15


ok ,这里手动同步没啥问题 !!嘿嘿


4.开始部署在master上sersync 服务

软件的下载地址

mkdir -p /home/zzx/tools

cd /home/zzx/tools

wget http://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz

可以浏览 http://code.google.com/p/sersync/downloads/list

解压软件

tar -zxf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/

cd /usr/local/

mv GNU-Linux-x86 sersync


4.1 规范sersync的配置文件


cd /sersync

mkdir conf bin logs

mv confxml.xml conf

mv sersync2 bin/sersync

4.2 备份配置文件和修改配置文件

  ---/bin/cp/ conf/confxml.xml conf/confxml.xml.zzx.$(date+%F)


  ok  cp confxml.xml confxml.xml.zzx.$(date +%F)

(1)修改conf/confxml.xml(24行添加如下)

sersync+rsync数据同步_sersync+rsync数据同步_16

4.3 开启sersync的守护进程

sersync+rsync数据同步_sersync+rsync数据同步_17

4.4 启动sersync

sersync -r -d -o /usr/local/sersync/conf/confxml.xml

-r 同步复制 -d 后台启动 -o 指定配置文件 不指定是二进制文件

启动后产生的信息

sersync+rsync数据同步_sersync+rsync数据同步_18

sersync+rsync数据同步_sersync+rsync数据同步_19

在这里存在个小插曲啊!!(这里指同步了,www/www的目录有效)

sersync+rsync数据同步_sersync+rsync数据同步_20

查看是s1和s2的目录

sersync+rsync数据同步_sersync+rsync数据同步_21

为了解决这个问题,我们为每一个目录配置一个confing.xml(这里配置就是产生多实例的配置)

sersync+rsync数据同步_sersync+rsync数据同步_22分别为bbs_confxml.xml 、www_confxml.xml 、blog_confxml.xml 的配置文件不同同步目录

sersync+rsync数据同步_sersync+rsync数据同步_23


5.启动多实例的服务

为解决只同步www的问题分别创建多实例的配置文件

sersync -r -d -o /usr/local/sersync/conf/www_confxml.xml

sersync -r -d -o /usr/local/sersync/conf/bbs_confxml.xml

sersync -r -d -o /usr/local/sersync/conf/blog_confxml.xml


查看启动实例

sersync+rsync数据同步_sersync+rsync数据同步_24

sersync+rsync数据同步_sersync+rsync数据同步_25sersync+rsync数据同步_sersync+rsync数据同步_26sersync+rsync数据同步_sersync+rsync数据同步_27sersync+rsync数据同步_sersync+rsync数据同步_28


6.多实例配置文件放到/etc/rc.local中(这里不加-r)

/bin/cp /etc/rc.local/etc/rc.local_$(date+%F)

cat >>/etc/rc.local<<EOF

#sync data to 179 178

sersync -d -o /usr/local/sersync/conf/www_confxml.xml

sersync -d -o /usr/local/sersync/conf/bbs_confxml.xml

sersync -d -o /usr/local/sersync/conf/blog_confxml.xml

EOF

以上就是sersync同步的配置编写 。文章写的不好。