使用sersync实现多台服务器实时同步文件

 一、Sersync项目介绍

项目地址:http://code.google.com/p/sersync/

 我们常用到的是rsync+inotify来对服务器进行实时同步,其中inotify用于监控文件系统事件,rsync是目前广泛使用的同步算法,其优点是只对文件不同的部分进行操作,所以其优势大大超过使用挂接文件系统的方式进行镜像同步。

 目前使用的比较多的同步程序版本是inotify-tools,另外一个是google开源项目Openduckbill(依赖于inotify-tools),这两个都是基于脚本语言编写的,其设计思路同样是采用inotify与rsync命令。 相比较上面两个项目,本项目优点是:

 

 

  1. sersync是使用c++编写,而且对linux系统文件系统产生的临时文件和重复的文件操作进行过滤(详细见附录,这个过滤脚本程序没有实现),所以在结合rsync同步的时候,节省了运行时耗和网络资源。因此更快。

  2. 相比较上面两个项目,sersync配置起来很简单,其中bin目录下已经有基本上静态编译的2进制文件,配合bin目录下的xml配置文件直接使用即可。

  3. 另外本项目相比较其他脚本开源项目,使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状态。

  4. 本项目有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则按设定时长对同步失败的文件重新同步。

  5. 本项目自带crontab功能,只需在xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次。无需再额外配置crontab功能。

  6. 本项目socket与http插件扩展,满足您二次开发的需要。

二、基本架构

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

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

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

 由此图总结可见:

  • sersync支持多线程;
  • 支持队列过滤,节省网络带宽;
  • 失败后重传机制;
  • 具有sockethttpd等套接字,方便二次开发。

Sersync还具有一下机制:

  • 能实现双向同步,只需要在两个机器上都配置就行了;
  •  双向同步过程中,如果同事修改一个文件,则以时间为准
    在在


三、Sersync安装和配置具体步骤

  • 1.1.1.1 server

  • 1.1.1.2 client

1 、Server端安装

 

  
  
  
  
  1. #wget http://sersync.googlecode.com/files/sersync2.5_32bit_binary_stable_final.tar.gz 
  2. # tar xf sersync2.5_32bit_binary_stable_final.tar.gz 
  3. # cd GNU-Linux-x86/ 

通过以上简单三步,即可完成其安装!解压后里面就两个文件,一个sersync2和一个confxml.xml,其中第一个是一个二进制文件,也即是开户服务的文件,后面的是配置文件!

下面对配置文件进行解释

 

  
  
  
  
  1. <?xml version="1.0" encoding="ISO-8859-1"?> 
  2. <head version="2.5"> 
  3.     <host hostip="localhost" port="8008"></host>  #针对插件保留的,默认配置即可
  4.     <debug start="false"/>  #开户debug信息,会在sersync当前运行台,打印Debug信息
  5.     <fileSystem xfs="false"/>  #是否支持xfs文件系统
  6.     <filter start="false">  # 是否开户文件过滤,可以在下面添加过滤类型
  7.     <exclude expression="(.*)\.svn"></exclude> 
  8.     <exclude expression="(.*)\.gz"></exclude> 
  9.     <exclude expression="^info/*"></exclude> 
  10.     <exclude expression="^static/*"></exclude> 
  11.     </filter> 
  12.     <inotify>  # inotify监控的事件
  13.     <delete start="false"/>  #是否保持Sersync和同步端两端文件完全一致
  14.     <createFolder start="true"/> #创建目录的支持,如果不开户,不能监控子目录
  15.     <createFile start="false"/>  #是否监控文件的创建
  16.     <closeWrite start="true"/>  #是否监控文件关闭,开户可保证文件的完整性
  17.     <moveFrom start="true"/> 
  18.     <moveTo start="true"/> 
  19.     <attrib start="false"/> 
  20.     <modify start="false"/> 
  21.     </inotify> 
  22.  
  23.     <sersync> 
  24.     <localpath watch="/data/mp3/">  #这里定义要监控的本地目录,这个很重要
  25.         <remote ip="1.1.1.100" name="mp3"/>  #要同步到哪台服务器,Rsync标签是什么
  26.         <!--<remote ip="192.168.8.39" name="tongbu"/>--> 
  27.         <!--<remote ip="192.168.8.40" name="tongbu"/>--> 
  28.     </localpath> 
  29.     <rsync>  #配置Rsync信息
  30.         <commonParams params="-artuz"/>  #rsync的参数
  31.         <auth start="true" users="syncuser" passwordfile="/etc/rsyncd/rsyncd.pass"/> 
  32.         <userDefinedPort start="false" port="874"/><!-- port=874 -->  # 定义rsync端口
  33.         <timeout start="false" time="100"/><!-- timeout=100 -->  #定义传输超时时间
  34.         <ssh start="false"/>  #Rsync的时候,是否使用ssh加密
  35.     </rsync> 
  36.     <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--> 
  37.     <crontab start="false" schedule="600"><!--600mins-->  #定义crontab定期完全同步两端文件
  38.         <crontabfilter start="false">  #crontab同步时候的过滤条件,上面的过滤部开头要开
  39.         <exclude expression="*.php"></exclude> 
  40.         <exclude expression="info/*"></exclude> 
  41.         </crontabfilter> 
  42.     </crontab> 
  43.     <plugin start="false" name="command"/>  # 下面就是一些插件的设置了
  44.     </sersync> 
  45.  
  46.     <plugin name="command"> 
  47.     <param prefix="/bin/sh" suffix="" ignoreError="true"/>  <!--prefix /opt/tongbu/mmm.sh suffix--> 
  48.     <filter start="false"> 
  49.         <include expression="(.*)\.php"/> 
  50.         <include expression="(.*)\.sh"/> 
  51.     </filter> 
  52.     </plugin> 
  53.  
  54.     <plugin name="socket"> 
  55.     <localpath watch="/opt/tongbu"> 
  56.         <deshost ip="192.168.138.20" port="8009"/> 
  57.     </localpath> 
  58.     </plugin> 
  59.     <plugin name="refreshCDN"> 
  60.     <localpath watch="/data0/htdocs/cms.xoyo.com/site/"> 
  61.         <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/> 
  62.         <sendurl base="http://pic.xoyo.com/cms"/> 
  63.         <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/> 
  64.     </localpath> 
  65.     </plugin> 
  66. </head> 

