1 inotify介绍
inotify 是一个从 2.6.13 内核开始,对 Linux 文件系统进行高效率、细粒度、异步地监控机制, 用于通知用户空间程序的文件系统变化。可利用它对用户空间进行安全、性能、以及其他方面的监控。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。如果内核版本不低于 2.6.13,系统就支持 inotify。 如果存在
/usr/include/sys/inotify.h 文件, 表明内核支持 inotify。
root@limingtest-1:~/pub# ls -l /proc/sys/fs/inotify/ #列出文件目录,出现下面的内容,说明服务器内核支持inotify
总用量 0
-rw-r--r-- 1 root root 0 1月 16 08:51 max_queued_events
-rw-r--r-- 1 root root 0 1月 12 04:05 max_user_instances
-rw-r--r-- 1 root root 0 1月 16 08:51 max_user_watches
# inotifywait:在被监控的文件或目录上等待特定文件系统事件(open、close、delete等)发生,执行后处于阻塞状态,适合在shell脚本中使用; 重点掌握
# inotifywatch:收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统计
2 inotify出现的原因
Rsync(remote sync)远程同步工具,通过rsync可以实现对远程服务器数据的增量备份同步,但rsync自身也有瓶颈,同步数据时,rsync采用核心算法对远程服务器的目标文件进行比对,只进行差异同步。我们可以想象一下,如果服务器的文件数量达到了百万甚至千万量级,那么文件对比将是非常耗时的。而且发生变化的往往是其中很少的一部分,这是非常低效的方式。inotify的出现,可以缓解rsync不足之处,取长补短。
简介 Inotify是一种强大的,细粒度的,异步的文件系统事件监控机制(软件),linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加,删除,修改,移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools正是实施这样监控的软件。还有国人周洋在金山公司开发的sersync。 Inotify实际是一种事件驱动机制,它为应用程序监控文件系统事件提供了实时响应事件的机制,而无须通过诸如cron等的轮询机制来获取事件。cron等机制不仅无法做到实时性,而且消耗大量系统资源。相比之下,inotify基于事件驱动,可以做到对事件处理的实时响应,也没有轮询造成的系统资源消耗,是非常自然的事件通知接口,也与自然世界的事件机制相符合。
inotify 功能的实现有几款软件
1)inotify-tools
2)sersync(金山周洋)
3)lsyncd
由于inotify软件是Linux系统2.6内核开始支持,以前版本不支持,所以,安装前需要检查当前系统是否支持安装inotify软件。
3.inotify实现数据实时同步原理
无论是手动执行 rsync 还是把 rsync 客户端发出的数据同步请求命令做成周期性任务计划, 每隔一段时间不管有没有数据变化都发出一次数据同步请求命令, 同步一次数据。 服务端和客户端都有时间差。所以, 使用内核提供的 inotify 机制,当数据发生改变时(删除、修改等)就触发 rsync 客户端发出数据 同步请求。 从而实现数据的实时传输。
rsync + inotify 机制实现的两台服务器数据同步如下图如示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cSTYFFa8-1611121641460)(assets/image-20210120120359274.png)]
3.inotify的作用
inotify 可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录及目录中的各子目录及文件的。此外, inotify 使用文件描述符作为接口,因而可以使用通常的文件 I/O 操作 select、 poll 和 epoll 来监视文件系统的变化。
3 inotify部署安装
3.1安装inotify-tools
- inotify-tools项目地址:https://github.com/rvoicilas/inotify-tools
- 软件下载地址:https://github.com/inotify-tools/inotify-tools/archive/v3.14.tar.gz
tar zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure
make
make install
遇到的错误 https://stackoverflow.com/questions/19816275/no-acceptable-c-compiler-found-in-path-when-installing-python
gcc编译器不在 路 径 中 。 这 意 味 着 要 么 你 没 有 安 装 g c c , 要 么 它 不 在 你 的 路径中。这意味着要么你没有安装gcc,要么它不在你的 路径中。这意味着要么你没有安装gcc,要么它不在你的PATH变量中。
要安装gcc,使用以下命令:(以root用户运行)
Redhat base:
yum groupinstall "Development Tools"
Debian base:
apt-get install build-essential
3.2 Centos
yum -y install inotify*
3.3 Ubuntu
apt-get install inotify-tools
4.inotify限制文件及优化**
在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制: max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程); max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数; max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。
简单优化
echo "50000000" > /proc/sys/fs/inotify/max_user_watches
echo "50000000" >/proc/sys/fs/inotify/max_queued_events
5.inotifywait重要参数
inotifywait --help
-r|--recursive # 递归查询目录
-q|--quiet # 打印很少的信息,仅打印监控事件的信息
-m|--monitor # 始终保持事件监控状态
-d|--daemon # daemon模式
--exclude <pattern> # 排除文件或目录,大小写敏感
--excludei <pattern> # 排除文件或目录时,不区分大小写
--fromfile <file> #从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头
-o|--outfile <file> # 输出到文件
-s|--syslog # 把错误放到日志中而不是标准输出
-q|--quiet # 安静的
--format <fmt> # 指定输出格式
%w 表示发生事件的目录 重要
%f 表示发生事件的文件 重要
%e 表示发生的事件
%Xe 事件以“X”分隔
%T 使用由–timefmt定义的时间格式
--timefmt <fmt> # 指定时间输出格式
-t|--timeout <seconds> # 设置超时时间
-e|--event <event1> # 指定监视的事件,比如删除、增加和修改
inotifywait命令参数
-m
是要持续监视变化。-r
使用递归形式监视目录。-q
减少冗余信息,只打印出需要的信息。-e
指定要监视的事件列表。--timefmt
是指定时间的输出格式。--format
指定文件变化的详细信息。
可监听的事件
事件 | 描述 |
---|---|
access | 访问,读取文件。 |
modify | 修改,文件内容被修改。 |
attrib | 属性,文件元数据被修改。 |
move | 移动,对文件进行移动操作。 |
create | 创建,生成新文件 |
open | 打开,对文件进行打开操作。 |
close | 关闭,对文件进行关闭操作。 |
delete | 删除,文件被删除。 |
4. rsync+inotify实时同步
编写同步脚本
cat >inotify.sh<<"EOF"
#!/bin/bash
path=/home/ubuntu/pub
rsync_server=192.168.197.29
/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete $path | while read line
do
if [ -f $line ];then
rsync -az $line --delete rsync_backup@$rsync_server::backup --password-file=/etc/rsync.password
else
cd $path &&\
rsync -az ./ --delete rsync_backup@$rsync_server::backup --password-file=/etc/rsync.password
fi
done
EOF
#放到后台监控
root@limingtest-1:~# nohup sh inotify.sh &>/dev/null &
[2] 15439
root@limingtest-1:~# ps -ef | grep inotify
root 1001 1 0 1月19 ? 00:00:00 sh inotify.sh
root 1002 1001 0 1月19 ? 00:00:00 inotifywait -mrq --timefmt %d%m%Y %H:%M --format %T %w%f -e create /home/ubuntu/pub
--exclude='.*'
排除.git目录
测试同步:
注意:rsync的–delete参数,会将客户端的目录无差异同步到服务端,所以一定要注意数据的安全,慎用
既然有了inotify-tools,为什么还要开发sersync?
1)sersync通过配置文件来实现,使用方便;
2)真正的守护进程socket;
3)可以对失败文件定时重传(内置定时任务);
4)第三方的http接口;
5)默认多线程同步。