inotify-tools如何做文件数据实时同步

知识点落成文才是硬道理,欢迎大家读他人博客,写自己博客。

前言

在日常的运维工作中,发现经常会处理一些迁移工作,在迁移过程中,难免会涉及到一些文件同步工作,今天这篇chat就来聊聊我经常是怎么去处理这些同步工作的。当然有大佬有其他姿势的都可以留言,欢迎交流。

知识点补充

你了解过哪些可以来操作同步的工具或者命令呢?

  • scp,没错scp算是文件拷贝命令,但是这个过程你也可以简单的认为他是同步的过程。
  • rsync,大家一定不会陌生,非常好用的一款同步工具,操作简单而且功能强大,至于具体的命令参数我就不做详细介绍了,这种网上一抓一大把,一会做场景说明的时候会举例子。
  • inotify-tools,他是linux下监控文件系统事件的工具,尝尝跟rsync来做文件的实时同步。

同步场景

  • 单文件同步,点对点。
  • 多文件同步
  • 准实时同步
  • 点对点实时同步
  • 弹性同步
  • 增量同步

单文件同步,点对点

1
2
3
4
从本地传输到远端:
scp -P 22 a.txt root@10.13.43.126:~
从远端拉取到本地:
scp -P 22 root@10.13.43.126:~/a.txt ./

多文件同步

1
2
3
4
5
6
7
8
9
10
11
确保:
1.安装好rsync
2.配置好相应的module
远端配置,我举个简单的例子:
[rsync_test]
path = /www/gitbook/
read only = no
hosts allow = *
在正常的生产使用,hosts allow需要控制到具体的ip或者段,另外加上hosts deny = *来防止rsync类攻击以及漏洞。
3.保证网络以及权限正常
4.rsync进程是否运行(修改配置文件不用重启)

从本地push文件到远端测试:
rsync-1

准实时同步

我先解释一下这个准实时,其实很简单,新增的文件并不会直接同步到远端,而是周期性的同步,有时间差。这种适用于报表导出等,我规定一个时间去同步文件。

实现逻辑:rsync做好文件同步,crontab配合在做定时同步,常用* * * * *来做准实时同步,每分钟同步一次。

举一个简单的例子来看:

1
2
3
4
5
6
rsync脚本:
#!/bin/bash
/usr/bin/rsync -rt 192.168.1.1::test_moduel/ /www/

crontab定时任务可以这样写:
* * * * * root /bin/sh rsync.sh > /dev/null 2>&1

时间可以自己随意调整,主要是看具体的业务场景。

点对点实时同步

这个同步方式简单解释下,其实就是利用inotify+rsync做文件数据的实时同步,废话不多说,直接举例说明:

首先需要安装inotify。检测你的机器是否支持inotify,检测方法

1
2
3
4
5
ll /proc/sys/fs/inotify,是否有一下三条输出,没有表示不支持
total 0
-rw-r--r-- 1 root root 0 May 7 17:01 max_queued_events
-rw-r--r-- 1 root root 0 May 7 17:01 max_user_instances
-rw-r--r-- 1 root root 0 May 7 17:01 max_user_watches

安装

1
yum install inotify-tools -y

验证本地监听测试

例子:验证我本地/www/abc/的一个目录文件变化,然后做出对应的日志输出。

1
2
命令:
/usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f %e' -e modify,delete,create,move,attrib /www/abc/

参数说明:
|参数|说明
|:–|:–
|-m|持续监听
|-r|使用递归形式监视目录
|-q|减少冗余信息,只打印出需要的信息
|-e|指定要监视的事件,多个时间使用逗号隔开
|–timefmt|时间格式
|–format|监听到的文件变化的信息
对于的参数-e,他可以随意组合事件,可以看下表:
|参数|说明
|:–|:–
|access|访问,读取文件。
|modify|修改,文件内容被修改。
|attrib|属性,文件元数据被修改。
|move|移动,对文件进行移动操作。
|create|创建,生成新文件
|open|打开,对文件进行打开操作。
|close|关闭,对文件进行关闭操作。
|delete|删除,文件被删除。
下面是我做实验的结果,具体可以看下日志和对应的操作:
rsync-2

做了上述验证之后,我们就可以直接进行点对点实时同步验证了。

描述下场景:
A机器:10.17.36.122
B机器:10.17.41.120
A机器的/www/abc/需要跟B机器的/www/abc/进行实时同步
准备:
① B机器上已经配置好rsync module了,module叫:rsync_test
② rsync同步命令:

1
/usr/bin/rsync -rt /www/abc/ 10.17.41.120::rsync_test/

③ 准备好rsync_inotify.sh脚本

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

function inotify_fun(){
/usr/bin/inotifywait -mrq --timefmt '%Y/%m/%d-%H:%M:%S' --format '%T %w %f %e' -e modify,delete,create,move,attrib /www/abc/ | while read file
do
/usr/bin/rsync -rt --progress -v --delete /www/abc/ 10.17.41.120::rsync_test/
done
}

inotify_fun >> /dev/null 2>&1 &

④ 运行测试
A机器上运行脚本:sh rsync_inotify.sh,此脚本后台运行。为了能看到传输效果,我把>> /dev/null 2>&1 &去掉了,可以看到具体的日志。
rsync-3

注意点

① 生产环境如果要使用的话,直接把脚本后台运行。
② rsync的参数可以自己定义,我写了一个–delete的参数,这个在生产环境要谨慎使用。

弹性同步

这个场景比较特殊,是我在运维过程中遇到的,不一定对其他人都适用,有兴趣可以简单了解下。

背景

目前我们用弹性伸缩这个服务比较多,类似阿里云的ess,华为云的as,aws的autoscaling等。熟悉这个服务的同学都知道弹性出来的机器是按照某个镜像产生的,当产生镜像的这个机器(灰度机)中有一个目录需要实时更新,我们不可能每次更新就去创建一个镜像并且更新现有已经弹性出来的机器,这样不仅费劲还费钱。

处理方法

针对这个问题,其实最简单的做法就是在灰度机上做一个定时向某一台机器同步的任务,而这某一台机器就是灰度机自己。这样弹性出来的机器就会从灰度机拉取最新的文件。

举个例子

灰度机ip:192.168.1.1
灰度机上定时任务:

1
* * * * * /usr/bin/rsync -rt /www/abc/ 192.168.1.1::rsync_test/

这样一来,弹性出来的机器都会带上这个定时任务,当192.168.1.1更新了/www/abc/目录下的文件,弹性机器就会每分钟同步一次。

如果想要实时同步,那么可以参考实时同步,在灰度机上做配置即可。

增量同步

关于增量同步,有两个说法:

  1. 文件的增量同步,比如我有1.txt 2.txt,那么我本地新增了一个3.txt,那么传输的时候只会传输3.txt,而不会重新1.txt和2.txt都传输一遍。
  2. 文件内容的增量同步,比如我在1.txt中追加或者删除内容,那么远端会不会同步删除或者更新。

针对上述两个问题,我通常采用的方式就是上rsync_inotify.sh的内容,inotify来检测文件变更,其中有一个参数就是modify和attrib,这两个就可以满足第二条说法。对于第一条大家可以简单了解下rsync的–append参数。

最后

关于同步其实方式很多,选择自己合适的,并且简单的,能满足业务需求的,就够了。