Rsync(remote sync)遠程同步工具,經過rsync能夠實現對遠程服務器數據的增量備份同步,但rsync自身也有瓶頸,同步數據時,rsync採用核心算法對遠程服務器的目標文件進行比對,只進行差別同步。咱們能夠想象一下,若是服務器的文件數量達到了百萬甚至千萬量級,那麼文件對比將是很是耗時的。並且發生變化的每每是其中不多的一部分,這是很是低效的方式。inotify的出現,能夠緩解rsync不足之處,取長補短。算法
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
在/proc/sys/fs/inotify目錄下有三個文件,對inotify機制有必定的限制
max_user_watches:設置inotifywait或inotifywatch命令能夠監視的文件數量(單進程)
max_user_instances:設置每一個用戶能夠運行的inotifywait或inotifywatch命令的進程數。
max_queued_events:設置inotify實例事件(event)隊列可容納的事件數量。
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參數 | 含義說明 |
---|---|
-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
第一個窗口輸入以下信息: [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事件
第一個窗口輸入以下信息: [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事件
第一個窗口輸入以下信息: 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:指定監聽類型。監聽文件寫模式的關閉。
第一個窗口輸入以下信息: [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/
#!/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
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秒)