inotify+rsync+python 实时远程文件同步 按需调用 避免无效轮询
最新方案
由于crontab最低频率是1分钟,因此修改方案为:
通过inotify+rsync来实现实时同步!
然后客户端通过inotify+python 来实现按需调用!
参考:https://www.cnblogs.com/qiuhom-1874/p/12246660.html
1、源机器安装inotify
确认Linux系统是否支持inotify这个功能
# 内核版本高于2.6.13,并且有/proc/sys/fs/inotify/目录,说明我们的系统上支持inotify功能的
ll /proc/sys/fs/inotify/
总用量 0
-rw-r--r-- 1 root root 0 1月 31 16:29 max_queued_events
-rw-r--r-- 1 root root 0 1月 31 16:29 max_user_instances
-rw-r--r-- 1 root root 0 1月 31 16:29 max_user_watches
/proc/sys/fs/inotify这个目录下看到有三个文件,这三个文件就是记录inotify的内核参数的文件。其中max_queued_events这个文件记录inotify事件队列最大长度,如值太小会报Event Queue Overflow 错误,默认值:16384
永久修改需要修改编辑/etc/sysctl.conf
fs.inotify.max_queued_events=999999
max_user_watches:这个文件主要存放单个进程监控文件的数量,默认是8129;生产环境中如果监控的文件数量庞大,可以通过上面的方式去修改这个值
max_user_instances:这个文件存放用户创建inotify实例的最大值,默认是128;同样也是可以通过上面的方式修改
inotify软件安装
yum install -y inotify-tools
2、编写脚本
Usage: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
[root@test-centos6-node1 ~]# cat inotify_rsync.sh
#!/bin/bash
SRC='/root/test/'
DEST='rsyncuser@192.168.0.99::backup'
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e create,delete,moved_to,close_write ${SRC} ${SRC2}|while read DATE TIME DIR FILE;do
FILEPATH=${DIR}${FILE}
rsync -avz --delete --password-file=/etc/rsync.pass $SRC $DEST &&
echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done
执行:
# 本会话执行(关掉会话后,就不会监听执行了)
bash inotify_rsync.sh
# 后台执行
nohup bash inotify_rsync.sh &
rsync的安装和使用参见下文!
最初方案(弃)
直接使用rsync来同步
1、两台机器都要安装rsync
yum -y install rsync
2、测试一下
rsync -avz test/ root@192.168.1.20:/root/test
会递归同步文件和目录
-a:–archive archive mode 权限保存模式,相当于 -rlptgoD 参数,存档,递归,保持属性等。
-r:–recursive 复制所有下面的资料,递归处理。
-p:–perms 保留档案权限,文件原有属性。
-t:–times 保留时间点,文件原有时间。
-g:–group 保留原有属组。
-o:–owner 保留档案所有者(root only)。
-D:–devices 保留device资讯(root only)。
-l:–links 复制所有的连接,拷贝连接文件。
-z:–compress 压缩模式,当资料在传送到目的端进行档案压缩。
-H:–hard-links 保留硬链接文件。
-A:–acls 保留ACL属性文件,需要配合–perms。
-P:-P参数和 --partial --progress 相同,只是为了把参数简单化,表示传进度。
3、免密同步
a、源文件所在机器,生成ssh密钥
ssh-keygen -t rsa
一路回车,生成到默认目录,默认指纹即可
b、同步密钥到目标机器
# 会要求输入目标机器密码
# 如果ssh端口改过,不是22,需要 -p [port] 指定端口号
ssh-copy-id root@192.168.1.250 -p [port]
之后同步不再需要密码。
配置自动执行
# 每5s同步一次到目标机器(crontab最低是1分钟,这个表达式不能实现)
# 采用flock限制执行周期,直到这个任务执行完成后,再执行下一个周期
*/5 * * * * flock -xn /tmp/my.lock -c 'rsync -avz test/ root@192.168.1.20:/root/test'
flock常用参数(man flock)
-s:获取一个共享锁
-x :获得一个独占锁
-u:解除锁
-n:如果获取锁失败立即返回而不是等待
-w:如果获取锁失败等待的时间
-c:在shell中允许一个命令

浙公网安备 33010602011771号