Linux 文件双向实时同步有很多种解决办法:现介绍两种rsync + inotify 和rsync + sersync

一、先安装rsync(服务器端 和 客户端)

1、先检查系统中是否有默认的安装包

# rpm -qa |grep rsync

2、如果有,最好删除,安装最新版

# rpm -e --nodeps ..

3、下载最新的rsync包
  http://pkgs.repoforge.org/rsync/rsync-3.0.9-2.el6.rfx.i686.rpm(根据系统配置选择下载)

4、安装下载的rpm

# rpm -ivh rsync-3.0.9-2.el6.rfx.i686.rpm

5、安装成功后
  

/etc/xinetd.d/rsync 将disable = yes 改为 no

6、配置rsync自启动

# chkconfig rsync on


  
  查看自启动是否成功

# chkconfig rsync --list

7、配置 /etc/rsyncd.conf (如果没有该文件,就新建文件)

uid = root                  #守护进程的用户权限
   gid = root
   port = 873                  #rsync使用的端口,默认873
   address = 192.168.1.100     # 本机的ip地址
   use chroot = yes
   read only = no              # no客户端可上传文件,yes只读
   write only = no             # no客户端可下载文件,yes不能下载
   #list = yes                 # 是否提供资源列表
   hosts allow=192.168.1.101   # 本模块允许通过的IP地址
   hosts deny=*                # 禁止主机IP
   max connections = 5         # 客户端最大连接数目  motd file = /etc/rsyncd.motd
   pid file = /var/run/rsyncd.pid  # 进程号存放位置
   log file = /var/log/rsyncd.log  # 日志位置
   lock file = /var/run/rsync.lock # 锁文件存放位置  transfer logging = yes
   log format = %t %a %m %f %b
   syslog facility = local3
   timeout = 300  [test1]                           # 要同步的模块名
  path = /backup                    # 要同步的目录
   list=yes
   ignore errors
   auth users = root                 # 登陆系统使用的用户名,没有默认为匿名。
   secrets file = /etc/rsyncd.secrets # 密码文件存放的位置
   comment = linuxsir tmp            # 这个名名称无所谓,最后模块名一直

8、配置密码文件

  密码文件为配置文件中所写的文件/etc/rsyncd.secrets格式为账户:密码

9、修改配置文件和密码文件权限为600

# chmod 600 /etc/rsyncd.conf
   # chmod 600 /etc/rsync.pass

 

10、启动守护进程

rsync --daemon --config=/etc/rsyncd.conf

11、检查rsync是否启动
 

# lsof -i :873 或
    # netstat -an |grep 873

二、客户端配置 

  1.1 设定密码文件

  1.2 测试rsync执行指令

  1.3 将rsync指令放入工作排程(crontab)

# vi /etc/xinetd.d/rsync
   /etc/xinetd.d/rsync 将disable = yes 改为 no

  1.1 配置密码文件 (注:为了安全,设定密码档案的属性为:600。rsync.ps的密码一定要和Rsync Server密码设定案里的密码一样)

# vi rsyncd.secrets
     111111  # chown root.root /etc/rsyncd.secrets # 注意必须给权限
   # chmod 600 /etc/rsyncd.secrets # 必须修改权限

  1.2 从服务器上下载文件
  

# rsync -avz --password-file=/etc/rsyncd.secrets root@192.168.1.100::test1 /backup

  从本地上传到服务器上去

# rsync -avz --password-file=/etc/rsyncd.secrets /backup/ root@192.168.1.100::test1

  不带密码从服务器上下载文件

/usr/bin/rsync -vzrtopg --progress --delete root@192.168.1.100::test1 /backup

  注:如果还密码上传或下载,rsyncd.secrets 只保存密码,此配置是每次获取增量值,不能实时监控

  
三、inotify 安装

1、首先在服务端安装,需要确定你的系统是否支持inotify,能输出这样的结果表示支持

# ll /proc/sys/fs/inotify


  
  显示:

total 0
   -rw-r--r-- 1 root root 0 Jan 4 17:56 max_queued_events
   -rw-r--r-- 1 root root 0 Jan 4 17:56 max_user_instances
   -rw-r--r-- 1 root root 0 Jan 4 17:56 max_user_watches

2、下载并安装inotify-tools
  
  解压inotify

# tar zxvf inotify-tools-3.14


  
  进入到该目录下执行

# ./configure --prefix=/usr/local/inotify
   # make
   # make install

3、使用inotify ,必须在客户端安装好rsync

4、配置inotify (服务端)
  
  新建文件 rsync.sh 并赋予执行权限,文件名、位置随便,内容如下
  

#!/bin/bash
   #同步接收方ip
   client=192.168.1.101
   src=/backup/
   #同步接收方配置的rsync模块名
   dest=test1
   #同步接收方鉴权时的用户
   user=root
   /usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,move,attrib $src | while read files
   do
   /usr/bin/rsync -vzrtopgq --delete --progress --password-file=/wangyi/inotify/rsyncpasswd $src $user@$client::$dest
   done  授执行权限
   # chmod +x /wangyi/inotify/rsync.sh

5、在/wangyi/inotify/目录下新建rsyncpasswd文件,内容为客户端中rsyncd.secrets中用户对应的对应密码即1111并赋予600权限
  # chmod 600 /wangyi/inotify/rsyncpasswd

