Rsync
rsync命令是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件。rsync 使用所谓的“rsync 算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
rsync 命令一般为系统自带,无需另行安装。
Inotify
什么是 inotify?
Inotify
一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、权限属性、删除创建、移动等操作,也就是可以监控文件发生的一切变化。
inotify-tools
是一套 C 开发接口库函数和一组命令行工具,提供 Linux 下 inotify 的简单接口。inotify-tools 安装后会得到 inotifywait
和 inotifywatch
这两条命令。
安装 inotify
1. 查看系统内核
uname -r
返回值: 3.10.0-862.el7.x86_64
系统内核需大于 2.6.13
2. 查看系统是否默认支持 inotify,是否有以下三个文件
ls /proc/sys/fs/inotify/
结果
max_queued_events max_user_instances max_user_watches
3. 检查是否有安装 inotify
,如果没有就安装
- CentOS
rpm -qa inotify-tools
CentOS安装
CentOS 需添加 EPEL 库yum -y install inotify-tools
- ubuntu安装
dpkg -l | grep inotify
- debian安装
apt -y install inotify-tools
参数详解
安装完成后会生成两个命令
-
/usr/bin/inotifywait
命令可以用来收集有关文件访问信息,Linux 发行版一般没有包括这个命令,需要安装
inotify-tools
,这个命令还需要将inotify
支持编译入 Linux 内核,好在大多数 Linux 发行版都在内核中启用了 inotify。 -
/usr/bin/inotifywatch
命令用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。
inotifywait 命令参数:
- -m 是要持续监视变化
- -r 使用递归形式监视目录。
- -q 减少冗余信息,只打印出需要的信息。
- -e 指定要监视的事件列表。
- —timefmt 是指定时间的输出格式。 FMT:
# --timefmt '%y-%m-%d %H:%M'
- —format 指定文件变化的详细信息。FMT:
# --format '%T %f %e'
- —outfile 将事件输出到指定文件,而不输出到屏幕
- -d|—daemon 以守护进程方式后台运行(除了在后台运行外,与 -m 选项一样)
可监听的事件:
- access:访问,读取文件
- modify:修改,文件内容被修改
- attrib:属性,文件元数据被修改
- move:移动,对文件进行移动操作
- create:创建,生成新文件
- open:打开,对文件进行打开操作
- close:关闭,对文件进行关闭操作
- delete:删除,文件被删除
示例:
打开两个终端,在终端1中执行如下命令
/usr/bin/inotifywait -mrq -e 'create,delete,close_write,attrib,moved_to' \
--timefmt '%Y-%m-%d %H:%M' --format '%T %f %e' /tmp/
在终端2中新建测试文件,可以看到终端1中会打印出文件变化日志
2020-07-13 14:58 test.txt CREATE
2020-07-13 14:58 test.txt ATTRIB
2020-07-13 14:58 test.txt CLOSE_WRITE,CLOSE
实时文件同步
使用 inotify
监控指定文件夹文件变化,并通过 rsync
服务同步推送文件到目标服务器同步。
示意图如下:
操作流程:
1. 服务器间建立 ssh key 信任关系,可以通过 ssh 免密登陆
2. 在 server_01
服务器上添加如下脚本,并修改需监控的文件夹路径
directory
路径必须在两台服务器均已存在
inotify-rsync.sh
脚本代码如下:
#!/usr/bin/env bash
dest_host="192.168.1.100"
directory="/data/"
rsync_user="root"
echo "===========rysnc ${directory} to ${dest_host}:${directory}==========="
/usr/bin/rsync --archive --verbose --update --links --hard-links \
--perms --owner --group --times \
--delete --partial --timeout=30 --progress --compress \
${directory} ${rsync_user}@${dest_host}:${directory}
inotify_cmd="/usr/bin/inotifywait -mrq -e modify,create,delete,attrib,move ${directory}"
rsync_cmd="/usr/bin/rsync -avzplHog --delete ${directory} ${rsync_user}@${dest_host}:${directory}"
${inotify_cmd} | while read DIRECTORY EVENT FILE; do
${rsync_cmd} >/dev/null
done
3. 启动脚本,开启同步。
nohup inotify_rsync.sh > rsync_replay.log 2>&1 &