二、Linux实时同步软件之inotify

Linux实时同步软件之inotify

 

Linux 内核从 2.6.13 版本开始提供了 inotify 通知接口,用来监控文件系统的各种变化情况,如文件存取、删除、移动等。利用这一机制,可以非常方便地实现文件异动告警、增量备份,并针对目录或文件的变化及时作出响应。inotify可以通过调用系统接口,实时监视目录和文件的变化,再结合rsync,实现实时目录同步功能。确定系统内核版本后,就可以安装inotify软件包了。

[root@nfs01 ~]# uname -r
2.6.32-696.el6.x86_64
[root@nfs01 ~]# ls /proc/sys/fs/inotify/
max_queued_events  max_user_instances  max_user_watches
#max_queued_events   表示监控时间队列           默认16384 可以使用cat命令查看
#max_user_instances   表示最多监控实例数        默认128
#max_user_watches     表示每个实例最多监控文件数    默认8192

 

想要修改系统默认值,需要修改/etc/sysctl.conf文件

[root@backup nfs]# vim /etc/sysctl.conf
#末尾添加三行
fs.inotify.max_queued_events =32768
fs.inotify.max_user_instances =1024
fs.inotify.max_user_watches =90000000

 

  • inotify软件安装及使用

1)inotify软件包安装,可以官网下载(http://sourceforge.net/projects/inotify-tools/) 源码包编译安装,也可以yum安装,前提需要配置epel源。

[root@nfs01 ~]#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
[root@nfs01 ~]# yum install -y inotify-tools
[root@nfs01 ~]# rpm -qa inotify-tools
inotify-tools-3.14-1.el6.x86_64

 

2)inotify常用参数

inotify软件安装完成后有两个命令可使用,分别是/usr/bin/inotifywait 和/usr/bin/inotifywatch

inotifywait <--- 实现对数据目录信息变化监控(重点了解的命令)

 

inotifywatch <--- 监控数据信息变化,对变化的数据进行统计

通常我们使用inotifywait命令查看目录信息变化即可,inotifywatch统计功能较少使用

inotifywait命令常用参数主要有下面一些:

命令参数

参数说明

-m|--monitor

始终监听状态

-d|--daemon

后台监听,事件信息会被记录在指定文件中

-r|--recursive

递归监听目录数据变化

-q|--quiet

减少输出内容

--timefmt

设置日期格式 (%F=%Y-%m-%d年-月-日%T=%H:%M:%S 时:分:秒)

--format

设置输出信息的格式(%T 时间 %w监控目录%f变化文件 %e事件信息)

-e

指定检测的动作 ( closewrite 修改create创建 delete删除 movedto移动 )

 

例:inotify -mrq --timefmt "%F %T" --format "%T %w/%f %e" \

-e creat,delete,movedto,closewrite /data

 

  • inotify+rsync实时同步

1)实现原理

inotify可以实现对特定的目录进行持续的数据监控,而rsync的--delete参数可以实现客户端和服务端指定的一个目录数据无差异同步功能,当inotify监控到目录数据变化时,可以通过脚本调用rsync服务,从而实现实时同步的功能。

2)rsync服务搭建

实现实时同步,首先保证服务端和客户端的rsync安装配置完成(上一篇介绍rsync服务部署),即客户端可以向备份服务器推送文件,测试如下:

[root@nfs01 ~]# rsync -az /etc/sysconfig rsync_backup@172.16.1.41::nfs --password-file=/etc/rsync.password
#客户端推送
[root@backup ~]# ls /nfs
sysconfig
#服务端收到

 

 3)编写脚本

inotify安装完成后,使用/usr/bin/inotifywait实时监控目录,当目录数据出现变化时,调用rsync服务,通过脚本实现:

#!/bin/bash
#inotify+rsync backup /data
/usr/bin/inotifywait -mrq --format "%w%f" -e create,delete,moved_to,close_write /data |\
while read line
do
rsync -az /data/ --delete rsync_backup@172.16.1.41::nfs --password-file=/etc/rsync.password
done

 

 

 4)运行脚本,测试

[root@nfs01 data]# sh /root/inotify_rsync.sh &
[1] 3555
[root@nfs01 data]# touch {01..20}
[root@nfs01 data]# ls
01  02  03  04  05  06  07  08  09  10  11  12  13  14  15  16  17  18  19  20
#客户端创建测试文件
[root@backup nfs]# ls /nfs
01  02  03  04  05  06  07  08  09  10  11  12  13  14  15  16  17  18  19  20
#服务端成功接收,实现了实时同步的功能

 

  • inotify软件不足

inotify监控是调用系统接口,但是进程毕竟有限,如果有大量的小文件传输时,会出现明显的延迟,实际生产中,使用较少。

 

 

 

上一篇:php-如何使用HHVM监视文件更改?


下一篇:linux-如何在功能测试中模拟INotify失败?