一.介绍web
1.1 rsync命令是一个远程数据同步工具,可经过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不一样部分,而不是每次都整份传送,所以速度至关快。
算法
1.2 Inotify一种强大的、细粒度的、异步文件系统监控机制,它知足各类各样的文件监控须要,能够监控文件系统的访问属性、读写属性、权限属性、删除建立、移动等操做,也就是能够监控文件发生的一切变化vim
1.3 inotify+rsync结合,能够作到远程数据的实时同步,如下实验使用rsync客户端+inotify实时将数据同步到rsync服务端bash
二.环境准备服务器
2.1 系统:CentOS6.5异步
rsync客户端:192.168.55.229ide
rsync服务端:192.168.55.219工具
2.2 rsync和inotify安装:测试
# yum install rsync # yum install inotify-tools
三.rsync服务器配置ui
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/ bak@192.168.55.219::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 指定文件变化的详细信息