首页 > 技术文章 > Inotify

abc1234567 2020-12-25 23:57 原文

实时复制说明

1.实时复制软件会监控磁盘文件系统的变化,比如指定的/data目录,实时复制软件进程会实时监控这个/data

目录中对应文件系统数据的变化。

2. 一旦/data目录文件发生变法,就会执行rsync命令,将变化的数据推送到备份服务器对应的备份目录中。 

实时复制软件介绍

企业常用实时复制软件有如下两款

软件 依赖程序 部署难点 说明
Inotify-tools Rsync守护进程 复制脚本 监控目录数据变化
Sersync* Rsync守护进程 配置文件 监控目录数据变化

 

Inotify机制

Inotify是一种异步的系统事件监控机制,通过Inotify可以监控文件系统中添加,删除,修改等事件,利用这个

内核接口,第三方软件可以监控文件系统下的情况变化。

那么Inotify-tools就是该类技术的实现,是一个监控指定目录数据实时变化的软件。

实现了Inotify的软件还有Sersync,Inotify-tools

【Inotify机制的优点】、

  1. 监控文件系统的事件变化,通过复制工具实现实时数据复制

  2. 支持多线程实时复制

【Inotify的缺点】

  1. 实测当文件数量大于200(10-100kb),复制存在延迟

 

Inotify+Rsync实施复制实战

无论是Inotify-tools还是Sersync,本身的核心功能都是监控指定目录内的数据变化,具体的复制当远程

服务器的功能还是借助Rsync工具配合,Inotify机制软件工作流程如下。

  1. 备份源客户端开机运行Inotify软件,检测指定目录的文件系统变化。

  2. 一旦获取到指定监控目录的数据发生变化,即刻执行Rsync命令复制数据。

  3. 将变化的数据发送到Rsync服务端的备份目录。

 

项目部署实施

【1.确保远程数据传输服务部署完成】

前提配置好Rsync Daemon模式

也就是可以在客户端机器,推送、拉取数据到BACKUP服务器,才能配置Inofity-tools

将rsync守护进程模式部署完毕
rsync服务端部署
a 检查rsync软件是否已经安装
b 编写rsync软件主配置文件
c 创建备份目录管理用户
d 创建备份目录,并进行授权
e 创建认证文件,编写认证用户和密码信息,设置文件权限为600
f 启动rsync守护进程服务

   

【在NFS01机器配置】

rsync客户端部署
a 检查rsync软件是否已经安装    
b 创建认证文件,编写认证用户密码信息即可,设置文件权限为600
c 利用客户端进行数据同步测试

当前也就是rsync客户端机器,配置如下部署
1.设置密码环境变量,方便的使用rsync命令
[root@nfs01 ~]# echo "export RSYNC_PASSWORD=chaoge"  >> /etc/bashrc

2.加载配置文件
source /etc/bashrc

3.检查环境变量
[root@nfs01 ~]# echo $RSYNC_PASSWORD
chaoge

4.作为Rsync客户端,测试推送和拉取数据是否正常
#推送本地数据给Rsync服务端
[root@nfs01 ~]# rsync -avz /data/ rsync_backup@192.168.178.110::backup

5.拉取服务端资料
[root@nfs01 ~]# rsync -avz rsync_backup@192.168.178.110::backup  /tmp

  

【检查Linux版本是否支持Inotify机制】

只有Linux内核版本在2.6.13起才支持,以及是否存在三个系统文件,存在则支持

1.检查linux内核版本
[root@nfs01 ~]# uname -r
3.10.0-1062.9.1.el7.x86_64

2.检查Inotify相关文件
[root@nfs01 ~]# ls -l /proc/sys/fs/inotify/
总用量 0


[root@nfs01 ~]# cd /proc/sys/fs/inotify/
[root@nfs01 inotify]# ll
总用量 0
-rw-r--r-- 1 root root 0 2018-02-25 19:45 max_queued_events    
-rw-r--r-- 1 root root 0 2018-02-25 19:45 max_user_instances
-rw-r--r-- 1 root root 0 2018-02-25 19:45 max_user_watches
max_user_watches:    设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
默认只能监控8192个文件

max_user_instances:    设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
默认每个用户可以开启inotify服务128个进程

max_queued_events:    设置inotify实例事件(event)队列可容纳的事件数量
默认监控事件队列长度为16384

  

【Inotify-tools工具安装】

1.yum安装,需配置epel源
[root@nfs01 ~]# yum install inotify-tools -y

2.检查软件
[root@nfs01 ~]# rpm -ql inotify-tools|head -2
/usr/bin/inotifywait        # 重要软件命令
/usr/bin/inotifywatch        # 重用软件命令

  

 【Inotify命令工具】

上述操作我们安装好了Inotify-tools软件,生成2个重要的命令

  1. inotifywait:在被监控的目录等待特定文件系统事件(open,close,delete等事件),执行后处于

          阻塞状态,适合在shell脚本中使用,是实现监控的关键。

  2. inotifywatch:收集被监控的文件系统使用的统计数据(文件系统事件发生的次数统计)

