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
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
1234567891011121314151617 #!/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创建测试文件看是否同步。
123456789101112 #!/bin/sh
host01=server1
src=https://www.linuxidc.com/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=https://www.linuxidc.com/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 &