inotify + rsync,inotifyrsync


       Linux内核从2.6.13开始,引入了inotify机制。通过intofity机制,能够对文件系统的变化进行监控,如对文件进行创建、删除、修改等操作,可以及时通知应用程序进行相关事件的处理。这种响应处理机制,避免了频繁的文件轮询任务,提高了任务的处理效率。

 

 

一、检查安装
检查系统内核版本

# uname -a  

检查系统是否支持inotify

# ls -lsart /proc/sys/fs/inotify  
total 0  
0 dr-xr-xr-x 0 root root 0 Sep 19 09:38 ..  
0 -rw-r--r-- 1 root root 0 Jan  1 13:51 max_user_watches  
0 -rw-r--r-- 1 root root 0 Jan  1 13:51 max_user_instances  
0 -rw-r--r-- 1 root root 0 Jan  1 13:51 max_queued_events  
0 dr-xr-xr-x 0 root root 0 Jan  1 13:51 .  

 

如果出现上面结果说明系统支持inotify

 

notify是一个API,需要通过开发应用程序进行调用,对于大多数用户来讲这有着许多不便,inotify-tools的出现弥补了这一不足。
inotify-tools是一套组件,它包括一个C库和几个命令行工具,这些命令行工具可用于通过命令行或脚本对某文件系统的事件进行监控。

 

下载安装

#wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz  
  
# tar -zvxf inotify-tools-3.14.tar.gz  
# cd inotify-tools-3.14  
  
[root@ inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify  
[root@ inotify-tools-3.14]# make  
[root@ inotify-tools-3.14]# make install  

  

或者使用yum

yum install inotify-tools


其它的一些notify工具(参考)

inotify 的实现有几款软件
1)inotify-tools,
2)sersync(金山周洋)
3)lsyncd

 

二、命令讲解

inotify-tools提供的两个命令行工具:

inotifywait:通过inotify API等待被监控文件上的相应事件并返回监控结果
                   默认情况下,正常的结果返回至标准输出,
                   诊断类的信息则返回至标准错误输出。
                   它可以在监控到对应监控对象上指定的事件后退出,也可以进行持续性的监控。

inotifywatch:通过inotify API收集被监控文件或目录的相关事件并输出统计信息。


inotifywait:

常用参数:  
--timefmt 时间格式   %y年 %m月 %d日 %H小时 %M分钟  
--format  输出格式   %T时间 %w路径 %f文件名 %e状态 
-m --monitor     始终保持监听状态默认触发事件即退出-r --recursive  递归查询目录  
-q              打印出监控事件  

 

-e --event     定义监控的事件,可用参数:

Events:
access          file or directory contents were read         文件读取
modify           file or directory contents were written     文件更改
attrib              file or directory attributes changed          文件属性更改
close_write    file or directory closed, after being opened in                 以只读模式打开的文件被关闭
                      writeable mode
close_nowrite    file or directory closed, after being opened in             以只读模式打开的文件被关闭
                          read-only mode
close             file or directory closed, regardless of read/write mode      文件被关闭,不管它是如何打开的
open              file or directory opened
moved_to       file or directory moved to watched directory         移入监听目录 即使是在同一目录内移动,此事件也触发
moved_from    file or directory moved from watched directory   移除监听目录 即使是在同一目录内移动,此事件也触发
move             file or directory moved to or from watched directory   包括moved_to和 moved_from
create           file or directory created within watched directory
delete           file or directory deleted within watched directory
delete_self    file or directory was deleted                                      文件或目录移除,之后不再监听此文件或目录
unmount       file system containing file or directory unmounted

 

做个小实验,监控一个目录 

# inotifywait -rm ./test

在另一个终端对目录进行操作

# touch /root/test/abc
# rm /root/test/abc  

第一个终端显示的 状态改变

# inotifywait -rm ./test
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
./test/ CREATE abc
./test/ OPEN abc
./test/ ATTRIB abc
./test/ CLOSE_WRITE,CLOSE abc
./test/ OPEN,ISDIR 
./test/ CLOSE_NOWRITE,CLOSE,ISDIR 
./test/ OPEN,ISDIR 
./test/ CLOSE_NOWRITE,CLOSE,ISDIR 
./test/ DELETE abc

  

 inotifywatch

inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]


参数:

-h,–help    # 输出帮助信息
-v,–verbose # 输出详细信息
@             # 排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
–fromfile    # 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-z,–zero    # 输出表格的行和列,即使元素为空
–exclude     # 正则匹配需要排除的文件,大小写敏感。
–excludei    # 正则匹配需要排除的文件,忽略大小写。
-r,–recursive  # 监视一个目录下的所有子目录。
-t,–timeout    # 设置超时时间
-e,–event      # 只监听指定的事件。  监听事件同上
-a,–ascending  # 以指定事件升序排列。
-d,–descending # 以指定事件降序排列

  同样做个实验,统计 /home 目录发生事件的次数

# inotifywatch -v -e create -e modify -e delete -t 30 -r /home 

在新打开的终端上,创建了4个文件,修改了3个文件内容,删除了一个文件。
等监控的30秒时间到了之后,他就会显示出上面的事件次数报告!

# inotifywatch -v -e create -e modify -e delete -t 30 -r /home
Establishing watches...
Setting up watch(es) on /home
OK, /home is now being watched.
Total of 3 watches.
Finished establishing watches, now collecting statistics.
Will listen for events for 60 seconds.
total  modify  create  delete  filename
8       3        4       1     /home/

  

 

三、实际操作

以下为生产环境 使用脚本:

监控源目标文件,发生变化立刻同步

#!/bin/sh
SRC=/var/www/channel/
DST=/var/www/webroot/channel/
INWT=/usr/local/bin/inotifywait
RSYNC=/usr/bin/rsync
$INWT -mrq -e create,move,delete,modify $SRC | while read D E F;do
            rsync -aHqzt $SRC $DST
done

  inotifywait 产生的数据

# inotifywait -mrq -e create,move,delete,modify ./test/
./test/ DELETE abc

目录 事件 文件名    
分别写进 D E F变量里,一旦有变量写入立即执行 同步操作 

 

一个复杂的脚本

按照事件类型 分格式写入日志

#!/bin/bash
inotifywait -mrq --timefmt '%y/%m/%d %H:%M' --format  '%T %w%f %e' --event delete,modify,create,attrib  /data/web | while read  date time file event
  do
      case $event in
          MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
                  echo $event'-'$file'-'$date'-'$time >> /var/log/web_watch.log
              ;;
   
          MOVED_FROM|MOVED_FROM,ISDIR|DELETE|DELETE,ISDIR)
                  echo $event'-'$file'-'$date'-'$time /var/log/web_watch.log
              ;;
      esac
  done

inotifywait 产生的数据

# inotifywait -mrq --timefmt '%y/%m/%d %H:%M' --format '%T %w%f %e' --event delete,modify,create,attrib ./test/

17/10/10 17:31 ./test/abc CREATE
17/10/10 17:31 ./test/abc ATTRIB

 

四、inotify 系统参数 设置

在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制
max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。

 

五、inotify+rsync

Rsync(remote sync)远程同步工具,通过rsync可以实现对远程服务器数据的增量备份同步,但rsync自身也有瓶颈,同步数据时,rsync采用核心算法对远程服务器的目标文件进行比对,只进行差异同步。

我们可以想象一下,如果服务器的文件数量达到了百万甚至千万量级,那么文件对比将是非常耗时的。而且发生变化的往往是其中很少的一部分,这是非常低效的方式。
inotify的出现,可以缓解rsync不足之处,取长补短

 

 


相关内容

    暂无相关文章