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 &