2020-03-10 实时复制Inotify机制介绍

1. Inotify机制介绍

Inotify是一种异步的系统事件监控机制,Linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除、修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而Inotify-tools正是实施这类监控的软件。实际上Inotify-tools是一个监控指定目录数据实时变化的软件程序。
Inotify程序原理上是一种事件驱动机制,它为应用程序监控文件系统事件提供了实时响应事件的机制,可以做到对事件处理的实时响应。
Inotify的实现有Inotify-tools、Sersync几款软件。
提示:Sersync软件是在Inotify的基础上进行并发的,功能要更加强大些,支持配置文件配置,多了定时重试复制机制、过滤机制,提供接口做CDN数据更新,支持多线程操作。
(1)Inotify机制的优点

  • 监控文件系统事件变化,通过复制工具实现实时数据复制。
  • 支持多线程实时复制。

(2)Inotify机制的缺点

  • 实测并发如果大于200个文件(10~199KB),复制会有延迟。

2. Inotify+Rsync实时复制项目实战

不管是Inotify-tools还是Sersync,本身的核心功能都只是监控指定目录内的数据变化,具体的复制到远端服务器的功能还是需要Rsync工具配合的,这些软件几乎都是在Inotify机制接口之上的软件封装,软件具体工作机制流程如下:
1)备份源客户端开启运行Inotify软件服务进程,监测指定目录的文件系统变化。
2)一旦获取到指定监测目录的数据发生变化,即执行rsync命令复制数据。
3)将变化的数据发送到Rsync服务器端(也可执行scp、Rsync远程Shell模式)的备份目录中。
特别说明:下面的Inotify配置是建立在Rsync服务搭建完成并确认无误的基础上的配置过程。

3. 项目部署实施

3.1 部署环境准备

(1)确保远程数据传输服务部署完成
大前提是Rsync Daemon服务配置成功,可以在NFS01上推送、拉取数据到BACKUP备份服务器,然后才能配置Inotify-tools工具服务。
NFS01服务器作为Rsync服务的客户端需要做如下部署:

[root@nfs01 ~]# echo 'export RSYNC_PASSWORD=oldboy' >> /etc/bashrc    ---采用密码环境变量的方式,配置永久生效
[root@nfs01 ~]# tail -1 /etc/bashrc
export RSYNC_PASSWORD=oldboy
[root@nfs01 ~]# echo $RSYNC_PASSWORD
oldboy

作为Rsync服务的客户端NFS01服务器配置好后,需测试推送和拉取数据信息,下面是检查过程。

[root@nfs01 ~]# rsync -avz /data [email protected]::backup/    ---执行推送数据,/data为NFS01的共享目录
sending incremental file list    ---出现以下几行提示信息表示,从NFS01到BACKUP服务器的Rsync服务环境是正常的
data/
data/oldboy.txt
data/oldgirl.txt
sent 449 bytes  received 135 bytes  50.78 bytes/sec
total size is 0  speedup is 0.00

(2)检查Linux系统支持Inotify实时监控
根据官方说明,只有内核从2.6.13版本起才支持Inotify功能,因此需要在部署实时复制服务之前,查看系统版本以及具体地查看是否支持。
通过检查/proc/sys/fs/inotify目录中是否存在以下3个文件,可以确认系统是否支持实时监控程序。

[root@nfs01 ~]# uname -r
3.10.0-957.el7.x86_64    ---内核是3.10,支持Inotify机制
[root@nfs01 ~]# ls -l /proc/sys/fs/inotify/
总用量 0
-rw-r--r-- 1 root root 0 3月   5 01:33 max_queued_events
-rw-r--r-- 1 root root 0 3月   5 01:33 max_user_instances
-rw-r--r-- 1 root root 0 3月   5 01:33 max_user_watches
说明:显示这3个文件则证明系统支持Inotify程序功能

利用man proc方式可以获取到以上Inotify目录以及下面3个文件的说明信息,根据说明信息,我们可以得知3个文件作用的详细说明。通过man proc获取的内核中Inotify信息说明:/proc/sys/fs/inotify/目录包含了3个文件max_queued_events、max_user_instances、max_user_watches。可以用来限制通过Inotify接口消耗内核内存的数量:更详细信息参见man手册7级别Inotify说明。
上述3个文件的说明如下:

Inotify机制核心参数的作用

上述文件的默认配置信息如下:

[root@nfs01 ~]# cat /proc/sys/fs/inotify/max_user_watches 
8192
[root@nfs01 ~]# cat /proc/sys/fs/inotify/max_user_instances 
128
[root@nfs01 ~]# cat /proc/sys/fs/inotify/max_queued_events 
16384

