一.介绍
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安装:
1
2
| # yum install rsync
# yum install inotify-tools
|
三.rsync服务器配置
3.1 编辑rsync服务端配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # 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服务器创建密码文件
1
2
| # vim rsyncd.pas
bak:338912 //格式为用户名:密码,文件权限为600
|
3.3 rsync服务启动
1
| # /usr/bin/rsync --daemon --config=/etc/rsyncd.conf
|
四.rsync客户端配置
4.1 编辑rsync客户端同步需要的密码文件
1
2
| # vim /etc/rsync.pas
338912 //rsync客户端只需要认证用户的密码,文件权限为600
|
4.2 命令行验证rysnc客户端到rsync服务端同步功能
1
2
3
4
5
6
| # 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
|
4.3 使用inotify+rsync脚本实现文件的实时检测并同步
脚本内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| #!/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 指定文件变化的详细信息
|