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
#顯示這三個文件證實支持

關鍵參數說明:shell

  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:收集被監視的文件系統使用度統計數據,指文件系統事件發生的次數統計。bash

 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 文件系統被卸載

人工測試監控事件

開啓兩個窗口ide

測試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)隊列可容納的事件數量。測試

實戰調整:ui

    [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-100Kspa

每秒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秒)

相關文章
相關標籤/搜索