隨着應用系統規模的不斷擴大,對數據的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了很多不足。
首先,rsync在同步數據時,需要掃描所有文件後進行比對,進行差量傳輸。如果文件數量達到了百萬甚至千萬量級,掃描所有文件將是非常耗時的,並且正在發生變化的往往是其中很少的一部分,這是非常低效的方式。
其次,rsync不能實時的去監測、同步數據,雖然它可以通過linux守護進程的方式進行觸發同步,但是兩次觸發動作一定會有時間差,這樣就導致了服務端和客戶端數據可能出現不一致,無法在應用故障時完全的恢復數據。
基於以上兩種情況,可以使用rsync+inotify的組合來解決,可以實現數據的實時同步。
一、Inotify 簡介
inotify是一種強大的、細粒度的、異步的文件系統事件控制機制。linux內核從2.6.13起,加入了inotify支持,通過inotify可以監控文件系統中添加、刪除、修改、移動等各種事件,利用這個內核接口,第三方軟件就可以監控文件系統下文件的各種變化情況,而inotify-tools正是實施監控的軟件。
在使用rsync首次全量同步後,結合inotify對源目錄進行實時監控,只有有文件變動或新文件產生,就會立刻同步到目標目錄下,非常高效使用!
二、Inotify 安裝
[root@nfs /]# uname -r
3.10.0-1062.el7.x86_64
[root@nfs /]# ls -l /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Feb 26 10:23 max_queued_events # 設置inotify實例事件隊列可容納的事件數
-rw-r--r-- 1 root root 0 Feb 26 10:23 max_user_instances #設置每個用戶可以運行inotify工具命令的進程數
-rw-r--r-- 1 root root 0 Feb 26 10:23 max_user_watches #設置inotify可以監視的文件數量
#說明:有這三個文件證明系統支持inotify
#查看三個文件的默認參數
[root@nfs /]# cat /proc/sys/fs/inotify/max_queued_events
16384
[root@nfs /]# cat /proc/sys/fs/inotify/max_user_instances
128
[root@nfs /]# cat /proc/sys/fs/inotify/max_user_watches
8192
#安裝Inotify
[root@nfs /]# yum install -y inotify-tools
三、Inotify 主要命令
1. Inotifywait命令
inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ]
命令參數 | 命令說明 |
---|---|
-m, --monitor | 始終保持事件的監聽狀態 |
-r --recursive | 遞歸查詢目錄 |
-q, --quiet | 輸出信息少(只打印監控的事件信息) |
-d, –daemon | 跟–monitor一樣,除了是在後臺運行,需要指定–outfile把事情輸出到一個文件。也意味着使用了–syslog |
-o, –outfile | 輸出事情到一個文件而不是標準輸出 |
-s, –syslog | 輸出錯誤信息到系統日誌 |
--excludei <pattern> | 排除文件或者目錄,不區分大小寫 |
--timefmt <fmt> |
自定義時間輸出格式 常用的時間格式: %d 日 %m 月 %y 年 %H:%M 時:分 |
--format <fmt> |
自定義inotifywait的輸出格式, %w 事件發生時,監控文件或目錄的名稱信息 %f 事件發生時,將顯示監控目錄下觸發事件的文件 或目錄信息,否則爲空 %e 顯示發生的事件信息,將不同事件信息用逗號隔 開 %T 輸出時間格式中定義的時間格式信息,通過 --timefmt 選項的語法格式進行設置 %Xe 顯示事件發生的信息,不用的事件用X進行分 ,可以修改X爲指定的分隔符 |
-e <event> |
監聽指定事件,有幾個常見的事件如下: access:讀取文件或目錄內容 modify:修改文件或者目錄內容 attrib:文件或者目錄屬性改變 close_write(常用):以可寫方式打開的文件被關閉 close_nowrite:以只讀方式打開的文件被關閉 open:文件或目錄被打開 moved_to(常用):文件或目錄移動到 moved_from:文件從目錄移動 move:移動文件或目錄移動到監視目錄 create(常用):在監視目錄下創建文件或目錄 delete(常用): 刪除監視目錄下的文件或目錄 delete_self: 刪除目錄下的文件或目錄 unmount :卸載文件系統 |
2. Inotifywatch命令
inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]
四、Inotify優化
[root@nfs /]# echo "50000000" >/proc/sys/fs/inotify/max_queued_events
# 單進程可以監控的文件數量
[root@nfs /]# echo "50000000" >/proc/sys/fs/inotify/max_user_watches
# 隊列容納事件的數量
#說明:意思配置文件重啓系統會失效,需要放到rc.local文件中