因为这里rsync的时候,使用了认证用户和密码,所以要定义一下密码文件

 

  
  
  
  
  1. # vim /etc/rsyncd/rsyncd.pass 
  2. 123456 

然后权限改为600

 

  
  
  
  
  1. # chmod 600 /etc/rsyncd/rsyncd.pass 

 

上面对配置文件进行了简单的说明,下面详细的说一下!

 

  
  
  
  
  1. <host hostip="localhost" port="8008"></host> 

hostip与port是针对插件的保留字段,对于同步功能没有任何作用,保留默认即可。

 

  
  
  
  
  1. <filter start="true"> 
  2. <exclude expression="(.*)\.gz"></exclude> 
  3. <exclude expression="^info/*"></exclude> 
  4. </filter> 

将start设置为 true,在exclude标签中,填写正则表达式,默认给出两个例子分别是过滤以”.gz”结尾的文件与过滤监控目录下的info路径(监控路径/info /*),可以根据需要添加,但开启的时候,自己测试一下,正则表达式如果出现错误,控制台会有提示。相比较使用rsync 的exclude功能,被过滤的路径,不会加入监控,大大减少rsync的通讯量。

 

  
  
  
  
  1. <inotify> 
  2. <delete start="true"/> 
  3. <createFolder  start="true"/> 
  4. <createFile start="true"/> 
  5. </inotify> 

 

对于大多数应用,可以尝试把createFile(监控文件事件选项)设置为false来提高性能,减少 rsync通讯。因为拷贝文件到监控目录会产生create事件与close_write事件,所以如果关闭create事件,只监控文件拷贝结束时的事 件close_write,同样可以实现文件完整同步。

注意:强将createFolder保持为true,如果将createFolder设为false,则不会对产生的目录进行监控,该目录下的子文件与子目录也不会被监控。所以除非特殊需要,请开启。默认情况下对创建文件(目录)事件与删除文件(目录)事件都进行监控,如果项目中不需要删除远程目标服务器的文件(目录),则可以将delete 参数设置为false,则不对删除事件进行监控。

 

  
  
  
  
  1. <debug start="false"/> 

设置为true,开启debug模式,会在sersync正在运行的控制台,打印inotify事件与rsync同步命令。

 
 

  
  
  
  
  1. <fileSystem xfs="false"/> 

对于xfs文件系统的用户,需要将这个选项开启,才能使sersync正常工作.

 

  
  
  
  
  1. <localpath watch="/opt/tongbu"> 
  2. <remote ip="192.168.0.104" name="tongbu1"/> 
  3. <!--<remote ip="192.168.8.39" name="tongbu"/>--> 
  4. <!--<remote ip="192.168.8.40" name="tongbu"/>--> 
  5. </localpath> 

 

文件监控与远程同步设置,这里使用watch设定本地要监控的目录,使用remote设置远端的服务器IP,使用name设置无端rsync服务里面定义的标签

 

  
  
  
  
  1. <rsync> 
  2. <commonParams params="-artuz"/> 
  3. <auth start="false" users="root" passwordfile="/etc/rsync.pas"/> 
  4. <userDefinedPort start="false" port="874"/><!-- port=874 --> 
  5. <timeout start="false" time="100"/><!-- timeout=100 --> 
  6. <ssh start="false"/> 
  7. </rsync> 

 

commonParams可以用户自定义rsync参数,默认是-artuz

auth start=”false” 设置为true的时候,使用rsync的认证模式传送,需要配置user与passwrodfile(–password-file=/etc/rsync.pas),来使用。userDefinedPort  当远程同步目标服务器的rsync端口不是默认端口的时候使用(–port=874)。timeout设置rsync的timeout时间(–timeout=100)。ssh 使用rsync -e ssh的方式进行传输。

 

  
  
  
  
  1. <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/> 

对于失败的传输,会进行重新传送,再次失败就会写入rsync_fail_log,然后每隔一段时间(timeToExecute进行设置)执行该脚本再次重新传送,然后清空该脚本。可以通过path来设置日志路径。

 

  
  
  
  
  1. <crontab start="false" schedule="600"><!--600mins--> 
  2. <crontabfilter start="false"> 
  3. <exclude expression="*.gz"></exclude> 
  4. <exclude expression="info/*"></exclude> 
  5. </crontabfilter> 
  6. </crontab> 

 

crontab可以对监控路径与远程目标主机每隔一段时间进行一次整体同步,可能由于一些原因两次失败重传都失败了,这个时候如果开启了crontab功 能,还可以进一步保证各个服务器文件一致,如果文件量比较大,crontab的时间间隔要设的大一些,否则可能增加通讯开销。schedule这个参数是设置crontab的时间间隔,默认是600分钟

如果开启了filter文件过滤功能,那么crontab整体同步也需要设置过滤,否则虽然实时同步的时候文件被过滤了,但crontab整体同步的时候 如果不单独设置crontabfilter,还会将需过滤的文件同步到远程,crontab的过滤正则与filter过滤的不同,也给出了两个实例分别对 应与过滤文件与目录。总之如果同时开启了filter与crontab,则要开启crontab的crontabfilter,并按示例设置使其与filter的过滤一一对应。

 

 

 

 

 

2、client配置Rsync服务

首先安装rsync

 

  
  
  
  
  1. # sudo apt-get install rsync 

然后定义rsync的配置文件

  
  
  
  
  1. # Section 1: Global settings 
  2. port = 873 
  3. uid = root 
  4. gid = root 
  5. use chroot = yes 
  6. read only = no 
  7. max connections = 7 
  8. pid file = /var/run/rsyncd.pid 
  9. log file = /var/log/rsyncd.log 
  10. hosts allow = * 
  11. transfer logging = yes 
  12. log format = %t %a %m %f %b 
  13. syslog facility = local3 
  14. timeout = 300 
  15.  
  16. # Section 2: Directory to be synced 
  17. [mp3] 
  18. path = /data/ 
  19. list = yes 
  20. ignore errors = yes 
  21. auth users = syncuser  
  22. secrets file = /etc/rsyncd/rsync.pass 

定义一下密码文件

  
  
  
  
  1. # vim /etc/rsyncd/rsync.pass 
  2. syncuser:123456 

然后就可以开户服务了

  
  
  
  
  1. [root@node100 ~]# rsync --daemon --config=/etc/rsync.conf  
  2. [root@node100 ~]# ps -ef | grep rsync 
  3. root      3124     1  0 17:26 ?        00:00:00 rsync --daemon --config=/etc/rsync.conf 
  4. root      3130  3085  0 17:26 pts/0    00:00:00 grep rsync 

 

 

如果需要将sersync运行前,已经存在的所有文件或目录全部同步到远程,要以-r参数运行sersync,将本地与远程整体同步一次。

如果设置了过滤器,即在xml文件中,filter为true,则暂时不能使用-r参数进行整体同步。-r参数将会无效。

  
  
  
  
  1. ./sersync2 -r 

 

 

开户服务使用以下命令

  
  
  
  
  1. ./sersync2 -d 

 

对于sersync使用可执行文件目录下的默认配置文件confxml.xml,如果需要使用另一个配置文件,可以使用-o参数指定其它配置文件。

  
  
  
  
  1. ./sersync2 -o XXXX.xml 

 

指定默认的线程池的线程总数

  
  
  
  
  1. ./sersync2 -n num 

 

你可能感兴趣的:(使用sersync实现多台服务器实时同步文件)