使用sersync實現多臺伺服器實時同步檔案

weixin_34115824發表於2017-11-12

 一、Sersync專案介紹

專案地址:http://code.google.com/p/sersync/

 我們常用到的是rsync+inotify來對伺服器進行實時同步,其中inotify用於監控檔案系統事件,rsync是目前廣泛使用的同步演算法,其優點是隻對檔案不同的部分進行操作,所以其優勢大大超過使用掛接檔案系統的方式進行映象同步。

 目前使用的比較多的同步程式版本是inotify-tools,另外一個是google開源專案Openduckbill(依賴於inotify-tools),這兩個都是基於指令碼語言編寫的,其設計思路同樣是採用inotify與rsync命令。 相比較上面兩個專案,本專案優點是:

 

 

  1. sersync是使用c++編寫,而且對linux系統檔案系統產生的臨時檔案和重複的檔案操作進行過濾(詳細見附錄,這個過濾指令碼程式沒有實現),所以在結合rsync同步的時候,節省了執行時耗和網路資源。因此更快。

  2. 相比較上面兩個專案,sersync配置起來很簡單,其中bin目錄下已經有基本上靜態編譯的2進位制檔案,配合bin目錄下的xml配置檔案直接使用即可。

  3. 另外本專案相比較其他指令碼開源專案,使用多執行緒進行同步,尤其在同步較大檔案時,能夠保證多個伺服器實時保持同步狀態。

  4. 本專案有出錯處理機制,通過失敗佇列對出錯的檔案重新同步,如果仍舊失敗,則按設定時長對同步失敗的檔案重新同步。

  5. 本專案自帶crontab功能,只需在xml配置檔案中開啟,即可按您的要求,隔一段時間整體同步一次。無需再額外配置crontab功能。

  6. 本專案socket與http外掛擴充套件,滿足您二次開發的需要。

二、基本架構

 如上圖所示,執行緒組執行緒是等待執行緒佇列的守護執行緒,當佇列中有資料的時候,執行緒組守護執行緒逐個喚醒,當佇列中inotify事件較多的時候就會被全部喚醒一起工作。這樣設計的目的是能夠同時處理多個inotify事件,重發利用伺服器的併發能力(核數*2+2)。

之所以稱之為執行緒組執行緒,是因為每個執行緒在工作的時候,會根據伺服器的數量建立子執行緒,子執行緒可以保證所有的檔案與各個伺服器同時同步,當要同步的檔案較大的時候,這樣設計可以保證各個遠端伺服器可以同時獲得要同步的檔案。

服務執行緒的作用有三個,首先是處理同步失敗的檔案,將這些檔案再次同步,對於再次同步失敗的檔案會生成rsync_fail_log.sh指令碼,記錄失敗的事件。同時每隔10個小時執行指令碼一次,同時清空指令碼。服務執行緒的第三個作用是crontab功能,可以每隔一定時間,將所有路徑整體同步一次。

 由此圖總結可見:

  • sersync支援多執行緒;
  • 支援佇列過濾,節省網路頻寬;
  • 失敗後重傳機制;
  • 具有sockethttpd等套接字,方便二次開發。

Sersync還具有一下機制:

  • 能實現雙向同步,只需要在兩個機器上都配置就行了;
  •  雙向同步過程中,如果同事修改一個檔案,則以時間為準
    在在


三、Sersync安裝和配置具體步驟

  • 1.1.1.1 server

  • 1.1.1.2 client

1 、Server端安裝

 


  1. #wget http://sersync.googlecode.com/files/sersync2.5_32bit_binary_stable_final.tar.gz 
  2. # tar xf sersync2.5_32bit_binary_stable_final.tar.gz 
  3. # cd GNU-Linux-x86/ 

通過以上簡單三步,即可完成其安裝!解壓后里面就兩個檔案,一個sersync2和一個confxml.xml,其中第一個是一個二進位制檔案,也即是開戶服務的檔案,後面的是配置檔案!