6、最后运行rsync.sh 就可以了

  注:inotify 配置开机后执行该文件就行,如果加入到开机启动项,能成功执行,但不能进行系统桌面了。
  
  注:此是单向同步,可以设置别一端就是双向同步了

四、sersync 安装

1、需要在同步主服务器上配置sersync,在同步目标服务器配置rsync,并在目标服务器开启rsync守候进程,这样在主服务器产生的文件,就会被sersync实时同步到多个目标服务器

2、下载文件sersync2.5_32bit_binary_stable_final.tar.gz 下载地址:http://code.google.com/p/sersync/,建议下载最新版
  
  解压tar -zxvf sersyncXxxx_xxbit_binary.tar.gz
  
3、进入该文件夹cd GNU-Linux-x86/

  修改配置vi confxml.xml
 3.1修改如下部分:

<localpath watch="/backup">
      < remote ip="192.168.1.101" name="test1"/>
      < remote ip="192.168.1.102" name="test1"/>
   < /localpath>

  表明要将主服务器上本地的/backup 路径下的文件,同步到远程服务器 192.168.1.101 与 192.168.1.102上的test1模块

 3.2设置日志文件位置

<failLog path="/wangyi/sersync/GNU-Linux-x86/rsync_fail_log.sh" timeToExecute="60"/>


  
 3.3//密码文件 root是客户端的用户,密码文件密码是

<auth start="true" users="root" passwordfile="/wangyi/sersync/GNU-Linux-x86/rsyncd.secrets"/>


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

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

 3.5//filter文件过滤功能对于sersync监控的文件,会默认过滤系统的临时文件(以“.”开头,以“~”结尾),除了这些文件外,可以自定义其他需要过滤的文件。

<filter start="true">
      < exclude expression="(.*).gz"></exclude>
      < exclude expression="^info/*"></exclude>
  < /filter>


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

 3.6inotify监控参数设定(优化)

  对于inotify监控参数可以进行设置,根据您项目的特点优化srsync。

< inotify>
      < delete start="true"/>
      < createFolder start="true"/>
      < createFile start="true"/>
  < /inotify>

  对于大多数应用,可以尝试把createFile(监控文件事件选项)设置为false来提高性能,减少 rsync通讯。因为拷贝文件到监控目录会产生create事件与close_write事件,所以如果关闭create事件,只监控文件拷贝结束时的事件close_write,同样可以实现文件完整同步。 注意:强将createFolder保持为 true,如果将createFolder设为false,则不会对产生的目录进行监控,该目录下的子文件与子目录也不会被监控。所以除非特殊需要,请开启。默认情况下对创建文件(目录)事件与删除文件(目录)事件都进行监控,如果项目中不需要删除远程目标服务器的文件(目录),则可以将delete 参数设置为false,则不对删除事件进行监控。

 3.7 Debug开启

<debug start="false"/>

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

 3.8 XFS文件系统

< fileSystem xfs="false"/>

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

 3.9 文件监控与远程同步设置

< sersync>
        < localpath watch="/opt/tongbu">
           < remote ip="192.168.0.104" name="tongbu1"/>
           < !–<remote ip="192.168.8.39" name="tongbu"/>–>
           < !–<remote ip="192.168.8.40" name="tongbu"/>–>
        < /localpath>
    Rsync参数配置
   < rsync>
     < commonParams params="-artuz"/>
        < auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
        < userDefinedPort start="false" port="874"/><!– port=874 –>
        < timeout start="false" time="100"/><!– timeout=100 –>
        < ssh start="false"/>
   < /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的方式进行传输
 3.10 失败日志脚步配置

<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!–default every 60min

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

  Crontab定期整体同步功能

< crontab start="false" schedule="600"><!–600mins–>
     < crontabfilter start="false">
       < exclude expression="*.gz"></exclude>
       < exclude expression="info/*"></exclude>
     < /crontabfilter>
    < /crontab>

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

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

 

  插件设置

<plugin start="false" name="command"/>

  当设置为true的时候,将文件同步到远程服务器后会调用name参数指定的插件

4、在开启实时监控的之前对主服务器目录与远程目标机目录进行一次整体同步
 
  ./sersync -r

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

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

5、在主服务器上开启sersync守护进程,使sersync在后台运行,开启实时同步

./sersync -d


  可以在本地监控路径下建立文件,查看远程是否同步成功

6、查看启动参数帮助
 

./sersync –help

7、指定配置文件

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

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

./sersync -n num


  例如 ./sersync -n 5 则指定线程总数为5,如果不指定,默认启动线程池数量是10,如果cpu使用过高,可以通过这个参数调低,如果机器配置较高,可以用-n跳高线程总数

9、不进行同步,只运行插件

./sersync -m pluginName

  例如./sersync -m command,则在监控到文件事件后,不对远程目标服务器进行同步,而是直接运行command插件

10、多个参数可以配合使用

  ./sersync -n 8 -o abc.xml -r -d表示,设置线程池工作线程为8个,指定abc.xml作为配置文件,在实时监控前作一次整体同步,以守护进程方式在后台运行。

 

11、通常情况下,对本地到远程整体同步一遍后,在后台运行实时同步。

./sersync2 -r -d

12、最后需要把sersync命令加入到/etc/rc.local以开机自启动


echo "/usr/sersync/sersync2 -d -o /usr/sersync/confxml.xml">> /etc/rc.local

转载于:https://blog.51cto.com/11935263/2054760