阿里云文件存儲NAS支持inotify嗎?
使用 inotifywait 配合 rsync 是一種常見的準(zhǔn)實(shí)時數(shù)據(jù)備份/同步方案,但在NAS文件系統(tǒng)上 inotifywait 無法正常工作,這是由于 inotify 本身的實(shí)現(xiàn)機(jī)制導(dǎo)致的。
1、inotifywait 原理簡介
inotifywait 是Linux 內(nèi)核子模塊 inotify 的用戶態(tài)接口實(shí)現(xiàn),inotify 實(shí)現(xiàn)在 VFS 層,當(dāng)文件操作到達(dá) VFS 層時,inotify 模塊會將操作類型(創(chuàng)建/刪除/屬性改變等)和操作對象(文件名)反饋給用戶態(tài),用戶態(tài)的 inotifywait 即可將本次操作信息輸出給用戶。
2、NAS 上使用 inotifywait 存在的問題
由于 inotify 是在 kernel 的 VFS 層實(shí)現(xiàn)的,因此在 NFS 文件系統(tǒng)上,遠(yuǎn)程客戶端對 NFS 文件系統(tǒng)的操作無法被本地 kernel 所感知,inotify 也就無法感知遠(yuǎn)程客戶端的文件修改操作。
因此,在 NAS 上使用 inotifywait 會出現(xiàn)以下現(xiàn)象:
在客戶端 A 和 B 同時掛載一個 NAS 文件系統(tǒng),在客戶端 A 啟動 inotifywait 監(jiān)聽掛載目錄;
在客戶端 A 上操作掛載目錄中的文件,可以被 inotifywait 感知;
在客戶端 B 上操作掛載目錄中的文件,inotifywait 無法感知任何文件操作。
3、替代方案
一個可行的替代方案是使用 FAM(http://OSS.sgi.com/projects/fam/doc.html), FAM 是一個用來監(jiān)聽文件或目錄的庫,全部在用戶態(tài)實(shí)現(xiàn),原理是在后臺運(yùn)行一個 daemon,定時掃描目錄,獲取文件變化情況。
但是使用 FAM 存在以下幾個缺陷:
需要自己寫程序調(diào)用 FAM 接口實(shí)現(xiàn)功能。
對于文件數(shù)目很多的場景,使用該方案性能會較差,可能消耗大量資源,無法做到很好的實(shí)時性。