【inotifywait命令解释】

inotifywait用于等待文件或文件集上的一个待定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树;

inotifywatch用于收集被监控的文件系统计数据,包括每个inotify事件发生多少次等信息

从上面可知inotifywait是一个监控事件,可以配合shell脚本使用它。与它相关的参数:

语法格式:inotifywait [-hcmrq][-e][-t][–format][-timefmt][…]

-m: 即“–monitor” 表示始终保持事件监听状态。

-d:类似于-m参数,将命令运行在后台,记录出发的事件信息,记录在指定文件里,加上--outfile参数

-r: 即“–recursive” 表示递归查询目录

-q: 即“–quiet” 表示打印出监控事件

-o: 即“–outfile” 输出事情到一个文件而不是标准输出

-s: 即“–syslog” 输入错误信息到系统日志

-e: 即“–event”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等

-format: 指定输出格式;常用的格式符如:

%w:表示发生事件的目录

%f:表示发生事件的文件

%e:表示发生的事件

%Xe:事件以“X”分隔

%T:使用由-timefmt定义的时间格式

-timefmt:指定时间格式,用于-format选项中的%T格式

  利用 inotify 软件监控的事件主要是如下

Events    含义
access    文件或目录被读取
modify    文件或目录内容被修改
attrib    文件或目录属性被改变
close    文件或目录封闭,无论读/写模式
open    文件或目录被打开
moved_to    文件或目录被移动至另外一个目录
move    文件或目录被移动到另一个目录或从另一个目录移动至当前目录
create    文件或目录被创建在当前目录
delete    文件或目录被删除
umount    文件系统被卸载

  Inotify 可监控的事件

可监控的事件
有几种事件能够被监控。一些事件,比如 IN_DELETE_SELF 只适用于正在被监控的项目,而另一些,比如 IN_ATTRIB 或者 IN_OPEN 则只适用于监控过的项目,或者如果该项目是目录,则可以应用到其所包含的目录或文件。

IN_ACCESS
被监控项目或者被监控目录中的条目被访问过。例如,一个打开的文件被读取。
IN_MODIFY
被监控项目或者被监控目录中的条目被修改过。例如,一个打开的文件被修改。
IN_ATTRIB
被监控项目或者被监控目录中条目的元数据被修改过。例如,时间戳或者许可被修改。
IN_CLOSE_WRITE
一个打开的,等待写入的文件或目录被关闭。
IN_CLOSE_NOWRITE
一个以只读方式打开的文件或目录被关闭。
IN_CLOSE
一个掩码,可以很便捷地对前面提到的两个关闭事件(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)进行逻辑操作。
IN_OPEN
文件或目录被打开。
IN_MOVED_FROM
被监控项目或者被监控目录中的条目被移出监控区域。该事件还包含一个 cookie 来实现 IN_MOVED_FROM 与 IN_MOVED_TO 的关联。
IN_MOVED_TO
文件或目录被移入监控区域。该事件包含一个针对 IN_MOVED_FROM 的 cookie。如果文件或目录只是被重命名,将能看到这两个事件,如果它只是被移入或移出非监控区域,将只能看到一个事件。如果移动或重命名一个被监控项目,监控将继续进行。参见下面的 IN_MOVE-SELF。
IN_MOVE
可以很便捷地对前面提到的两个移动事件(IN_MOVED_FROM | IN_MOVED_TO)进行逻辑操作的掩码。
IN_CREATE
在被监控目录中创建了子目录或文件。
IN_DELETE
被监控目录中有子目录或文件被删除。
IN_DELETE_SELF
被监控项目本身被删除。监控终止,并且将收到一个 IN_IGNORED 事件。
IN_MOVE_SELF
监控项目本身被移动。

  测试create事件

# 语法
inotifywait -mrq --timefmt "%F" --format "%T %w%f 事件信息:%e" /data  <-- 相对完整的命令应用

# 指定事件监控
inotifywait -mrq --timefmt "%F" --format "%T %w%f 事件信息:%e" -e create /data  

# 实际案例,监控/data目录的创建
[root@nfs01 ~]# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T%w%f' -e create /data
# 参数解释
-m: 即“–monitor” 表示始终保持事件监听状态。
-r: 即“–recursive” 表示递归查询目录
-q: 即“–quiet” 表示打印出监控事件
--timefmt:指定时间格式
%m  月份(以01-12来表示)。
%d  日期(以01-31来表示)。
 %y  年份(以00-99来表示)。

%w:表示发生事件的目录
%f:表示发生事件的文件
%T:使用由-timefmt定义的时间格式
%e:表示发生的事件

#日志检测
16/03/20 09:26/data/超哥带你学inotify.txt
16/03/20 09:26/data/嗨起来
16/03/20 09:27/data/今天是个好日子.txt

-e: 即“–event”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等

  

 

 

 

 

 

 

 

 

   测试delete事件

1.在NFS01客户端机器上检测inotify功能,检测delete事件,只有在该目录下的删除动作,才会触发监控
[root@nfs01 ~]# inotifywait -mrq --format '%w%f' -e delete /data

