目錄:
sersync項目簡介:
Sersync服務器同步程序 項目簡介與設計框架
sersync下載地址:http://code.google.com/p/sersync/downloads/list
sersync基本功能的安裝配置詳見:
sersync2 完全安裝配置說明(一) ----基本功能使用
sersync功能的定制和高級配置詳見:
sersync2 完全安裝配置說明(二) ----可選功能與xml高級配置
sersync插件配置詳見:
sersync2 完全安裝配置說明(三) ----插件基本配置和使用
sersync編譯:
sersync需要二次開發的用戶請參考
項目簡介:
本項目利用inotify與rsync對服務器進行實時同步,其中inotify用於監控文件系統事件,rsync是目前廣泛使用的同步算法,其優點是只對文件不同的部分進行操作,所以其優勢大大超過使用掛接文件系統的方式進行鏡像同步。
目前使用的比較多的同步程序版本是inotify-tools,另外一個是google開源項目Openduckbill(依賴於inotify-tools),這兩個都是基於腳本語言編寫的,其設計思路同樣是采用inotify與rsync命令。 相比較上面兩個項目,本項目優點是:
1.sersync是使用c++編寫,而且對linux系統文件系統產生的臨時文件和重復的文件操作進行過濾(我稍後會提到),所以在結合rsync同步的時候,節省了運行時耗和網絡資源。因此更快。
2.相比較上面兩個項目,sersync配置起來很簡單:在http://code.google.com/p/sersync/downloads/list 處下載源碼(分為32版本,與64位版本),其中bin目錄下已經有我編譯好的2進制文件,配合bin目錄下的xml文件直接使用即可。
3.另外本項目相比較其他腳本開源項目,使用多線程進行同步,尤其在同步較大文件時,能夠保證多個服務器實時保持同步狀態。
4.本項目自帶出錯處理機制,通過失敗隊列對出錯的文件重新出錯,如果仍舊失敗,則每10個小時對同步失敗的文件重新同步。
5.本項目自帶crontab功能,只需在xml配置文件中開啟,即可按您的要求,隔一段時間整體同步一次。
6.本項目自帶socket與http協議擴展,滿足您二次開發的需要。
基本架構:
設計簡析:
如上圖所示,線程組線程是等待線程隊列的守護線程,當隊列中有數據的時候,線程組守護線程逐個喚醒,當隊列中inotify事件交多的時候就會被全部喚醒一起工作。這樣設計的目的是能夠同時處理多個inotify事件,重發利用服務器的並發能力(核數*2+2)。
之所以稱之為線程組線程,是因為每個線程在工作的時候,會根據服務器的數量建立子線程,子線程可以保證所有的文件與各個服務器同時同步,當要同步的文件較大的時候,這樣設計可以保證各個遠程服務器可以同時獲得要同步的文件。
服務線程的作用有三個,首先是處理同步失敗的文件,將這些文件再次同步,對於再次同步失敗的文件會生成rsync_fail_log.sh腳本,記錄失敗的事件。同時每隔10個小時執行腳本一次,同時清空腳本。服務線程的第三個作用是crontab功能,可以每隔一定時間,將所有路徑整體同步一次。
過濾隊列的建立是為了過濾短時間內產生的重復的inotify信息,例如在刪除文件夾得時候,inotify就會同時產生刪除文件夾裡的文件與刪除文件夾得事件,通過過濾隊列當刪除文件夾事件產生的時候,會將之前加入隊列的刪除文件的事件全部過濾掉,這樣只產生一條事件減輕了同步的負擔。同時對於修改文件的操作的時候,會產生臨時文件與重復操作。
舉例:
當我們在vi的一個test文件,進行wq操作的時候會產生如下事件:
即使把"."開頭與"~"結尾的世界過濾了,對於test文件仍舊有3次操作,分別是刪除,創建與保存,通過過濾隊列,就只剩下一個事件,一定程度上也提高了效率。
過濾隊列第二個作用,即當你在本機刪除目錄的時候,假設你刪除一個有5個文件的目錄,inotify會產生6個事件,分別是5個文件刪除事件,和一個刪除目錄事件,如果使用過濾隊列,正常情況下會只產生一個刪除目錄的事件,大大減少了rsync通信次數。(當然,這不是絕對的。如果這6個事件分多次讀到進入隊列,那麼可能還沒來得及過濾,就已經被同步線程從隊列中取走同步了。但一定程度上可以減少刪除文件夾得同步通信次數)。
過濾隊列的第三個作用,可以過濾監控目錄下的文件夾,如果不想同步目錄下的一些文件夾,或者一些後綴的文件。對於不需監控的子文件夾,在inotify啟動時候remove掉監控,對於不需監控子文件,產生的文件事件就會從在入同步隊列前過濾掉。如果使用rsync用--exclude, 這樣雖然也可以過濾,但還是與rsync守護進程進行了一次交互。