rsync+inotify实时文件同步

rsync+inotify实时文件同步

Rsync

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

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

Inotify

什么是 inotify?

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

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

安装 inotify

  1. 查看系统内核

    shell
    1
    uname -r

    返回值: 3.10.0-862.el7.x86_64

    系统内核需大于 2.6.13

  2. 查看系统是否默认支持 inotify,是否有以下三个文件

    shell
    1
    ls /proc/sys/fs/inotify/

    结果

    结果
    1
    max_queued_events  max_user_instances  max_user_watches
  3. 检查是否有安装 inotify,如果没有就安装

    • CentOS

      shell
      1
      rpm -qa inotify-tools

      安装

      CentOS 需添加 EPEL

      shell
      1
      yum -y install inotify-tools
    • ubuntu

      shell
      1
      dpkg -l | grep inotify

      安装

      shell
      1
      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中执行如下命令

shell
1
2
/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中会打印出文件变化日志

返回值
1
2
3
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
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #!/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. 启动脚本,开启同步。

    shell
    1
    nohup inotify_rsync.sh > rsync_replay.log 2>&1 &
评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...