使用inotify和rsync实现两台文件的同步

一:架构

       server1(主。IP:10.108.7.8):文件变动,如存放用户文档数据等。

                               rsync服务    inotify服务

       server2(从。IP:10.108.7.9):将server1所变动部分同步到server2.                             

二:配置步骤

      1.ssh无密码设置

      2.server1 rsync服务端安装

      3.server1 inotify 安装

三:ssh无密码设置。最终的效果是server1可以直接连到server2

3.1. server1

ssh-keygen -t rsa

 得到如下结果

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
8a:53:5e:6f:0a:9f:a4:9c:bb:a1:31:8d:d8:3f:cf:db root@rpt01

中间提示输入passphrase,直接回车就行。

生成id_rsa文件为私有密钥,id_rsa.pub为公有密钥。

3.2修改.ssh目录的权限

 chmod 755 ~/.ssh

3.3将密钥对中的公共密钥复制到server2,并保存为~/.ssh/authorized_keys. 

scp ~/.ssh/id_rsa.pub [email protected]:~/.ssh/authorized_keys

3.4 test 你可以重复上面这句,这次如果OS没有提示你输入密码就表示设置成功。

四:server1 rsync客户端安装 

wget ftp://ftp.samba.org/pub/rsync/rsync-3.0.9.tar.gz
tar -zxvf rsync-3.0.9.tar.gz
cd rsync-3.0.9
./configure --prefix=/usr/local/rsync
make
make install

    以上过程没有出现的话就安装好了,现在就有rsync命令可以用了,rsync命令放在/usr/local/rsync/bin。用rsync命令可以去运行有rsync服务的服务器上抓取资料

     比如命令:rsync -avz  $SRC $DST

五 server1 inotify  安装

    5.1 下载inotify-tools-3.14.tar.gz

    5.2 安装     

tar -zxvf inotify-tools-3.14.tar.gz 
cd inotify-tools-3.14
./configure --prefix=/usr/local/inotify
make
make install

      5.3 写脚本测试

vi inosync.sh

#!/bin/sh
SRC=/home/test
[email protected]:/home/

/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f' \
-e create,move,delete,modify ${SRC} | while read file
do
                rsync -avz --delete --progress ${SRC} ${DST}
done

     修改权限

chmod +x inosync.sh

      测试

./inosync.sh &
cd /home/test
mkdir t1

     5.4 将脚本设为自启动

 echo "nohup /home/test/inosync.sh &" >> /etc/rc.local 

理论性知识

