inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了inotify支持,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施这样监控的软件。国人周洋在金山公司开发的sersync。
inotify实际是一种实际驱动机制,它为应用程序监控文件系统事件提供了实时响应事件的机制,而无需通过诸如cron等的轮询机制来获取事件。cron等机制不仅无法做到实时性,而且消耗大量系统资源。相比之下,inotify基于事件驱动,可以做到事件处理的实时响应,也没用轮询造成的系统资源消耗,是非常自然的事件通知接口,也与自然世界的事件机制相符合。
inotify的实现由几款软件:inotify-tools、sersync(金山周洋)、isyncd
特别说明:下面的inotify配置是建立在rsync服务基础上的配置过程。
本例是在nfs服务器上面搭建inotify-tools
inotify实时准备
大前提rsync daemon服务配置成功,可以再rsync客户端推送拉去数据,然后才能配置inotify服务。
2.开始安装
在安装inotify-tools前请确认你的linux内核是否达到2.6.13,并且在编译时开启CONFIG INOTIFY选项,也可以通过以下命令检测。
2.1查看当前系统是否支持inotify
在nfs服务器上面操作:
[root@oldboy ~]# uname -r
2.6.32-642.el6.x86_64
[root@oldboy ~]# ls -l /proc/sys/fs/inotify
total 0
-rw-r--r-- 1 root root 0 Aug 8 23:48 max_queued_events
-rw-r--r-- 1 root root 0 Aug 8 23:48 max_user_instances
-rw-r--r-- 1 root root 0 Aug 8 23:48 max_user_watches
需要出现这个三个max才可以。
查看有没有安装inotify-tools
[root@oldboy ~]# rpm -qa inotify-tools
如果没有安装要yum安装以下,前提是机器可以上网。
2.2下载inotify源码包
[root@oldboy ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
--2017-08-09 00:05:15-- http://mirrors.aliyun.com/repo/epel-6.repo
Resolving mirrors.aliyun.com... 112.124.140.210, 115.28.122.210
Connecting to mirrors.aliyun.com|112.124.140.210|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1083 (1.1K) [application/octet-stream]
Saving to: “/etc/yum.repos.d/epel.repo”
100%[=================================================>] 1,083 --.-K/s in 0s
2017-08-09 00:05:15 (91.5 MB/s) - “/etc/yum.repos.d/epel.repo” saved [1083/1083]
安装
[root@oldboy ~]# yum install inotify-tools -y
Loaded plugins: fastestmirror, security
Setting up Install Process
Loading mirror speeds from cached hostfile
* base: mirrors.nju.edu.cn
* epel: mirrors.aliyun.com
* extras: mirrors.nju.edu.cn
* updates: mirrors.cqu.edu.cn
epel | 4.3 kB 00:00
epel/primary_db | 5.9 MB 00:20
Resolving Dependencies
--> Running transaction check
---> Package inotify-tools.x86_64 0:3.14-1.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=====================================================================================================================================
Package Arch Version Repository Size
=====================================================================================================================================
Installing:
inotify-tools x86_64 3.14-1.el6 epel 46 k
Transaction Summary
=====================================================================================================================================
Install 1 Package(s)
Total download size: 46 k
Installed size: 104 k
Downloading Packages:
inotify-tools-3.14-1.el6.x86_64.rpm | 46 kB 00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : inotify-tools-3.14-1.el6.x86_64 1/1
Verifying : inotify-tools-3.14-1.el6.x86_64 1/1
Installed:
inotify-tools.x86_64 0:3.14-1.el6
Complete!
安装完成。
工具集介绍:
一共安装了2个工具(命令),即inotifywait和inotifywatch
inotifywait:在被监控的文件或目录上等待待定文件系统事件(open、close、delete)发生,
执行后处于阻塞状态,适合在shell脚本中使用。
inotifywatch:收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统计。
举例:1.监控创建:
[root@oldboy ~]# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create /backup
再开一个窗口,在cd /backup目录中touch a b
在刚才第一个创建就出现:
[root@oldboy ~]# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create /backup
09/08/17 00:21 /backup/a
09/08/17 00:21 /backup/b
说明创建成功。
2.监控创建,删除。
[root@oldboy ~]# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,delete /backup
3.测试创建新文件和修改文件。
[root@oldboy ~]# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write /backup
共享存储实时备份(共享存储的单点解决方案)
第一个里程碑
a.实现从nfs客户端到rsync服务端的rsync服务部署
第二个里程碑
b.实现从nfs客户端对nfs目录文件系统事件的实时监控。
第三个里程碑
c.当监控到nfs目录文件系统事件变化后,出发rsync推送变化的文件。
方法1:(下面脚本格式一定不能变,否则sh inotify.sh的时候会报错)
/usr/bin/inotifywait -mrq --format '%w%f' -e close_write,delete /data \
|while read file
do
cd /data &&\
rsync -az ./ --delete rsync_backup@172.16.1.41::nfsbackup --password-file=/etc/rsync.password
done
上面的脚本写到/server/scripts/inotify.sh文件中,文件是不存在的,得手动创建。
[root@oldboy scripts]# cat inotify.sh
/usr/bin/inotifywait -mrq --format '%w%f' -e close_write,delete /data \
|while read file
do
cd /data &&\
rsync -az ./ --delete rsync_backup@172.16.1.41::nfsbackup --password-file=/etc/rsync.password
done
然后在nfs服务器上面运行命令
[root@oldboy scripts]# sh inotify.sh
在backup-41服务器上面输入
[root@backup ~]# cd /nfsbackup
[root@backup nfsbackup]# rm -fr *
[root@backup nfsbackup]# watch -n1 ls
再把nfs-31服务器重新添加一个会话,然后再:
[root@oldboy ~]# cd /data
[root@oldboy data]# rm -f a
[root@oldboy data]# touch a
[root@oldboy data]# touch b
[root@oldboy data]# touch c
[root@oldboy data]# touch d
来个更狠的直接用循环语句创建1000个stu1-stu1000个文件
[root@oldboy data]# for n in `seq 1000`;do touch stu$n;done
再到backup-41服务器上面查看会同步a b c d 1000个文件
如果不想实现同步,就到nfs31机器中把sh inotify.sh终止,然后输入sh -x inotify.sh就不会在
backup服务器上面同步数据了。
nfs服务器inotify.sh的脚本可以修改为:
Path=/data
Ip=172.16.1.41
/usr/bin/inotifywait -mrq --format '%w%f' -e close_write,delete Path |whilereadfiledocdPath &&\
rsync -az ./ --delete rsync_backup@$Ip::nfsbackup --password-file=/etc/rsync.password
done
查看有多少行ls|wc -l
本文转自sandshell博客51CTO博客,原文链接http://blog.51cto.com/sandshell/1954651如需转载请自行联系原作者
sandshell