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:38max_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 #顯示這三個檔案證明支援
關鍵引數說明:
在/proc/sys/fs/inotify目錄下有三個檔案,對inotify機制有一定的限制
max_user_watches:設定inotifywait或inotifywatch命令可以監視的檔案數量(單程序)
max_user_instances:設定每個使用者可以執行的inotifywait或inotifywatch命令的程序數。
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秒)