您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎么理解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守護進程進行了一次交互。
上述內容就是怎么理解Sersync服務器同步程序項目與設計框架,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。