zoukankan      html  css  js  c++  java
  • inotify事件监控工具

    Rsync(remote sync)远程同步工具,通过rsync可以实现对远程服务器数据的增量备份同步,但rsync自身也有瓶颈,同步数据时,rsync采用核心算法对远程服务器的目标文件进行比对,只进行差异同步。我们可以想象一下,如果服务器的文件数量达到了百万甚至千万量级,那么文件对比将是非常耗时的。而且发生变化的往往是其中很少的一部分,这是非常低效的方式。inotify的出现,可以缓解rsync不足之处,取长补短。

    查看当前系统是否支持inotify

    ls -l /proc/sys/fs/inotify
    total 0
    -rw-r--r-- 1 root root 0 Nov  1 11:38 max_queued_events
    -rw-r--r-- 1 root root 0 Nov  1 11:38 max_user_instances
    -rw-r--r-- 1 root root 0 Nov  1 11:38 max_user_watches
    #显示这三个文件证明支持

    关键参数说明:

    1. 在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制
    2. max_user_watches:设置inotifywaitinotifywatch命令可以监视的文件数量(单进程)
    3. max_user_instances:设置每个用户可以运行的inotifywaitinotifywatch命令的进程数。
    4. max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。

     Yum安装inotify-tools:

    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
    yum -y install inotify-tools
    rpm -qa inotify-tools

    一共安装了2个工具,即inotifywait和inotifywatch
    inotifywait:在被监控的文件或目录上等待特定文件系统事件(open,close,delete等)发生,执行后处于阻塞状态,适合shell脚本中使用。
    inotifywatch:收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统计。

     inotifywait命令常用参数详解

    下面用列表详细解释一下各个参数的含义

    inotifywait参数含义说明
    -r --recursive 递归查询目录
    -q --quiet 打印很少的信息,仅仅打印监控事件的信息
    -m,--monitor 始终保持事件监听状态
    --exclude 排除文件或目录时,不区分大小写。
    --timefmt 指定时间输出的格式
    --format 打印使用指定的输出类似格式字符串
    -e,--event 通过此参数可以指定需要监控的事件,如下一个列表所示

    -e :--event的各种事件含义

    Events含义
    access 文件或目录被读取
    modify 文件或目录内容被修改
    attrib 文件或目录属性被改变
    close 文件或目录封闭,无论读/写模式
    open 文件或目录被打开
    moved_to 文件或目录被移动至另外一个目录
    move 文件或目录被移动到另一个目录或从另一个目录移动至当前目录
    create 文件或目录被创建在当前目录
    delete 文件或目录被删除
    umount 文件系统被卸载

    人工测试监控事件

    开启两个窗口

    测试create

        第一个窗口输入如下信息:
        [root@backup ~]# inotifywait -mrq --timefmt '%y %m %d %H %M' --format '%T %w%f' -e delete /backup
        第二个窗口输入如下信息:
        [root@backup backup]# rm -rf chensiqi
        此时第一个窗口会出现如下信息:
        17 03 11 07 29 /backup/chensiqi
        #命令说明:
        -e delete:指定监听的事件类型。监听删除delete事件

    测试delte

        第一个窗口输入如下信息:
        [root@backup ~]# inotifywait -mrq --timefmt '%y %m %d %H %M' --format '%T %w%f' -e delete /backup
        第二个窗口输入如下信息:
        [root@backup backup]# rm -rf chensiqi
        此时第一个窗口会出现如下信息:
        17 03 11 07 29 /backup/chensiqi
        #命令说明:
        -e delete:指定监听的事件类型。监听删除delete事件

    测试close_write

        第一个窗口输入如下信息:
        inotifywait -mrq --timefmt '%y %m %d %H %M' --format '%T %w%f' -e close_write /backup
        第二个窗口输入如下信息:
        [root@backup backup]# touch close_write.log
        [root@backup backup]# echo 111 >> close_write.log 
        [root@backup backup]# rm -f close_write.log 
        此时第一个窗口会出现如下信息:
        17 03 11 07 38 /backup/close_write.log
        17 03 11 07 39 /backup/close_write.log
        #命令说明:
        -e close_write:指定监听类型。监听文件写模式的关闭。

    测试move_to

        第一个窗口输入如下信息:
        [root@backup ~]# inotifywait -mrq --timefmt '%y %m %d %H %M' --format '%T %w%f' -e moved_to /backup  
        第二个窗口输入如下信息:
        此时第一个窗口会出现如下信息:
        [root@backup backup]# touch chensiqi
        [root@backup backup]# mv chensiqi chen
        [root@backup backup]# mkdir ddddd
        [root@backup backup]# mv chen ddddd/

    编写inotify实时监控脚本

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

    上边那个脚本效率很低,效率低的原因在于只要目录出现变化就都会导致我整个目录下所有东西都被推送一遍。因此,我们可以做如下改动提高效率:

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

    关键参数调整

    在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制
    max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
    max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
    max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。

    实战调整:

        [root@nfs01 data]# cat /proc/sys/fs/inotify/max_
        max_queued_events   max_user_instances  max_user_watches
        [root@nfs01 data]# cat /proc/sys/fs/inotify/max_user_watches 
        8192
        [root@nfs01 data]# echo "50000000" > /proc/sys/fs/inotify/max_user_watches
        [root@nfs01 data]# cat /proc/sys/fs/inotify/max_user_watches 
        50000000
        [root@nfs01 data]# cat /proc/sys/fs/inotify/max_queued_events 
        16384
        [root@nfs01 data]# echo "326790" > /proc/sys/fs/inotify/max_queued_events
        [root@nfs01 data]# cat /proc/sys/fs/inotify/max_queued_events 
        326790
        [root@nfs01 data]# sysctl -p

    Rsync+inotify实时数据同步并发简单测试

    10K-100K

    每秒100个并发

        [root@nfs01 data]# paste inotify_100_server.log
        inotify_100_backup_server.log > inotify_100.txt
        [root@nfs01 data]# cat inotify_100.txt
        23:05       34227   23:05   34227
        23:05       34387   23:05   34387
        23:05       35027   23:05   35027
        23:05       35587   23:05   35587
        23:05       36473   23:05   36473
        23:05       36707   23:05   36707
        23:05       37587   23:05   37587 
        以下省略...

    Inotify实时并发:

    结论:经过测试,每秒200文件并发,数据同步几乎无延迟(小于1秒)

  • 相关阅读:
    linux知识笔记4
    linux知识笔记3
    linux知识笔记2
    linux常用命令笔记1
    计算机网络
    软件测试理论5
    软件测试理论4
    软件测试理论3
    Yarn 常用命令
    mac shell终端编辑命令行快捷键
  • 原文地址:https://www.cnblogs.com/ywrj/p/9888425.html
Copyright © 2011-2022 走看看