Cetnos环境下inotify+rsync实时同步

一.介绍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 指定文件变化的详细信息

相关文章
相关标签/搜索