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中允许一个命令

posted @ 2025-05-13 09:09  流失的痕迹  阅读(58)  评论(0)    收藏  举报