2.再开一个终端,进行删除动作
[root@nfs01 data]# rm -rf 爱的魔力转圈圈.txt

  close_write事件

检测不同的时间,其实就是-e参数指定的不同,其实很简单
[root@nfs01 ~]# inotifywait -mrq --format '%w%f' -e close_write /data

  

 

 

 

Inotify增删改事件

重要事件 包含事件 说明
close close_write,close_nowrite 文件或目录关闭,不管是读还是写都包含关闭操作
close_write create 含创建文件事件,不含创建目录事件,自身有修改事件
move moved_to,moved_from 文件或目录无论是移动,移除监控目录,都被监控

 

扩展:sed命令触发器

在NFS01上开启Inotify监控功能

1.监控所有事件,且格式化输出
[root@nfs01 ~]# inotifywait -mrq /data --format "%w%f 事件:%e"

  

 

 

 

利用sed修改文件内容

# 替换chaoge.txt的内容,且进行备份,旧内容在chaoge.txt.bak  ,替换后内容在chaoge.txt
[root@nfs01 data]# sed -i.bak  's/默认监控所有事件/超哥带你学inotify事件/g' /data/chaoge.txt

# sed修改文件事件如下
1. 创建临时文件
2. 把源文件内容放入临时文件中
3. 修改临时文件内容
4. 对源文件进行备份 -i.bak ---- chaoge.txt.bak
5. 对临时文件重命名为chaoge.txt

  

 

 

 

Inotify-tools软件部署实战

手工配置inotify的监控事件,增删改查

# 检测目录的增删改事件
[root@nfs01 ~]# inotifywait -mrq --timefmt "%y-%m-%d %T"   --format "%T  %w%f 当前事件有:%e" -e close_write,delete  /data/

  

再开一个终端,修改数据

[root@nfs01 data]# touch /data/超哥带你学inotify.txt
[root@nfs01 data]# echo "超哥带你飞" >> /data/超哥带你学inotify.txt.bak
[root@nfs01 data]#
[root@nfs01 data]# rm -rf /data/*

#Inotify能够检测到如下信息
/data/超哥带你学inotify.txt
/data/超哥带你学inotify.txt.bak
/data/chaoge.txt
/data/chaoge.txt.bak
/data/超哥带你学inotify.txt.bak
/data/嗨起来

  

编写实时监控和复制脚本

1.生成一个数字1,2,3的文件
seq 3 > /tmp/chaoge.txt

2.编写一个脚本,能够循环读取文件内容
[root@nfs01 tmp]# cat test.sh
cat ./chaoge.txt | \
while read line
do
  echo $line
done

3.检查文件
[root@nfs01 tmp]# ls
chaoge.txt  test.sh

4.执行该脚本,-x参数执行脚本,输出执行过程,调试利器,也可以不加
[root@nfs01 tmp]# sh -x test.sh
+ read line                    #按行读取
+ cat ./chaoge.txt  #读取文件
+ echo 1    #输出1
1
+ read line                #按行读取
+ echo 2                    #输出2
2
+ read line
+ echo 3
3
+ read line

  【操作实时同步的脚本】

1.创建统一管理脚本的文件夹
[root@nfs01 tmp]# mkdir -p /MyInotify/scripts

2.创建针对事件变化完整复制的脚本 monitor.sh
[root@nfs01 scripts]# cat monitor.sh
#!/bin/bash
cmd="/usr/bin/inotifywait"
$cmd -mrq --timefmt "%y-%m-%d %T"   --format "%T  %w%f 当前事件有:%e"  -e close_write,delete /data | \
while read line
do
        cd /data && \
        rsync -az --delete ./ rsync_backup@192.168.178.139::backup
done


--------------------------------------------------------------------------------------------

  【在nfs01机器上执行脚本】

[root@nfs01 scripts]# sh -x  monitor.sh

  

 

 

测试脚本没问题后,可以将脚本运行在后台,实时监听文件变化,进行同步,保证数据备份安全
1.脚本放置后台运行,在前台运行会占用终端,且终端关了,任务会断
[root@nfs01 scripts]# /bin/sh /MyInotify/scripts/monitor.sh &>/dev/null &
[1] 3004
[root@nfs01 scripts]# jobs
[1]+  运行中               /bin/sh /MyInotify/scripts/monitor.sh &>/dev/null &
[root@nfs01 scripts]#

2.该任务添加至开机启动文件
[root@nfs01 scripts]# tail -2 /etc/rc.local
# inotify + rsync  script by chaoge
/bin/sh /MyInotify/scripts/monitor.sh &>/dev/null &

  

Inotify优化参数

有关inotify的内核参数文件,可以针对企业需求进行优化,修改如下
[root@nfs01 scripts]# cat /proc/sys/fs/inotify/max_*
16384
128
8192

[root@nfs01 scripts]# echo "50000000" > /proc/sys/fs/inotify/max_user_watches
[root@nfs01 scripts]# echo "50000000" > /proc/sys/fs/inotify/max_queued_events

  

推荐阅读