rsync+inotify实时文件同步

Rsync

rsync命令是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件。rsync 使用所谓的“rsync 算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。

rsync 命令一般为系统自带,无需另行安装。

Inotify

什么是 inotify?

Inotify 一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、权限属性、删除创建、移动等操作,也就是可以监控文件发生的一切变化。

inotify-tools 是一套 C 开发接口库函数和一组命令行工具,提供 Linux 下 inotify 的简单接口。inotify-tools 安装后会得到 inotifywaitinotifywatch 这两条命令。

安装 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 服务同步推送文件到目标服务器同步。

示意图如下:

rsync+inotify实时文件同步

操作流程:

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 &
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
Linux技术杂烩

使用 bash-it 优化 Linux 终端使用体验

2023-2-3 10:56:08

DockerLinux

docker安装umami统计

2023-2-3 13:18:28

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
搜索