Inotify服务


inotify简介
Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux2.6.13起加入了inotify支持,通过inotify可以监控文件系统中添加、删除、
修改、移动等各种事件,利用这个内核接口,第三方软件就监控文件系统下文件的各种变化情况,而inotify-tools正式实施这样监控的软件,国人周洋在金山公司开发的sersync
inotify的实现由几款软件:
inotify-tools ,sersync(金山-周洋),lsyncd

Inotify安装
在安装inotify-tools前先确认你的linux内核是否达到了2.6.13并且在编译时开启CONFIG_INOTIFY也可以使用命令查看
1)查看当前系统是否支持inotify

uname -r
ls -l /proc/sys/fs/inotity
rpm -qa inotify-tools

安装inotify-tools
yum install inotify-tools -y
关键参数说明:
1)在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定限制

  max_user_wathchs:设置inotifywait或者inotifywatch命令可以监视的文件数量(单进程)
  max_user_instances:设置每个用户可以运行的inotifywait或者inotifywatch命令的进程数
  max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量

下载inotify源码包

cd /home/oldboy/tools/
wget https://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

提示:google.com download inotify-tools
yum安装方法:
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repoyum -y install inotify-tools
过程:

[root@nfs01 data]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
--2016-05-29 15:15:32--  http://mirrors.aliyun.com/repo/epel-6.repo
正在解析主机 mirrors.aliyun.com... 115.28.122.210, 112.124.140.210
正在连接 mirrors.aliyun.com|115.28.122.210|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1083 (1.1K) [application/octet-stream]
正在保存至: “/etc/yum.repos.d/epel.repo”
100%[================================================>] 1,083       --.-K/s   in 0s
2016-05-29 15:15:32 (89.3 MB/s) - 已保存 “/etc/yum.repos.d/epel.repo” [1083/1083])
[root@nfs01 data]#

工具集介绍:
一共安装了2个工具(命令)即inotifywait 和inotifywatch
inotifywait:在监控的文件或者目录上等待特定文件事件(open\close\delete等)发生执行后处于阻塞状态,适合在shell脚本中使用。
inotifywatch:收集监控文件系统使用调度统计数据,即文件系统事件发生的次数统计
在nfsweb01查看inotify是否支持(inotify配置在rsync客户端上)

Last login: Sat May 28 13:47:58 2016 from 10.0.0.1
[root@nfs01 ~]# rpm -qa inotify-tools
[root@nfs01 ~]# uname -r
2.6.32-573.el6.x86_64
[root@nfs01 ~]#
[root@nfs01 ~]# ls -l /proc/sys/fs/inotify
-rw-r--r-- 1 root root 0 5月  29 15:02 max_queued_events
-rw-r--r-- 1 root root 0 5月  29 15:02 max_user_instances
-rw-r--r-- 1 root root 0 5月  29 15:02 max_user_watches
[root@nfs01 ~]#

inotifywait详细参数

