一.介绍


1.1 rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。

1.2 Inotify一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、权限属性、删除创建、移动等操作,也就是可以监控文件发生的一切变化


1.3 inotify+rsync结合,可以做到远程数据的实时同步,以下实验使用rsync客户端+inotify实时将数据同步到rsync服务端


二.环境准备


2.1 系统:CentOS6.5

  rsync客户端:192.168.55.229

  rsync服务端:192.168.55.219


2.2 rsync和inotify安装:

 # yum install rsync
 # yum install inotify-tools



三.rsync服务器配置


3.1 编辑rsync服务端配置文件

# vim /etc/rsyncd.conf
log file = /var/log/rsyncd.log
pid file = /usr/local/rsync/var/rsyncd.pid
lock file = /usr/local/rsync/var/rsyncd.lock
secrets file = /usr/local/rsync/etc/rsyncd.pas
read only = no
hosts allow = 192.168.55.0/24
list = yes
uid = nobody
gid = nobody
use chroot = no
max connections = 4
[bak]                  //模块
path = /bak              //模块目录
comment = nfs bak          //描述信息
auth users = bak           //rsync同步需要的认证用户



3.2 rsync服务器创建密码文件

# vim rsyncd.pas
bak:338912           //格式为用户名:密码,文件权限为600



3.3 rsync服务启动

# /usr/bin/rsync --daemon --config=/etc/rsyncd.conf



四.rsync客户端配置


4.1 编辑rsync客户端同步需要的密码文件

# vim /etc/rsync.pas
338912              //rsync客户端只需要认证用户的密码,文件权限为600



4.2 命令行验证rysnc客户端到rsync服务端同步功能

# rsync -avzc  --progress --delete --password-file=/etc/rsync.pas  /tmp/test/  [email protected]::bak
sending incremental file list
./
test/
sent 223 bytes  received 15 bytes  476.00 bytes/sec
total size is 394699  speedup is 1658.40

:如果有“failed: Permission denied (13)”这种错误,需要给与服务端配置文件中用户nobody对模块所在目录有写权限


4.3 使用inotify+rsync脚本实现文件的实时检测并同步

脚本内容如下:


#!/bin/bash
src=/tmp/test/
des=bak
rsync_passwd_file=/etc/rsync.pas
ip1=192.168.55.219
user=bak
cd ${src}
/usr/bin/inotifywait -mrq --format  '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file
do
        INO_EVENT=$(echo $file | awk '{print $1}')      # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
        INO_FILE=$(echo $file | awk '{print $2}')       # 把inotify输出切割 把文件路径部分赋值给INO_FILE
        echo "-------------------------------$(date)------------------------------------"
        echo $file
        #增加、修改、写入完成、移动进事件
        #增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。
        if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]];then
                echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
                rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
        fi
        #删除、移动出事件
        if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]];then
                echo 'DELETE or MOVED_FROM'
                rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
        fi
        #修改属性事件 指 touch chgrp chmod chown等操作
        if [[ $INO_EVENT =~ 'ATTRIB' ]]
        then
                echo 'ATTRIB'
                if [ ! -d "$INO_FILE" ]                 # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带>
更新此目录。
                then
                        rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des}
                fi
        fi
done

:为做到实时同步,就必须要减少rsync对目录的递归扫描判断,尽可能的做到只同步inotify监控到已发生更改的文件。结合rsync的特性,所以该脚本是分开判断来实现一个目录的增删改查对应的操作,已经在测试机测试成功。因为inotify只在启动时会监控目录,他没有启动期间的文件发生更改,它是不知道的,所以可以在启动该脚本前做一次rsync全量同步,启动脚本后使用计划任务定时做rsync全量同步,防止各种意外遗漏,保证数据一致。

此脚本参考链接:http://www.ttlsa.com/web/let-infotify-rsync-fast/ 


五.rsync和inotify常用参数解释


5.1 rsync常用参数说明

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

-c, --checksum 打开校验开关,强制对文件传输进行校验

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

-H, --hard-links 保留硬链接

-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀

--backup-dir 将备份文件(如~filename)存放在在目录下

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


5.2 inotify常用参数说明

-m 要持续监视变化

-r 使用递归形式监视目录
-q 减少冗余信息,只打印出需要的信

--format 指定文件变化的详细信息