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