一   rsync

      rsync是一个提供快速增量文件传输的开源工具。其基于GNU General Public License 发布,目前主要有 Wayne Davison (http://opencoder.net/)维护。主页http://rsync.samba.org/

rsync是一个Unix系统的的文件传输程序,通过使用“rsync 算法”,提供远程文件同步的快速方法。顾名思义,rsync就是 remote sync。通过过程中,只是发送发生改变的文件,而不是发送全部的内容。

它的特性如下:

1、可以更新整个目录树和文件系统;

2、可以保留文件的软链接、硬链接、权限信息、属主信息、设备和时间信息;

3、无须特殊权限即可安装;

4、内部的流水线提高了多文件传输的速度;

5、可以使用ssh、rsh或者socket链接进行传输;

6、支持匿名传输;

    rsync的conf详解以及命令参数可以参看http://blog.csdn.net/xw_hit/article/details/5955139

   常见的参数组合说明

    -avz

          -a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD

            -v, --verbose 详细模式输出

            -z, --compress 对备份的文件在传输时进行压缩处理

     -aHqzt

         -H, –hard-links 保留硬链结

            -q, –quiet 精简输出模式

            -t, –times 保持文件时间信息

       --delete 删除那些DST中SRC没有的文件   

二 inotify

       rsync的不足:

     首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发 生变化的往往是其中很少的一部分,这是非常低效的方式。

     其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同 步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据

Inotify 可以监视的文件系统事件包括:

  • IN_ACCESS,即文件被访问
  • IN_MODIFY,文件被 write
  • IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等
  • IN_CLOSE_WRITE,可写文件被 close
  • IN_CLOSE_NOWRITE,不可写文件被 close
  • IN_OPEN,文件被 open
  • IN_MOVED_FROM,文件被移走,如 mv
  • IN_MOVED_TO,文件被移来,如 mv、cp
  • IN_CREATE,创建新文件
  • IN_DELETE,文件被删除,如 rm
  • IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
  • IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己
  • IN_UNMOUNT,宿主文件系统被 umount
  • IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
  • IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)
  • inotifywait 仅执行阻塞,等待 inotify 事件。您可以监控任何一组文件和目录,或监控整个目录树(目录、子目录、子目录的子目录等等)。在 shell 脚本中使用 inotifywait
  • inotifywatch 收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。

  • inotifywait 的参数

    参数说明: 

    --fromfile <file>  只监控目录下文件状态的变化 
    -m, --monitor      当事件发生后直接执行退出,-m 参数将不退出当前的shell脚本. 
    -r, --recursive    递归监控当前目录下的所有文件和目录.(默认的文件和目录数最大是 8192个;如果不满足可以修改/proc/sys/fs/inotify/max_user_watches 
    --exclude <pattern>  通过正则匹配文件名,大小写敏感. 
    --excludei <pattern>  通过正则匹配文件名,大小写不敏感. 
    -t <seconds>       事件发生时的秒数. 
      -e <event>        监听那些事件的发生 
    --timefmt option   指定输出的时间格式 
    --format <fmt>     输出指定时间格式. 
         %w 监控事件发生时的文件名或文件路径 
         %f 监控目录内部事件发生时文件名称 
         %e 监控指定的事件发生 

         %T 输出事件发生时的时间,--timefmt option指定格式 

    --timefmt '%d/%m/%y %H:%M' --format '%T %w%f'
         --timefmt:指定输出时的输出格式
         --format: '%T %w%f'指定输出的格式,

         上面的输出类似于:10/03/09 15:31 /wwwpic/1

    inotifywatch: 参考http://limimgjie.iteye.com/blog/747414
      使用linux的inotify特性监控某段时间内的文件状态,并输出摘要报表. 

    样例:输出beagle目录下60秒内的访问和修改事件触发报表 

    % inotifywatch -v -e access -e modify -t 60 -r ~/.beagle
           Establishing watches...
           Setting up watch(es) on /home/rohan/.beagle
           OK, /home/rohan/.beagle is now being watched.
           Total of 302 watches.
           Finished establishing watches, now collecting statistics.
           Will listen for events for 60 seconds.
           total  access  modify  filename
           1436   1074    362     /home/rohan/.beagle/Indexes/FileSystemIndex/PrimaryIndex/
           1323   1053    270     /home/rohan/.beagle/Indexes/FileSystemIndex/SecondaryIndex/
           303    116     187     /home/rohan/.beagle/Indexes/KMailIndex/PrimaryIndex/
           261    74      187     /home/rohan/.beagle/TextCache/
           206    0       206     /home/rohan/.beagle/Log/
           42     0       42      /home/rohan/.beagle/Indexes/FileSystemIndex/Locks/
           18     6       12      /home/rohan/.beagle/Indexes/FileSystemIndex/
           12     0       12      /home/rohan/.beagle/Indexes/KMailIndex/Locks/
           3      0       3       /home/rohan/.beagle/TextCache/54/
           3      0       3       /home/rohan/.beagle/TextCache/bc/
           3      0       3       /home/rohan/.beagle/TextCache/20/
           3      0       3       /home/rohan/.beagle/TextCache/62/
           2      2       0       /home/rohan/.beagle/Indexes/KMailIndex/SecondaryIndex/


    你可能感兴趣的:(使用inotify和rsync实现两台文件的同步)