inotify + rsync 快速实现 '小剂量' 实时同步



0x01 利用 intify 做实时同步,实现如下适合文件并发较少文件较小的备份场景中,一般并发范围在200-300个小文件,延迟基本是很小的,如果超过这个量就比较吃力了:

1
要备份的目录 + inotify -> inotify会一直监控该目录的变化,只要所监控的目录一有变化,就把新生成的文件或者目录自动推到备份服务器上

0x02 准备好环境:

1
2
RsyncServer 一台已经事先配置好的Rsync服务器
RsyncClient26 再准备一台已经事先配置好的Rsync客户端,因为等会儿就在这台机器上安装inotify,也就是说,只要监控到客户端一有数据更新,就自动往服务端推

0x03 开始在rsync客户端上编译安装 inotiy:

1
# ls -l /proc/sys/fs/inotify/ 首先,查看当前内核是否支持,如果出现以下三个文件则表示支持

1
2
3
4
5
6
7
8
# wget https://jaist.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
# tar xf inotify-tools-3.13.tar.gz
# cd inotify-tools-3.13
# ./configure --prefix=/usr/local/inotify-tools-3.13 && make && make install
# echo $?
# ln -s /usr/local/inotify-tools-3.13/ /usr/local/inotify
# ls -l /usr/local/inotify/
# cd /usr/local/inotify-tools-3.13/bin/

1
2
3
4
5
6
inotifywatch 做事件统计用
inotifywait 主要用来监控指定目录中的事件变化
-m 保持监控
-r 递归监控,监控目录及子目录
-q 安静模式
-e 指定事件

监控指定目录下的各类增删改事件

1
# ./inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,close_write,delete /bakdata/ 同时监控指定目录的增删改事件

0x04 最后,再在Rsync客户端上利用下面的小脚本即可帮助我们实现自动往Rsync服务端同步的效果:

1
# vi inotify.sh

1
2
3
4
5
6
7
8
#!/bin/bash
inotify=/usr/local/inotify/bin/inotifywait
$inotify -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,close_write,delete,modify,move,attrib /bakdata/ \
|while read file
do
# 注意这里,带了--delete选项,也就是说它会先清空再同步,由于是实时同步,最好无差异备份
cd /bakdata/ && rsync -az ./ --delete rsync_backup@192.168.5.4::webbak --password-file=/etc/rsync.password
done
1
2
3
4
5
# sh -x inotify.sh 简单调试
# /bin/sh /root/inotify.sh & 确认没问题以后,放到后台执行
# watch -n 1 ls /webdata/ 在服务端每隔一秒观察是否有文件被创建
# echo "/bin/sh /root/inotify.sh &" >> /etc/rc.local 加入自启动
# cat /etc/rc.local

0x05 如果实际并发较大,可以适当的把inotify简单优化下:

1
2
3
# ls -l /proc/sys/fs/inotify/
# echo "50000000" > /proc/sys/fs/inotify/max_user_watches 加大单进程最大的文件监视数量
# echo "50000000" > /proc/sys/fs/inotify/max_queued_events 加大队列可容纳的事件数量



小结:
    对于要同时同步大量小文件来讲,inotify可能确实有些吃力,后续我们会再说明另一种解决方案,基于lsyncd + rsync实现的实时同步,待续…