3.2 Inotify-tools工具安装过程

Inotify-tools工具的安装比较简单,执行如下的命令即可:

[root@nfs01 ~]# yum install -y epel-release    ---需要先安装epel源,默认的官方源没有Inotify-tools工具包
[root@nfs01 ~]# yum install -y inotify-tools    ---下载Inotify软件工具
[root@nfs01 ~]# rpm -ql inotify-tools|head -2
/usr/bin/inotifywait    ---Inotifywait软件命令
/usr/bin/inotifywatch    ---Inotifywatch软件命令

3.3 Inotify工具命令介绍

(1)Inotify-tools工具主要命令
在Inotify-tools软件部署完毕后,主要应用两个命令实现数据信息的监控,一个是利用inotifywait命令实现对数据变化事件的监控;另一个是利用inotifywatch命令实现对数据事件信息的统计。这个两个命令是能够应用好Inotify-tools软件的关键,下面对这两个命令说明如下。

  • inotifywait:在被监控的目录等待特定文件系统事件(open、close、delete等)发生,执行后处于阻塞状态,适合在Shell脚本中使用,此命令是实现监控的重点。
  • inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计。

(2)inotifywait命令参数详细说明

2020-03-10 实时复制Inotify机制介绍_第1张图片
inotifywait命令常用参数

以上主要为命令相关参数,利用Inotify软件主要对数据发生的时间进行实时监控,下表列出了常用监控事件信息。

2020-03-10 实时复制Inotify机制介绍_第2张图片
常用监控文件事件功能参数

根据以上参数信息说明,通过实时数据监控练习来熟悉命令参数的用法。

  • 测试create事件

测试create事件的命令如下。

# 在NFS服务器上开启Inotify相应监控功能。
[root@nfs01 ~]# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T%w%f' -e create /data
---监控/data目录创建事件显示信息
08/03/20 01:36/data/a.txt    ---目录随着下面的操作,文件实时出现
08/03/20 01:36/data/b.txt
# 另外再开启一个NFS服务器连接窗口进行测试上面的验证相关事件。
[root@nfs01 data]# touch a.txt
[root@nfs01 data]# touch b.txt
说明:只监控create创建事件,其他事件并没有进行监控,其他事件发生,监控服务没有信息输出。

上述inotifywait命令语法格式说明详细解释如下图所示。

2020-03-10 实时复制Inotify机制介绍_第3张图片
inotifywait命令语法格式示意图
  • 测试delete事件

测试delete事件的命令如下。

[root@nfs01 ~]# inotifywait -mrq --format '%w%f' -e delete /data
---监控/data目录删除事件,建华监控输出信息。
/data/a.txt
/data/b.txt
# 另外再开启一个NFS服务器连接窗口进行测试验证相关事件。
[root@nfs01 ~]# ls /data
a.txt  nfsdata      oldboy2.txt  oldboy.txt   test
b.txt  oldboy1.txt  oldboy3.txt  oldgirl.txt
[root@nfs01 ~]# rm -f /data/a.txt 
[root@nfs01 ~]# rm -f /data/b.txt
说明:只监控delete删除事件,其他事件并没有进行监控,其他事件发生,监控服务没有信息输出。
  • 测试close_write事件(实际就是监控修改的文件)
    测试close_write事件的命令如下。
# 在NFS服务器上开启Inotify相应监控功能。
[root@nfs01 ~]# inotifywait -mrq --format '%w%f' -e close_write /data
---监控/data目录关闭写事件,简化监控输出信息。
/data/test.txt
/data/oldboy.txt
# 另外再开启一个NFS服务器连接窗口进行测试验证相关事件。
[root@nfs01 ~]# ls /data/
nfsdata  oldboy1.txt  oldboy2.txt  oldboy3.txt  oldboy.txt  oldgirl.txt  test
[root@nfs01 ~]# touch /data/test.txt
[root@nfs01 ~]# echo "I am oldboy." >/data/oldboy.txt 
[root@nfs01 ~]# rm -f /data/oldgirl.txt
# 说明:只监控close_write修改事件,不监控其他事件,那么其他事件发生,监控服务没有信息输出,因此利用监控修改事件,可对目录中文件的创建和修改事件都进行监控,即关闭写事件包含了创建事件。

(3)知识点小结
通过上面的测试实验可以发现,有些监控事件已经包含了其他相应事件的监控功能,因此进行监控时可以根据需求精简相应的监控事件,重要监控事件参数的汇总如下表所示。

2020-03-10 实时复制Inotify机制介绍_第4张图片
重要监控事件参数汇总表

