inotify簡介: inotify是一種強大的、細粒度的、非同步的文件系統事件監控機制,linux內核從2.6.13起,加入了inotify支持,通過inotify可以監控文件系統添加、刪除、修改、移動等各種事件,利用這個內核介面,第三方軟體就可以監控文件系統下文件的各種變化情況,而inotify- ...
inotify簡介:
inotify是一種強大的、細粒度的、非同步的文件系統事件監控機制,linux內核從2.6.13起,加入了inotify支持,通過inotify可以監控文件系統添加、刪除、修改、移動等各種事件,利用這個內核介面,第三方軟體就可以監控文件系統下文件的各種變化情況,而inotify-tools正是實施這樣監控的軟體。國人周洋在金山公司開發的sersync。
inotify實際是一種事件驅動機制,它為應用程式監控文件系統事件提供了實時響應事件的機制,而無須通知諸如cron等的倫旭機制來獲取事件。cron等機制不僅無法做到實時性,而且消耗大量系統資源。相比之下,inotify基於事件驅動,可以做到對事件的實時響應,也沒有輪詢造成的系統資源消耗,是非常自然的事件通知介面,也與自然世界的事件機制相符合。
rsync(remote sync)遠程同步工具,通過rsync可以實現對遠程伺服器數據的增量備份同步,但rsync自身也有瓶頸,同步數據時,rsync採用核心演算法對遠程伺服器的目標文件進行比對,只進行差異同步。我們可以想象一下,如果伺服器的文件數量達到了百萬甚至千萬量級,那麼文件對比將是非常耗時的。而且發生變化的往往是其中很少的一部分,這是非常低效的方式。inotify的出現,可以緩解rsync的不足之處,取長補短。
案例:(測試數據)
實時熱備伺服器 192.168.43.200
netserver-inotify伺服器 192.168.43.117
---------------------------------------------------------------------------------------------------------------
在實時熱備伺服器上配置:
rsync-server服務端配置:截圖略,詳細配置見 https://www.cnblogs.com/su-root/p/10086190.html
①vi /etc/rsyncd.conf 添加如下代碼↓↓↓↓↓↓
#Rsync server
#created by bqh 21:30 2018-12-05
#rsyncd.conf start
uid = rsync //客戶端連備份伺服器具備rsync的用戶許可權
gid = rsync //客戶端連備份伺服器具備rsync的用戶許可權
use chroot = no //程式出現bug會定向為一個空目錄,安全方面。
max connections = 2000 //客戶端連接數。一般設置大於連接數。
timeout = 600 //設置客戶端連接超時600秒,超時剔除。
pid file = /var/run/rsyncd.pid //pid進程號
lock file = /var/run/rsync.lock //鎖文件
log file = /var/log/rsyncd.log //rsync日誌文件
ignore errors //忽略錯誤
read only = false //只讀,true為可讀寫
list = false //可以遠程列表
hosts allow = 192.168.43.0/24 //允許什麼網段訪問
hosts deny = 0.0.0.0/32 //一般區域網不用,公網可能用,但一般用vpn
auth users = rsync_backup //認證用戶名,遠程連接的用戶。
secrets file = /etc/rsync.password //存放用戶和密碼的文件,遠程用戶的密碼
#####################################
[backup] //共用模塊調用path服務
comment = backup server by bqhboy 21:40 2018-12-05
path = /backup //共用目錄地址
②創建一個虛擬用戶:
useradd rysnc –s /sbin/nologin –M
③創建共用目錄及屬主:
mkdir /backup
chown –R rsync /backup
④給虛擬用戶名設置密碼並存放文件中:
echo “rsync_backup:123” >/etc/rsync.password
⑤給服務端虛擬用戶密碼文件設置許可權:
chmod 600 /etc/rsync.password
⑥啟動服務:rsync --daemon
查看服務:ss -lntup|grep rsync
netstat -lntup|grep rsync
ps -ef|grep rsync|grep -v grep
lsof -i :873
⑦加入開機自啟動:
echo "rsync --daemon" >>/etc/rc.local
cat /etc/rc.local
在netserver-inotify伺服器 (客戶端) 上配置rsync如下:
[root@nfs-server ~]# echo 123 >/etc/rsync.password
[root@nfs-server ~]# cat /etc/rsync.password
123
[root@nfs-server ~]# chmod 600 /etc/rsync.password
[root@nfs-server ~]# ll /etc/rsync.password
-rw------- 1 root root 4 12月 10 21:53 /etc/rsync.password
在客戶端測試一下是否配置成功:將客戶端/data目錄下所有文件推送到服務端/backup/目錄下
[root@nfs-server ~]# ll /data/
總用量 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 12月 3 21:49 118.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 12月 2 17:47 c.txt
[root@nfs-server ~]# rsync -avz /data [email protected]::backup --password-file=
/etc/rsync.password
sending incremental file list
data/
data/118.txt
data/c.txt
sent 172 bytes received 50 bytes 444.00 bytes/sec
total size is 0 speedup is 0.00
[root@nfs-server ~]#
此時我們再熱備服務端查看是否推送過來了:
接下來我們yum安裝inotify-tools
ll /proc/sys/fs/inotify/ 如果該目錄有下麵三個文件代表系統支持inotify,Linux內核版本為2.6.13開始支持inotify。
max_user_watches:設置inotifywait或inotifywatch命令可以監視的文件數量(單進程)
max_user_instances:設置每個用戶可以運行的inotifywait或inotifywatch命令的進程數。
max_queued_events:設置inotify實例事件(event)隊列可容納的事件數量。
安裝inotify
yuminstall inotify-tools -y
一共安裝了兩個工具(命令),即inotifywait和inotifywatch
inotifywait:在被監控的文件或目錄上等待特定文件系統事件(open、close、delete等)發生,執行後處於阻塞狀態,適合在shell腳本中使用。
inotifywatch:收集被監視的文件系統使用度統計數據,指文件系統事件發生的次數統一。
ll /usr/bin/inotifywait或inotifywatch
inotifywait 用法:
實時監控/data的所有事件(包括文件的訪問,寫入,修改,刪除等)
inotifywait -rm --timefmt '%y/%m/%d %H:%M' --format '%T %w %e %f' /data/
我們執行上面的命令後,再打開一個視窗在/data目錄下搞點事情如下:
此時我們發現視窗已監控到搞的事情:
我們可以寫一個腳本監控/data/目錄變化(增量)情況,並推送至備份伺服器上:
#!/bin/bash
inotify=/usr/bin/inotifywait
$inotify -rm --timefmt '%y/%m/%d %H:%M' --format '%T %w %e %f' /data \
|while read file
do
cd / &&
rsync -az ./data [email protected]::backup/ \
--password-file=/etc/rsync.password
done
我們再打開一個視窗搞點測試事情:
我們再從熱備伺服器上查看一下是否推送過來了:
腳本我們可以從後臺啟動並添加到開機啟動項里:
echo "/bin/sh /server/scripts/backup.sh &" >> /etc/rc.local //& 表示從後臺開始運行該條命令。
inotifywatch 用法:
統計(60s內)/data目錄下文件系統的事件
inotifywatch -v -e access -e modify -t 60 -r /data
我們再打開一個視窗搞點事情如下:
關於inotifywait參數說明:
-h,–help
輸出幫助信息
@
排除不需要監視的文件,可以是相對路徑,也可以是絕對路徑。
–fromfile
從文件讀取需要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭。
-m, –monitor
接收到一個事情而不退出,無限期地執行。預設的行為是接收到一個事情後立即退出。
-d, –daemon
跟–monitor一樣,除了是在後臺運行,需要指定–outfile把事情輸出到一個文件。也意味著使用了–syslog。
-o, –outfile
輸出事情到一個文件而不是標準輸出。
-s, –syslog
輸出錯誤信息到系統日誌
-r, –recursive
監視一個目錄下的所有子目錄。
-q, –quiet
指定一次,不會輸出詳細信息,指定二次,除了致命錯誤,不會輸出任何信息。
–exclude
正則匹配需要排除的文件,大小寫敏感。
–excludei
正則匹配需要排除的文件,忽略大小寫。
-t , –timeout
設置超時時間,如果為0,則無限期地執行下去。
-e , –event
指定監視的事件。
-c, –csv
輸出csv格式。
–timefmt
指定時間格式,用於–format選項中的%T格式。
–format
指定輸出格式。
%w 表示發生事件的目錄
%f 表示發生事件的文件
%e 表示發生的事件
%Xe 事件以“X”分隔
%T 使用由–timefmt定義的時間格式
關於inotifywatch參數說明:
-h, –help
輸出幫助信息
-v, –verbose
輸出詳細信息
@
排除不需要監視的文件,可以是相對路徑,也可以是絕對路徑。
–fromfile
從文件讀取需要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭。
-z, –zero
輸出表格的行和列,即使元素為空
–exclude
正則匹配需要排除的文件,大小寫敏感。
–excludei
正則匹配需要排除的文件,忽略大小寫。
-r, –recursive
監視一個目錄下的所有子目錄。
-t , –timeout
設置超時時間
-e , –event
只監聽指定的事件。
-a , –ascending
以指定事件升序排列。
-d , –descending
以指定事件降序排列。
可監聽事件:
在/proc/sys/fs/inotify目錄下有三個文件,對inotify機制有一定的限制,根據場景需要優化:
max_user_watches:設置inotifywait或inotifywatch命令可以監視的文件數量(單進程)
max_user_instances:設置每個用戶可以運行的inotifywait或inotifywatch命令的進程數
max_queued_events:設置inotify實例事件(event)隊列可容納的事件數量。
inotify優點:
1.監控文件系統事件變化,通過同步工具實現實時數據同步。
inotify缺點:
1.併發如果大於200個文件(10-100k),同步就會有延遲。
2.監控到事件後,調用rsync同步是單進程的,而sersync為多進程同步。
高併發數據實時同步方案:
1.inotify(sersync)+rsync 文件級別
2.drbd 文件系統級別
3.第三方軟體同步功能:mysql、oracle等同步功能
4.程式雙寫