下面對配置檔案進行解釋

 


  1. <?xml version="1.0" encoding="ISO-8859-1"?> 
  2. <head version="2.5"> 
  3.     <host hostip="localhost" port="8008"></host>  #針對外掛保留的,預設配置即可
  4.     <debug start="false"/>  #開戶debug資訊,會在sersync當前執行臺,列印Debug資訊
  5.     <fileSystem xfs="false"/>  #是否支援xfs檔案系統
  6.     <filter start="false">  # 是否開戶檔案過濾,可以在下面新增過濾型別
  7.     <exclude expression="(.*)\.svn"></exclude> 
  8.     <exclude expression="(.*)\.gz"></exclude> 
  9.     <exclude expression="^info/*"></exclude> 
  10.     <exclude expression="^static/*"></exclude> 
  11.     </filter> 
  12.     <inotify>  # inotify監控的事件
  13.     <delete start="false"/>  #是否保持Sersync和同步端兩端檔案完全一致
  14.     <createFolder start="true"/> #建立目錄的支援,如果不開戶,不能監控子目錄
  15.     <createFile start="false"/>  #是否監控檔案的建立
  16.     <closeWrite start="true"/>  #是否監控檔案關閉,開戶可保證檔案的完整性
  17.     <moveFrom start="true"/> 
  18.     <moveTo start="true"/> 
  19.     <attrib start="false"/> 
  20.     <modify start="false"/> 
  21.     </inotify> 
  22.  
  23.     <sersync> 
  24.     <localpath watch="/data/mp3/">  #這裡定義要監控的本地目錄,這個很重要
  25.         <remote ip="1.1.1.100" name="mp3"/>  #要同步到哪臺伺服器,Rsync標籤是什麼
  26.         <!--<remote ip="192.168.8.39" name="tongbu"/>--> 
  27.         <!--<remote ip="192.168.8.40" name="tongbu"/>--> 
  28.     </localpath> 
  29.     <rsync>  #配置Rsync資訊
  30.         <commonParams params="-artuz"/>  #rsync的引數
  31.         <auth start="true" users="syncuser" passwordfile="/etc/rsyncd/rsyncd.pass"/> 
  32.         <userDefinedPort start="false" port="874"/><!-- port=874 -->  # 定義rsync埠
  33.         <timeout start="false" time="100"/><!-- timeout=100 -->  #定義傳輸超時時間
  34.         <ssh start="false"/>  #Rsync的時候,是否使用ssh加密
  35.     </rsync> 
  36.     <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--> 
  37.     <crontab start="false" schedule="600"><!--600mins-->  #定義crontab定期完全同步兩端檔案
  38.         <crontabfilter start="false">  #crontab同步時候的過濾條件,上面的過濾部開頭要開
  39.         <exclude expression="*.php"></exclude> 
  40.         <exclude expression="info/*"></exclude> 
  41.         </crontabfilter> 
  42.     </crontab> 
  43.     <plugin start="false" name="command"/>  # 下面就是一些外掛的設定了
  44.     </sersync> 
  45.  
  46.     <plugin name="command"> 
  47.     <param prefix="/bin/sh" suffix="" ignoreError="true"/>  <!--prefix /opt/tongbu/mmm.sh suffix--> 
  48.     <filter start="false"> 
  49.         <include expression="(.*)\.php"/> 
  50.         <include expression="(.*)\.sh"/> 
  51.     </filter> 
  52.     </plugin> 
  53.  
  54.     <plugin name="socket"> 
  55.     <localpath watch="/opt/tongbu"> 
  56.         <deshost ip="192.168.138.20" port="8009"/> 
  57.     </localpath> 
  58.     </plugin> 
  59.     <plugin name="refreshCDN"> 
  60.     <localpath watch="/data0/htdocs/cms.xoyo.com/site/"> 
  61.         <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/> 
  62.         <sendurl base="http://pic.xoyo.com/cms"/> 
  63.         <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/> 
  64.     </localpath> 
  65.     </plugin> 
  66. </head> 

因為這裡rsync的時候,使用了認證使用者和密碼,所以要定義一下密碼檔案

 


  1. # vim /etc/rsyncd/rsyncd.pass 
  2. 123456 

然後許可權改為600

 


  1. # chmod 600 /etc/rsyncd/rsyncd.pass 

 

上面對配置檔案進行了簡單的說明,下面詳細的說一下!

 


  1. <host hostip="localhost" port="8008"></host> 

hostip與port是針對外掛的保留欄位,對於同步功能沒有任何作用,保留預設即可。

 


  1. <filter start="true"> 
  2. <exclude expression="(.*)\.gz"></exclude> 
  3. <exclude expression="^info/*"></exclude> 
  4. </filter> 