(4)扩展知识:sed替换文件内容操作事件的变化情况
1)首先,创建一个需要用sed命令修改的文件。

# 在NFS服务器上开启Inotify相应监控功能。
[root@nfs01 ~]# inotifywait -mrq /data --format "%w%f 事件:%e"
---监控/data目录所有事件变化信息。
---下面3行为echo "I am oldboy." >>oldboy.txt命令产生的事件。
/data/oldboy.txt 事件:OPEN
/data/oldboy.txt 事件:MODIFY
/data/oldboy.txt 事件:CLOSE_WRITE,CLOSE
---下面3行为cat oldboy.txt命令产生的事件。
/data/oldboy.txt 事件:OPEN
/data/oldboy.txt 事件:ACCESS
/data/oldboy.txt 事件:CLOSE_NOWRITE,CLOSE
# 另外再开启一个NFS服务器连接窗口进行测试验证相应事件。
[root@nfs01 ~]# cd /data/
[root@nfs01 data]# echo "I am oldboy." >>oldboy.txt
[root@nfs01 data]# cat oldboy.txt 
I am oldboy.
I am oldboy.
说明:以上信息为监控目录创建文件所产生的所有事件信息。

2)利用sed命令进行文件内容替换。

# 在NFS服务器上开启inotify相应监控功能。
[root@nfs01 ~]# inotifywait -mrq /backup --format "%w%f 事件:%e"
---监控/data目录所有事件变化信息。
/data/oldboy.txt 事件:OPEN    ---打开要被进行修改的文件
/data/sedCqUhBL 事件:CREATE    ---创建一个临时文件
/data/sedCqUhBL 事件:OPEN    ---打开临时文件
/data/oldboy.txt 事件:ACCESS    ---访问要进行修改的文件
/data/sedCqUhBL 事件:MODIFY    ---修改临时文件属性信息
/data/sedCqUhBL 事件:MODIFY
/data/sedCqUhBL 事件:ATTRIB    ---文件属性发生变化
/data/sedCqUhBL 事件:ATTRIB
/data/oldboy.txt 事件:CLOSE_NOWRITE,CLOSE    ---
/data/sedCqUhBL 事件:CLOSE_WRITE,CLOSE    ---打开要修改的文件,但不进行写入编辑
/data/oldboy.txt 事件:MOVED_FROM    ---移除被进行修改的文件
/data/oldboy.txt.ori 事件:MOVED_TO    ---将被修改的文件进行重命名备份
/data/sedCqUhBL 事件:MOVED_FROM
/data/oldboy.txt 事件:MOVED_TO
---另外再开启一个NFS服务器连接窗口进行测试验证相应事件。
[root@nfs01 ~]# cd /data
[root@nfs01 data]# sed -i.ori 's#oldboy#oldgirl#g' oldboy.txt
---替换测试文件内容
# 说明:以上信息为监控目录替换文件内容所产生的所有事件信息。

3)sed替换文件内容事件变换说明如下:

  • 创建临时文件。
  • 把源文件内容放入到临时文件中。
  • 修改临时文件的内容。
  • 对源文件进行备份-i.ori oldboy.txt.ori。
  • 将临时文件重命名为“oldboy.txt”。

(5)inotifywatch命令说明
通过inotifywatch --help命令获取软件命令参数说明,这个命令参数和inotifywait大多类似,且实际运用得不多,简单说明如下。
测试create事件的命令如下。

# 在NFS服务器上开启Inotify相应监控功能。
[root@nfs01 ~]# inotifywait -mrq --format "%w%f" -e create /data
---监控/data目录创建事件显示信息。
/data/a.txt
/data/b.txt
/data/c.txt
---另外再开启一个NFS服务器连接窗口进行测验创建事件统计功能。
[root@nfs01 data]# inotifywatch -r -t 30 -e create /data/    ---统计30秒内/data目录下创建的事件
Establishing watches...
Finished establishing watches, now collecting statistics.
total  create  filename
3      3       /data/
---另外再开启一个NFS服务器连接窗口创建相应数据文件,触发创建事件。
[root@nfs01 ~]# cd /data
[root@nfs01 data]# touch {a..c}.txt
# 说明:只监控create创建事件,其他事件并没有进行监控,其他事件发生,监控服务没有信息输出。

4. Inotify-tools软件部署项目实战

  1. 手动测试监控目录增删改查的命令
