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