將start設定為 true,在exclude標籤中,填寫正規表示式,預設給出兩個例子分別是過濾以”.gz”結尾的檔案與過濾監控目錄下的info路徑(監控路徑/info /*),可以根據需要新增,但開啟的時候,自己測試一下,正規表示式如果出現錯誤,控制檯會有提示。相比較使用rsync 的exclude功能,被過濾的路徑,不會加入監控,大大減少rsync的通訊量。

 


  1. <inotify> 
  2. <delete start="true"/> 
  3. <createFolder  start="true"/> 
  4. <createFile start="true"/> 
  5. </inotify> 

 

對於大多數應用,可以嘗試把createFile(監控檔案事件選項)設定為false來提高效能,減少 rsync通訊。因為拷貝檔案到監控目錄會產生create事件與close_write事件,所以如果關閉create事件,只監控檔案拷貝結束時的事 件close_write,同樣可以實現檔案完整同步。

注意:強將createFolder保持為true,如果將createFolder設為false,則不會對產生的目錄進行監控,該目錄下的子檔案與子目錄也不會被監控。所以除非特殊需要,請開啟。預設情況下對建立檔案(目錄)事件與刪除檔案(目錄)事件都進行監控,如果專案中不需要刪除遠端目標伺服器的檔案(目錄),則可以將delete 引數設定為false,則不對刪除事件進行監控。

 


  1. <debug start="false"/> 

設定為true,開啟debug模式,會在sersync正在執行的控制檯,列印inotify事件與rsync同步命令。

 
 


  1. <fileSystem xfs="false"/> 

對於xfs檔案系統的使用者,需要將這個選項開啟,才能使sersync正常工作.

 


  1. <localpath watch="/opt/tongbu"> 
  2. <remote ip="192.168.0.104" name="tongbu1"/> 
  3. <!--<remote ip="192.168.8.39" name="tongbu"/>--> 
  4. <!--<remote ip="192.168.8.40" name="tongbu"/>--> 
  5. </localpath> 

 

檔案監控與遠端同步設定,這裡使用watch設定本地要監控的目錄,使用remote設定遠端的伺服器IP,使用name設定無端rsync服務裡面定義的標籤

 


  1. <rsync> 
  2. <commonParams params="-artuz"/> 
  3. <auth start="false" users="root" passwordfile="/etc/rsync.pas"/> 
  4. <userDefinedPort start="false" port="874"/><!-- port=874 --> 
  5. <timeout start="false" time="100"/><!-- timeout=100 --> 
  6. <ssh start="false"/> 
  7. </rsync> 

 

commonParams可以使用者自定義rsync引數,預設是-artuz

auth start=”false” 設定為true的時候,使用rsync的認證模式傳送,需要配置user與passwrodfile(–password-file=/etc/rsync.pas),來使用。userDefinedPort  當遠端同步目標伺服器的rsync埠不是預設埠的時候使用(–port=874)。timeout設定rsync的timeout時間(–timeout=100)。ssh 使用rsync -e ssh的方式進行傳輸。

 


  1. <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/> 

對於失敗的傳輸,會進行重新傳送,再次失敗就會寫入rsync_fail_log,然後每隔一段時間(timeToExecute進行設定)執行該指令碼再次重新傳送,然後清空該指令碼。可以通過path來設定日誌路徑。

 


  1. <crontab start="false" schedule="600"><!--600mins--> 
  2. <crontabfilter start="false"> 
  3. <exclude expression="*.gz"></exclude> 
  4. <exclude expression="info/*"></exclude> 
  5. </crontabfilter> 
  6. </crontab> 

 

crontab可以對監控路徑與遠端目標主機每隔一段時間進行一次整體同步,可能由於一些原因兩次失敗重傳都失敗了,這個時候如果開啟了crontab功 能,還可以進一步保證各個伺服器檔案一致,如果檔案量比較大,crontab的時間間隔要設的大一些,否則可能增加通訊開銷。schedule這個引數是設定crontab的時間間隔,預設是600分鐘

如果開啟了filter檔案過濾功能,那麼crontab整體同步也需要設定過濾,否則雖然實時同步的時候檔案被過濾了,但crontab整體同步的時候 如果不單獨設定crontabfilter,還會將需過濾的檔案同步到遠端,crontab的過濾正則與filter過濾的不同,也給出了兩個例項分別對 應與過濾檔案與目錄。總之如果同時開啟了filter與crontab,則要開啟crontab的crontabfilter,並按示例設定使其與filter的過濾一一對應。

 

 

 

 

 

2、client配置Rsync服務

首先安裝rsync

 


  1. # sudo apt-get install rsync 

然後定義rsync的配置檔案


  1. # Section 1: Global settings 
  2. port = 873 
  3. uid = root 
  4. gid = root 
  5. use chroot = yes 
  6. read only = no 
  7. max connections = 7 
  8. pid file = /var/run/rsyncd.pid 
  9. log file = /var/log/rsyncd.log 
  10. hosts allow = * 
  11. transfer logging = yes 
  12. log format = %t %a %m %f %b 
  13. syslog facility = local3 
  14. timeout = 300 
  15.  
  16. # Section 2: Directory to be synced 
  17. [mp3] 
  18. path = /data/ 
  19. list = yes 
  20. ignore errors = yes 
  21. auth users = syncuser  
  22. secrets file = /etc/rsyncd/rsync.pass 

定義一下密碼檔案


  1. # vim /etc/rsyncd/rsync.pass 
  2. syncuser:123456 

然後就可以開戶服務了


  1. [root@node100 ~]# rsync --daemon --config=/etc/rsync.conf  
  2. [root@node100 ~]# ps -ef | grep rsync 
  3. root      3124     1  0 17:26 ?        00:00:00 rsync --daemon --config=/etc/rsync.conf 
  4. root      3130  3085  0 17:26 pts/0    00:00:00 grep rsync 

 

 

如果需要將sersync執行前,已經存在的所有檔案或目錄全部同步到遠端,要以-r引數執行sersync,將本地與遠端整體同步一次。

如果設定了過濾器,即在xml檔案中,filter為true,則暫時不能使用-r引數進行整體同步。-r引數將會無效。


  1. ./sersync2 -r 

 

 

開戶服務使用以下命令


  1. ./sersync2 -d 

 

對於sersync使用可執行檔案目錄下的預設配置檔案confxml.xml,如果需要使用另一個配置檔案,可以使用-o引數指定其它配置檔案。


  1. ./sersync2 -o XXXX.xml 

 

指定預設的執行緒池的執行緒總數


  1. ./sersync2 -n num 

 



本文轉自 gm100861 51CTO部落格,原文連結:http://blog.51cto.com/gm100861/949094


相關文章