對 Linux 系統而言,基本上我們只要達成目錄的同步再加上如 heartbeat 的監測機制,就可以達到檔案的備援機制。而要達到目錄的同步,最簡單也是最常見的一種方式就是透過排程定期呼叫 rsync 將主目錄內的檔案同步至備援主機的目錄。這方法雖然很簡單,也確實可行,但是他有一個主要的問題,那就是當目錄結構一大,比對與同步的時間將會拖的很長。如此一來,表示排程間隔的時間不能太短,也就是兩個目錄所出現的時間差距也會隨之增加。而今天我要介紹的這個工具 – lsyncd,雖然也是透過 rsync 進行同步,但是 lsyncd 透過監測目錄的寫入動作,僅針對變動的部份進行同步,可以大幅提高同步的效率。而 lsyncd 的同步觸發條件預設為間隔 20 秒或累積 1000 次的寫入事件,而且這兩個參數還可以依據實際的狀況加以調整。不可否認,lsyncd + rsync 很難達成真正的即時同步,但是對於大部分的狀況,數秒的差距應該是可以被接受的。而因為 lsyncd 只需安裝在主目錄的系統上,所以對於備援主機的限制較少,甚至是不同的檔案系統都沒關係。
在 Linux 下面,通常可以找到 lsyncd 的套件直接加以安裝,只是版本上可能會有所不同。以 CentOS 為例,可以在 EPEL 這個 repository 中找到 lsyncd 的套件,版本為 2.0.4。前面提到,只有主目錄的主機需要安裝 lsyncd,而用來當做備援的主機是不需要安裝的。安裝後,必須自行建立一個設定檔,檔案路徑雖然沒有什麼限制,但是我的建議是使用 /etc/lsyncd.conf 以便管理。在 /etc/lsyncd.conf 檔內輸入下列內容:
settings = {
logfile = "/var/log/lsyncd.log",
statusFile = "/var/run/lsyncd.status",
nodaemon = false,
log = all
}
sync {
default.rsync,
source = "/data",
target = "192.168.1.2:/data",
rsyncOps = {"-avz", "--delete"},
delay = 10
}
其中 source 與 target 請分別改成你想要同步的主目錄及備援主機的目錄。設定完畢之後,透過指令lsyncd /etc/lsyncd.conf
就可以啟動 lsyncd 的同步功能了。在使用 lsyncd 時,有下列幾點事情需要注意:
- 因為新版的 rsync 已經預設使用 ssh 當做傳輸的方式,所以可以直接設定使用 rsync 即可。如果 rsync 版本過舊,可以將 sync 方式由 rsync 改為 rsyncssh。也就是說,我們必須確保主目錄的主機可以直接透過 ssh 登入備援主機,而不需要輸入密碼。除了利用 rsync + ssh 的方式,也可以透過 rsync 的 target,如此一來就不需要 ssh 了。
- lsyncd 預設不會同步檔案的所有權與權限,因此我們透過 rsyncOps 這個參數來改變 lsyncd 呼叫 rsync 的行為。
- 透過 delay = 10 這個設定,我們要求 lsyncd 將同步間隔時間由預設的 20 秒改為 10 秒。
- 我們必須確保所有的寫入動作發生於主目錄的主機上,而在一般的情況下,這應該是不成問題的。但是如果我們
自找麻煩地在主目錄掛載了其他主機的目錄,那麼這些掛載而來目錄的寫入動作,將無法被 lsyncd 監測到,所以也就無法同步。 - lsyncd 透過 inotify 作為監測目錄寫入的機制,而 inotify 可監測的數量則受到 fs.inotify.max_user_watches 這個參數的限制。如果 lsyncd 欲監測的目錄數量超過系統的上限,並不會出現錯誤訊息,而是多餘的目錄直接被忽略。為了避免此一現象的發生,我們在啟動 lsyncd 後可以先透過指令
確認系統的設定值。之後在 /var/run/lsyncd.status 中找到類似下列的訊息sysctl fs.inotify.max_user_watches
其中 34567 表示 lsyncd 供監測了 34567 個目錄。如果兩個數字很接近,請增加系統所允許的上限值以便讓 lsyncd 完整監測並同步所有的目錄。Inotify watching 34567 directories
透過下列指令我們可以將 inotify 可監測的數量上限變更為 40000
如果我們希望每次開機後此一設定值都自動變更為 40000,請修改 /etc/sysctl.conf,加上下列設定echo 40000 > /proc/sys/fs/inotify/max_user_watches
fs.inotify.max_user_watches = 40000
- CentOS 所安裝的 lsyncd 並沒有提供啟動腳本,因此請在 /etc/rc.local 加上設定
如此一來,開機時 lsyncd 才會自動執行。/usr/bin/lsyncd /etc/lsyncd.conf
沒有留言:
張貼留言