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