通过 rsync + inotify-tools 进行文件实时同步

inotify-tools 可以监控文件的变化

rsync可以进行增量文件本地同步和远程同步

如果只使用rsync,当监控的文件目录包含的文件达到一定数量,rsync会有很大的延迟,因此inotify检测到哪些文件发生了改动,立刻通知rsync进行同步,这样就不必监控大量的目录,而是精准同步

两者结合,可以做到文件服务器这些东西的主从备份,即实时镜像

以下为大致步骤:

1、主机器登录到从机器做免密登录
2、两台机器上安装 rsync
3、主机器上安装 inotify-tools ,安装后主要是两个工具:inotifywatch和inotifywait
4、主机器上使用 inotifywatch 监控指定目录改动并触发 rsync
5、主机器上封装为脚本,设置后台运行+开启启动

参考代码如下:

一、以下代码使用inotify进行文件变动提醒 同时触发rsync

#!/bin/bash

src=/data/xxx/
des=/data/xxx/
user=root
host=baidu.com

inotifywait -mrq -e modify,create,delete,attrib,close_write,move ${src} | while read INO_FILE_FULL INO_EVENT INO_FILE_NAME; do
    echo -e '\n'
    echo ' ------- start -------'

    echo $INO_FILE_FULL
    echo $INO_EVENT
    echo $INO_FILE_NAME

    if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]; then
        echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
        rsync -av --exclude='.user.ini' -e 'ssh -p 22' ${INO_FILE_FULL} ${user}@${host}:${INO_FILE_FULL}
    elif [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]; then
        echo 'DELETE or MOVED_FROM'
        # rsync -av --delete --exclude='.user.ini' -e 'ssh -p 22' ${INO_FILE_FULL} ${user}@${host}:${INO_FILE_FULL}
    elif [[ $INO_EVENT =~ 'ATTRIB' ]]; then
        if [ ! -d "$INO_FILE" ]; then
            echo 'ATTRIB-file'
            # rsync -av --exclude='.user.ini' -e 'ssh -p 22' ${INO_FILE_FULL} ${user}@${host}:${INO_FILE_FULL}
        else
            echo 'ATTRIB-dir'
        fi
    else
        echo 'fail'
    fi

    echo ' ------- end -------'
done

二、以下文件把上述操作配置为系统服务,方便管理和异常自动重启

编辑系统服务文件 /etc/systemd/system/rsyncfile.service 写入以下内容

[Unit]
Description=rsync file to backup host
After=network.target

[Service]
Type=simple
#ExecStart=/www/mydata/shell/rsync_all_time_part.sh >> /www/mydata/log/rsync_all_time_part.log 2>&1
ExecStart=/bin/bash -c '/www/mydata/shell/rsync_all_time_part.sh >> /www/mydata/log/rsync_all_time_part.log 2>&1'
Restart=always

[Install]
WantedBy=multi-user.target

配置服务

systemctl daemon-reload
systemctl start rsyncfile
systemctl status rsyncfile
systemctl enable rsyncfile

建议配合以下脚本使用,以下脚本可以执行一次全部的同步,以防止实时同步漏掉文件

#!/bin/bash

rsync -av --exclude='somefile' --exclude='somefolder/' --delete -e 'ssh -p 22' /data/xx/ baidu.com:/data/xx/

原创文章,作者:witersen,如若转载,请注明出处:https://www.witersen.com

(0)
witersen的头像witersen
上一篇 2023年9月15日 上午4:05
下一篇 2023年9月16日 上午3:07

相关推荐

  • Linux实训3

    要求:实现负载均衡及nginx状态监控(负载均衡类型为反向代理负载均衡) 一、准备 一台本地主机 用于验证web负载均衡 本地主机IP地址为固定IP地址 172.16.123.10…

    2019年10月22日
    1.4K0

发表回复

登录后才能评论