1. 程式人生 > >inotify事件監控工具

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

    第一個視窗輸入如下資訊:
    [[email protected] ~]# inotifywait -mrq --timefmt '%y %m %d %H %M' --format '%T %w%f' -e delete /backup
    第二個視窗輸入如下資訊:
    [[email protected] backup]# rm -rf chensiqi
    此時第一個視窗會出現如下資訊:
    17 03 11 07 29 /backup/chensiqi
    #命令說明:
    -e delete:指定監聽的事件型別。監聽刪除delete事件

測試delte

    第一個視窗輸入如下資訊:
    [[email protected] ~]# inotifywait -mrq --timefmt '%y %m %d %H %M' --format '%T %w%f' -e delete /backup
    第二個視窗輸入如下資訊:
    [[email protected] 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
    第二個視窗輸入如下資訊:
    [[email protected] backup]# touch close_write.log
    [[email protected] backup]# echo 111 >> close_write.log 
    [[email protected] 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

    第一個視窗輸入如下資訊:
    [[email protected] ~]# inotifywait -mrq --timefmt '%y %m %d %H %M' --format '%T %w%f' -e moved_to /backup  
    第二個視窗輸入如下資訊:
    此時第一個視窗會出現如下資訊:
    [[email protected] backup]# touch chensiqi
    [[email protected] backup]# mv chensiqi chen
    [[email protected] backup]# mkdir ddddd
    [[email protected] 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 [email protected]$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 [email protected]$backup_Server::nfsbackup --password-file=/etc/rsync.password       
        else
            cd $Path &&\
            rsync -az ./ --delete [email protected]$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)佇列可容納的事件數量。

實戰調整:

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

Rsync+inotify實時資料同步併發簡單測試

10K-100K

每秒100個併發

    [[email protected] data]# paste inotify_100_server.log
    inotify_100_backup_server.log > inotify_100.txt
    [[email protected] 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秒)