標籤:軟體 linux google 伺服器 程式
本項目利用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協議擴充,滿足您二次開發的需要。
基本架構:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6C/60/wKiom1VH9ivhENNvAAKnrM0fzV4465.jpg" title="W_4]%)7N2A`VO%I7GFP`)T0.jpg " alt="wKiom1VH9ivhENNvAAKnrM0fzV4465.jpg" />
設計簡析:
如所示,線程組線程是等待線程隊列的守護線程,當隊列中有資料的時候,線程組守護線程逐個喚醒,當隊列中inotify事件交多的時候就會被全部喚醒一起工作。這樣設計的目的是能夠同時處理多個inotify事件,重發利用伺服器的並發能力(核心數*2+2)。
之所以稱之為線程組線程,是因為每個線程在工作的時候,會根據伺服器的數量建立子線程,子線程可以保證所有的檔案與各個伺服器同時同步,當要同步的檔案較大的時候,這樣設計可以保證各個遠程伺服器可以同時獲得要同步的檔案。
服務線程的作用有三個,首先是處理同步失敗的檔案,將這些檔案再次同步,對於再次同步失敗的檔案會產生rsync_fail_log.sh指令碼,記錄失敗的事件。同時每隔10個小時執行指令碼一次,同時清空指令碼。服務線程的第三個作用是crontab功能,可以每隔一定時間,將所有路徑整體同步一次。
過濾隊列的建立是為了過濾短時間內產生的重複的inotify資訊,例如在刪除檔案夾得時候,inotify就會同時產生刪除檔案夾裡的檔案與刪除檔案夾得事件,通過過濾隊列當刪除檔案夾事件產生的時候,會將之前排入佇列的刪除檔案的事件全部過濾掉,這樣只產生一條事件減輕了同步的負擔。同時對於修改檔案的操作的時候,會產生臨時檔案與重複操作。
舉例:
當我們在vi的一個test檔案,進行wq操作的時候會產生如下事件:
650) this.width=650;" class="blogimg" src="http://www.linuxidc.com/upload/2012_02/120206185071032.bmp" style="border:0px;" alt="120206185071032.bmp" />
即使把"."開頭與"~"結尾的世界過濾了,對於test檔案仍舊有3次操作,分別是刪除,建立與儲存,通過過濾隊列,就只剩下一個事件,一定程度上也提高了效率。
過濾隊列第二個作用,即當你在本機刪除目錄的時候,假設你刪除一個有5個檔案的目錄,inotify會產生6個事件,分別是5個檔案刪除事件,和一個刪除目錄事件,如果使用過濾隊列,正常情況下會只產生一個刪除目錄的事件,大大減少了rsync通訊次數。(當然,這不是絕對的。如果這6個事件分多次讀到進入隊列,那麼可能還沒來得及過濾,就已經被同步線程從隊列中取走同步了。但一定程度上可以減少刪除檔案夾得同步通訊次數)。
過濾隊列的第三個作用,可以過濾監控目錄下的檔案夾,如果不想同步目錄下的一些檔案夾,或者一些尾碼的檔案。對於不需監控的子檔案夾,在inotify啟動時候remove掉監控,對於不需監控子檔案,產生的檔案事件就會從在入同步隊列前過濾掉。如果使用rsync用--exclude, 這樣雖然也可以過濾,但還是與rsync守護進程進行了一次互動。
架構圖:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6C/60/wKiom1VH9wjRGkE7AAC_h0EvOzI248.jpg" title="(5}@{Q9@NZ`VM77VZ4WJR38.png " alt="wKiom1VH9wjRGkE7AAC_h0EvOzI248.jpg" />
2.安裝環境資源清單
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6C/5C/wKioL1VH-XqToncoAAFqdY0mXfc463.jpg" title="K_ICD0)690P9E_JY`O9QPA4.png " alt="wKioL1VH-XqToncoAAFqdY0mXfc463.jpg" />
2.2檢查系統內容
cat /etc/redhat-release
檢查核心版本 uname-r 檢查系統位元 uname -m
2.3檢查升級rsync到3.0
rrync --version | head -2 (如果沒有安裝可以用 yum install rsync -y 命令升級)
2.4.配置rsync的設定檔(這裡要在168和169機器同時建立)
(這裡系統不會自動產生,我這裡要手動建立rsync.conf設定檔)
(設定檔中建立了3個即時同步的目錄)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6C/60/wKiom1VH-kmyaw7vAALfk1lzrYE175.jpg" title="ZZYE6E}IUVH(O8~CFAW)VVE.png" alt="wKiom1VH-kmyaw7vAALfk1lzrYE175.jpg" />
2.5建立三個同步目錄
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6C/60/wKiom1VH-tKjYFgEAACEEkjSAOM059.jpg" title="LI4YS]LPO01I6K]A6${GKFG.png" alt="wKiom1VH-tKjYFgEAACEEkjSAOM059.jpg" />
2.6.建立配置認證的許可權
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6C/5C/wKioL1VH_ImDfUe0AAChBqj818U359.jpg" title="CG]YAL@6JL%RXM[B}21$3SD.png" alt="wKioL1VH_ImDfUe0AAChBqj818U359.jpg" />
2.7.開啟rsync的守護進程
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6C/60/wKiom1VH--fQ6wRVAABdrx7KNAk603.jpg" title="1]MM4BW(8%V{D$CV1)L%TD4.png" alt="wKiom1VH--fQ6wRVAABdrx7KNAk603.jpg" />
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6C/5C/wKioL1VH_ZLzHfSzAAEWfd8SH5o569.jpg" title="8FGZH]8TQ26G@IO%@D2DIT1.png" alt="wKioL1VH_ZLzHfSzAAEWfd8SH5o569.jpg" />2.8.rsync服務加入開機自啟動服務
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6C/60/wKiom1VH_IHyVFvLAADQtgJd3o8814.jpg" title="ZP8WR`(%0ZZJ[RX7]VSYMFG.png " alt="wKiom1VH_IHyVFvLAADQtgJd3o8814.jpg" />2.9.關閉rsync伺服器
pkill rsync
rsync --deamon
ps -ef |grep rsync
3.配置master167伺服器上的rsync
3.1在master上配置rsync許可權(這裡配置的傳輸密碼要和s1和s2一致)650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6C/5C/wKioL1VH_3iQHfiiAACxoxtNnTc772.jpg" title="0R00CQ}467JFGMAOCIE5(P4.png" alt="wKioL1VH_3iQHfiiAACxoxtNnTc772.jpg" />
3.2.在master上建立同步的三個目錄(www/bbs /www/blog www/www)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6C/5C/wKioL1VIAFPSVha5AAEpr8cMt04416.jpg" title="K)UNKFHB3UQ9C2PF}57G@VL.png" alt="wKioL1VIAFPSVha5AAEpr8cMt04416.jpg" />
3.3手動執行同步測試(在這裡我為了不影響測試,關閉ipabes防火牆 service iptables stop)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6C/5C/wKioL1VIAQfgIsz4AAKCHDelhek004.jpg" title="EQB4_EU$VS9E9(Z3L2N[]4N.png" alt="wKioL1VIAQfgIsz4AAKCHDelhek004.jpg" />
查看執行的結果:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6C/60/wKiom1VH_96zsuopAADQ5X0LciU572.jpg" title="]I_~)G1RR59}N1I4%H0)3W3.png" alt="wKiom1VH_96zsuopAADQ5X0LciU572.jpg" />650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6C/60/wKiom1VIAAHS_xv8AABzPAC9GIY160.jpg" title="4}DNMY{$LYR1WX7G[(%2}_3.png" alt="wKiom1VIAAHS_xv8AABzPAC9GIY160.jpg" />
ok ,這裏手動同步沒啥問題 !!嘿嘿
4.開始部署在master上sersync 服務
軟體的
mkdir -p /home/zzx/tools
cd /home/zzx/tools
wget http://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz
可以瀏覽 http://code.google.com/p/sersync/downloads/list
解壓軟體
tar -zxf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/
cd /usr/local/
mv GNU-Linux-x86 sersync
4.1 規範sersync的設定檔
cd /sersync
mkdir conf bin logs
mv confxml.xml conf
mv sersync2 bin/sersync
4.2 備份設定檔和修改設定檔
---/bin/cp/ conf/confxml.xml conf/confxml.xml.zzx.$(date+%F)
ok cp confxml.xml confxml.xml.zzx.$(date +%F)
(1)修改conf/confxml.xml(24行添加如下)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6C/60/wKiom1VIAfaTYctAAAOGJLGHROg726.jpg" title="Z[%N2)%6JO7G30@FMY{H8@E.jpg" alt="wKiom1VIAfaTYctAAAOGJLGHROg726.jpg" />
4.3 開啟sersync的守護進程
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6C/5F/wKioL1VIO0Sg25rIAACA1sUY6ZQ638.jpg" title="0PSIBI)[25ZXJP6XA}UZXTT.png" alt="wKioL1VIO0Sg25rIAACA1sUY6ZQ638.jpg" />
4.4 啟動sersync
sersync -r -d -o /usr/local/sersync/conf/confxml.xml
-r 同步複製 -d 後台啟動 -o 指定設定檔 不指定是二進位檔案
在這裡存在個小插曲啊!!(這裡指同步了,www/www的目錄有效)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6C/5F/wKioL1VIQCTTmHgRAADI2aYZAyc973.jpg" title="J~OG~$ZJDSF76CX`57CT~BB.png " alt="wKioL1VIQCTTmHgRAADI2aYZAyc973.jpg" />
查看是s1和s2的目錄
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6C/63/wKiom1VIPyGivXTNAADjnojA8uw677.jpg" title="UJW9(AI]O}`U]WK%RZ]FHIT.png " alt="wKiom1VIPyGivXTNAADjnojA8uw677.jpg" />
為瞭解決這個問題,我們為每一個目錄配置一個confing.xml(這裡配置就是產生多執行個體的配置)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6C/63/wKiom1VIP6GyiLmkAAHVvo_ocjc679.jpg" title="3DEL5YKG$Y$([YS%)@EZF$S.png" alt="wKiom1VIP6GyiLmkAAHVvo_ocjc679.jpg" />分別為bbs_confxml.xml 、www_confxml.xml 、blog_confxml.xml 的設定檔不同同步目錄
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6C/63/wKiom1VIQUqC5zwiAAOgbrSurxI372.jpg" title=")UHW8W6R7SC@6IPA)N[FOV1.png" alt="wKiom1VIQUqC5zwiAAOgbrSurxI372.jpg" />
Sersync即時同步軟體