# 在NFS服务器上开启Inotify相应监控功能。
[root@nfs01 ~]# inotifywait -mrq --format '%w%f' -e close_write,delete /data
---同时监控/data目录增删改事件。
/data/new.txt    ---touch new.txt,增加文件带来的事件变化
/data/new.txt    ---修改文件带来的事件变化
/data/new.txt    ---删除文件带来的事件变化
---另外再开启一个NFS服务器连接窗口进行测试验证相应事件。
[root@nfs01 data]# touch new.txt
[root@nfs01 data]# echo oldboy > new.txt
[root@nfs01 data]# cat new.txt 
oldboy
[root@nfs01 data]# rm -f new.txt

2.编写实时监控和复制脚本

[root@nfs01 ~]# seq 3 > test.txt    ---生成3个数字,每行一个到test.txt文件里
[root@nfs01 ~]# cat test.txt     ---查看结果
1
2
3
[root@nfs01 ~]# cat w.sh    ---开发脚本
cat ./test.txt|\    ---按行读取test.txt文件,将每一行赋值给下文的$line变量
while read line    ---循环读取line变量的内容
do
        echo $line    ---打印line变量的内容
done    ---读取完test.txt内容后才会终止循环
[root@nfs01 ~]# sh -x w.sh    ---查看执行原理过程
+ read line
+ cat ./test.txt    ---执行读取test.txt文件,将第一行赋值给line
+ echo 1    ---输出1
1
+ read line    ---按行读取test.txt文件,将第二行复制给line
+ echo 2    ---输出2
2
+ read line    ---按行读取test.txt文件,将第三行复制给line
+ echo 3    ---输出3
3
+ read line

执行的命令和编写的脚本如下:

[root@nfs01 ~]# mkdir /server/scripts/ -p
[root@nfs01 ~]# cd /server/scripts/

脚本1:事件变化完整复制。

[root@nfs01 scripts]# cat monitor1.sh 
#!/bin/sh
cmd="/usr/bin/inotifywait"
$cmd -mrq --format '%w%f' -e close_write,delete /data|\
while read line
do
    cd /data&&\
    rsync -az --delete ./ [email protected]::backup
done

脚本2:区分增改和删事件,进行针对性复制

[root@nfs01 scripts]# cat monitor.sh 
#!/bin/sh
cmd="/usr/bin/inotifywait"
$cmd -mrq --format '%w%f' -e close_write,delete /data|\
while read line
do
    ---删除事件发生复制动作,用rsync命令对整个目录复制
    [ ! -e "$line" ] && cd /data &&\    ---删除文件时,因为文件不存在了,因此只能切到复制目录下
    rsync -az --delete ./ [email protected]::backup && continue
      ---对整个目录进行复制,然后终止当前循环
    ---处理增改事件复制动作,只针对修改的文件进行复制,提升性能
    rsync -az --delete $line [email protected]::backup
done

在NFS01上执行脚本。

# 监控脚本执行效果演示:
[root@nfs01 scripts]# sh monitor.sh    ---也可以sh -x monitor.sh测试观察执行过程

在NFS01上重新打开窗口测试如下命令:

[root@nfs01 ~]# cd /data/
[root@nfs01 data]# rm -f *
[root@nfs01 data]# ls
[root@nfs01 data]# touch {1..5}.txt
说明:手动测试脚本事件触发是否成功

登录BACKUP服务器监控脚本执行效果演示:

[root@backup ~]# ls /backup/
1.txt  2.txt  3.txt  4.txt  5.txt    ---已经复制过来了,说明实时复制成功

测试没有问题后,在NFS01上让脚本在后台运行,并放入/etc/rc.local里。

[root@nfs01 scripts]# /bin/sh /server/scripts/monitor.sh &> /dev/null &    ---表示让脚本在后台运行
[root@nfs01 scripts]# tail -2 /etc/rc.local 
#inotify sync data by oldboy at 202003
/bin/sh /server/scripts/monitor.sh &> /dev/null &    ---放到开机自启动文件里
说明:让脚本在后台运行

至此,使用Rsync+Inotify来实现远程复制已经完成。

5. Inotify-tools软件优化企业案例

利用Inotify对应的proc目录中的3个文件,可以适当对Inotify软件进行优化,企业实战中调整为如下配置:

[root@nfs01 scripts]# echo "50000000" >/proc/sys/fs/inotify/max_user_watches 
---单进程可以监控的文件数量
[root@nfs01 scripts]# echo "50000000" >/proc/sys/fs/inotify/max_queued_events
---列队容纳事件的数量
# 说明:以上配置重启后可能会失效,需要放置在rc.local文件中。
# 设置开机自动进行实时监控优化
[root@nfs01 scripts]# tail -2 /etc/rc.local 
echo "50000000" >/proc/sys/fs/inotify/max_user_watches 
echo "50000000" >/proc/sys/fs/inotify/max_queued_events

你可能感兴趣的:(2020-03-10 实时复制Inotify机制介绍)