[root@nfs01 ~]# inotifywait --help
inotifywait 3.14
Wait for a particular event on a file or set of files.
Usage: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
Options:
        -h|--help       Show this help text.
        @         Exclude the specified file from being watched.
        --exclude 
                        Exclude all events on files matching the
                        extended regular expression .
        --excludei 
                        Like --exclude but case insensitive.#排除文件或者目录,不区分大小写
        -m|--monitor    Keep listening for events forever.  Without
                        this option, inotifywait will exit after one
                        event is received.
        -d|--daemon     Same as --monitor, except run in the background
                        logging events to a file specified by --outfile.
                        Implies --syslog.
        -r|--recursive  Watch directories recursively. #递归查询目录
        --fromfile 
                        Read files to watch from  or `-' for stdin.
        -o|--outfile 
                        Print events to  rather than stdout.
        -s|--syslog     Send errors to syslog rather than stderr.
        -q|--quiet      Print less (only print events).#打印很少的信息,仅仅打印监控事件的信息;安静的
        -qq             Print nothing (not even events).
        --format   Print using a specified printf-like format#打印指定输出类似格式字符串
                        string; read the man page for more details.
        --timefmt  strftime-compatible format string for use with
                        %T in --format string.#指定时间输出的格式
        -c|--csv        Print events in CSV format.
        -t|--timeout 
                        When listening for a single event, time out after
                        waiting for an event for  seconds.
                        If  is 0, inotifywait will never time out.
        -e|--event  [ -e|--event  ... ]
                Listen for specific event(s).  If omitted, all events are
                listened for.#通过此参数可以指定需要监控的事件
Exit status:
        0  -  An event you asked to watch for was received.
        1  -  An event you did not ask to watch for was received
              (usually delete_self or unmount), or some error occurred.
        2  -  The --timeout option was given and no events occurred
              in the specified interval of time.
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
        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 #文件系统被卸载
[root@nfs01 ~]#

通过下面的命令可以看到上述参数细节:
./bin/inotifywait --help
开启两个窗口:
1)测试create
[root@nfs01 ~]# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create /backup
参数说明:

-m| ---moniter  #监控
-r| --recursive  #递归
-q| --quiet #打印很少的信息,仅仅打印监控事件的信息; 安静的
-timefmt  指定时间输出的格式
-format打印指定输出类似格式字符串
-e|通过此参数可以指定需要监控的事件

测试 delete;和创建create
[root@nfs01 ~]# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e delete,create /backup
3)测试 close_write
[root@nfs01 ~]# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write /backup
把客户端监控到情况触发rsync推送变化的文件
方法1:新建脚本inotify.sh并执行

#!/bin/bash
Path=/data
Ip=172.16.1.41
/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete $Path \
|while read file
do
cd $Path &&\
rsync -avz ./ --delete rsync_backup@$Ip::nfsbackup --password-file=/etc/rsync.password
done

此方法不是很好
脚本中参数 rsync -v 记得取消
============================
然后在执行 sh inotify.sh
sh -x inotify.sh #查看执行脚本过程
watch 命令可以监控变化
例如:
watch -n1 ls #每1秒监控 ls的变化 ,watch默认时间是2秒;
只同步差异文件:(效率待测试)

#!/bin/bash
Path=/data
Ip=172.16.1.41
/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete $Path \
|while read file
do
[ -f $file ] ;then
rsync -avz $file --delete rsync_backup@$Ip::nfsbackup --password-file=/etc/rsync.password
else
cd $Path &&\
rsync -avz ./ --delete rsync_backup@$Ip::nfsbackup --password-file=/etc/rsync.password
done

inotify工具介绍及实时复制实践后企业级调优
事件相关参数默认大小:
默认:

[root@nfs01 backup]# cd /proc/sys/fs/inotify/
[root@nfs01 inotify]# ls
max_queued_events  max_user_instances  max_user_watches
[root@nfs01 inotify]# cat max_queued_events
16384
[root@nfs01 inotify]# cat max_user_instances
128
[root@nfs01 inotify]# cat max_user_watches
8192
[root@nfs01 inotify]#

关键参数说明:
在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定限制

max_user_events 设置inotify实例事件(event)队列可容纳的事件数量
max_user_instances 设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
max_user_watches设置inotifywait或inotifywatch命令可以监视文件的数量(单进程)

优化过程:

echo 655350 >/proc/sys/fs/inotify/max_user_watches
echo 655350 >/proc/sys/fs/inotify/max_user_events

写定时任务到rc.local

#inotify by oldboy for laoda 20160503
echo 655350 >/proc/sys/fs/inotify/max_user_watches
echo 655350 >/proc/sys/fs/inotify/max_user_events

Rsync+inotify实时数据同步并发简单测试
实时同步并发测试(测试的脚本等详见sersync视频部分)
10k-100k
每秒100个并发:

结论:经过测试,每秒200个文件并发,数据同步几乎无延迟(小于1秒)
inotify优点
1)监控文件系统事件变化,通过同步工具实现实时数据同步
inotify缺点
1)并发如果大于200个文件(10-100K),同步就会有延迟
2)我们前面的脚本,每次都是全部推送一次,但是确实是增量的
也可以值同步变化的文件,不变化的不理。
3)监控到事件后,调用rsync同步是单进程(加&并发)sersync多进程同步
既然有了inotify-tools,为什么还要sersync
sersync实时复制工具的功能

sersync功能多:
支持配置文件管理
真正的守护进程socket
可以对失败文件定时重传(定时任务功能)
第三方的HTTP接口(例如更新cdn缓存)
默认多线程rsync同步

高并发数据实时同步方案小结
inotify+rsync文件级别
drdb文件系统级别,基于block 缺点:备节点数据不可用
第三方软件的同步功能:

  1.程序双写,直接写两台服务器
  2.利用产品业务逻辑解决(读写分离,备读不到,读主)
  3.NFS集群(双写主存储,备存储用inotify(serync)+rsync)备没有找主解决延迟问题

发表评论

发表评论

*

沙发空缺中,还不快抢~