Rsync+inotify 组合使用同步方案


1. Rsync+inotify组合起源

Rsync 远程同步工具通过rsync可以实现对远程服务器数据的增量备份同步,但rsync自身也有瓶颈,同步数据时,rsync采用可信算法对远程服务器的目标档进行对比,只进行差异同步。我们可以想象一下,如果服务器的档数量达到了百万甚至千万量级,那么档对比将是非常耗时间的一部分,这是非常低效率的方式,inotify的出现,可以缓解rsync不足之处,取长补短。

2. Inotify简介

Inotofy是一种强大的、细粒度的、异步的文件系统时间监控机制,linux内核2.6.13起,加入了inotify支持。通过inotify可以加农文件系统添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实时监控的软件。

特别说明:下面的inotify配置是建立在rsync服务器基础上的配置过程。



架构拓扑图--(单向实时同步)


rsync推送文件先配置好

3.配置

a)[root@server2 home]# uname -r

2.6.18-164.el5

b)下载inotify-tools(https://github.com/rvoicilas/inotify-tools/downloads

Wgat http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

c)[root@server2 home]# ll/proc/sys/fs/inotify/

-rw-r--r-- 1 root root 0 Jul 12 14:00max_queued_events

-rw-r--r-- 1 root root 0 Jul 12 14:00max_user_instances

-rw-r--r-- 1 root root 0 Jul 12 14:00max_user_watches

如果有这三个文件说明支持inotify

d)安装inotify

e)配置inotify脚本
vi /home/realtime_rsync.sh


#!/bin/sh
host01=server1
src=/var/log
dst=backup
user=rsync_backup
rsync_passfile=/etc/rsync.password
inotify_home=/usr/local/inotify
for i in $src $rsync_passfile "$inotify_home"/bin/inotifywait;do
        if [ -e $i ];then
                echo $(date +%F_%H%M%S) $i is exist >>/home/real_inotify.log
        else
                echo ckeck file or folder $i.
        fi
done
"$inotify_home"/bin/inotifywait -mrq --timefmt '%d%m%y-%H:%M' --format '%T %w%f' -e modify,create,delete,attrib $src |while read file
do
/usr/bin/rsync -aruz --delete $src/ $user@$host01::$dst --password-file=$rsync_passfile >/dev/null 2>&1


说明:host01是备份服务器的地址;

Src是需要备份的文件地址

Dst是目标服务器的模块名

Userrsync服务器虚拟用户名

Rsync_passfilersync服务密码文件

使用for循环来检查需要的目录和文件是否存在,然后通过inotify监控src文件是否有改动。如果有改动则触发同步命令rsync


e)sh –x /home/realtime_rsync.sh 调试模式

f)在/home/backup创建测试文件看是否同步。

#!/bin/sh
host01=server1
src=/home/backup
dst=backup
user=rsync_backup
rsync_passfile=/etc/rsync.password
inotify_home=/usr/local/inotify
for i in `seq 200`;do
#       dd if=/dev/zero of=$src/$i bs=1 count=10
        cp $src/exe.tar.gz $src/$i.tar.gz
#       sleep 0.5
done


测试日志

[root@server2 exe]# sh -x ./realtime_rsync.sh

+ host01=server1

+ src=/home/backup

+ dst=backup

+ user=rsync_backup

+ rsync_passfile=/etc/rsync.password

+ inotify_home=/usr/local/inotify

+ for i in '$src' '$rsync_passfile' '"$inotify_home"/bin/inotifywait'

+ '[' -e /home/backup ']'

++ date +%F_%H%M%S

+ echo 2013-07-13_194330 /home/backup is exist

+ for i in '$src' '$rsync_passfile' '"$inotify_home"/bin/inotifywait'

+ '[' -e /etc/rsync.password ']'

++ date +%F_%H%M%S

+ echo 2013-07-13_194330 /etc/rsync.password is exist

+ for i in '$src' '$rsync_passfile' '"$inotify_home"/bin/inotifywait'

+ '[' -e /usr/local/inotify/bin/inotifywait ']'

++ date +%F_%H%M%S

+ echo 2013-07-13_194330 /usr/local/inotify/bin/inotifywait is exist

+ read file

+ /usr/local/inotify/bin/inotifywait -mrq --timefmt %d%m%y-%H:%M --format '%T %w%f' -e modify,create,delete,attrib /home/backup

+ /usr/bin/rsync -aruz --delete /home/backup/ rsync_backup@server1::backup --password-file=/etc/rsync.password

+ read file

+ /usr/bin/rsync -aruz --delete /home/backup/ rsync_backup@server1::backup --password-file=/etc/rsync.password

+ read file

+ /usr/bin/rsync -aruz --delete /home/backup/ rsync_backup@server1::backup --password-file=/etc/rsync.password

测试通过

后台执行脚本

nohup /home/realtime_rsync.sh &