使用sersync實現多臺伺服器實時同步檔案
一、Sersync專案介紹
專案地址:http://code.google.com/p/sersync/
我們常用到的是rsync+inotify來對伺服器進行實時同步,其中inotify用於監控檔案系統事件,rsync是目前廣泛使用的同步演算法,其優點是隻對檔案不同的部分進行操作,所以其優勢大大超過使用掛接檔案系統的方式進行映象同步。
目前使用的比較多的同步程式版本是inotify-tools,另外一個是google開源專案Openduckbill(依賴於inotify-tools),這兩個都是基於指令碼語言編寫的,其設計思路同樣是採用inotify與rsync命令。 相比較上面兩個專案,本專案優點是:
-
sersync是使用c++編寫,而且對linux系統檔案系統產生的臨時檔案和重複的檔案操作進行過濾(詳細見附錄,這個過濾指令碼程式沒有實現),所以在結合rsync同步的時候,節省了執行時耗和網路資源。因此更快。
-
相比較上面兩個專案,sersync配置起來很簡單,其中bin目錄下已經有基本上靜態編譯的2進位制檔案,配合bin目錄下的xml配置檔案直接使用即可。
-
另外本專案相比較其他指令碼開源專案,使用多執行緒進行同步,尤其在同步較大檔案時,能夠保證多個伺服器實時保持同步狀態。
-
本專案有出錯處理機制,通過失敗佇列對出錯的檔案重新同步,如果仍舊失敗,則按設定時長對同步失敗的檔案重新同步。
-
本專案自帶crontab功能,只需在xml配置檔案中開啟,即可按您的要求,隔一段時間整體同步一次。無需再額外配置crontab功能。
- 本專案socket與http外掛擴充套件,滿足您二次開發的需要。
二、基本架構
如上圖所示,執行緒組執行緒是等待執行緒佇列的守護執行緒,當佇列中有資料的時候,執行緒組守護執行緒逐個喚醒,當佇列中inotify事件較多的時候就會被全部喚醒一起工作。這樣設計的目的是能夠同時處理多個inotify事件,重發利用伺服器的併發能力(核數*2+2)。
之所以稱之為執行緒組執行緒,是因為每個執行緒在工作的時候,會根據伺服器的數量建立子執行緒,子執行緒可以保證所有的檔案與各個伺服器同時同步,當要同步的檔案較大的時候,這樣設計可以保證各個遠端伺服器可以同時獲得要同步的檔案。
服務執行緒的作用有三個,首先是處理同步失敗的檔案,將這些檔案再次同步,對於再次同步失敗的檔案會生成rsync_fail_log.sh指令碼,記錄失敗的事件。同時每隔10個小時執行指令碼一次,同時清空指令碼。服務執行緒的第三個作用是crontab功能,可以每隔一定時間,將所有路徑整體同步一次。
由此圖總結可見:
- sersync支援多執行緒;
- 支援佇列過濾,節省網路頻寬;
- 失敗後重傳機制;
-
具有socket,httpd等套接字,方便二次開發。
Sersync還具有一下機制:
- 能實現雙向同步,只需要在兩個機器上都配置就行了;
-
雙向同步過程中,如果同事修改一個檔案,則以時間為準
在在
三、Sersync安裝和配置具體步驟
-
1.1.1.1 server
-
1.1.1.2 client
1 、Server端安裝
- #wget http://sersync.googlecode.com/files/sersync2.5_32bit_binary_stable_final.tar.gz
- # tar xf sersync2.5_32bit_binary_stable_final.tar.gz
- # cd GNU-Linux-x86/
通過以上簡單三步,即可完成其安裝!解壓后里面就兩個檔案,一個sersync2和一個confxml.xml,其中第一個是一個二進位制檔案,也即是開戶服務的檔案,後面的是配置檔案!
下面對配置檔案進行解釋
- <?xml version="1.0" encoding="ISO-8859-1"?>
- <head version="2.5">
- <host hostip="localhost" port="8008"></host> #針對外掛保留的,預設配置即可
- <debug start="false"/> #開戶debug資訊,會在sersync當前執行臺,列印Debug資訊
- <fileSystem xfs="false"/> #是否支援xfs檔案系統
- <filter start="false"> # 是否開戶檔案過濾,可以在下面新增過濾型別
- <exclude expression="(.*)\.svn"></exclude>
- <exclude expression="(.*)\.gz"></exclude>
- <exclude expression="^info/*"></exclude>
- <exclude expression="^static/*"></exclude>
- </filter>
- <inotify> # inotify監控的事件
- <delete start="false"/> #是否保持Sersync和同步端兩端檔案完全一致
- <createFolder start="true"/> #建立目錄的支援,如果不開戶,不能監控子目錄
- <createFile start="false"/> #是否監控檔案的建立
- <closeWrite start="true"/> #是否監控檔案關閉,開戶可保證檔案的完整性
- <moveFrom start="true"/>
- <moveTo start="true"/>
- <attrib start="false"/>
- <modify start="false"/>
- </inotify>
- <sersync>
- <localpath watch="/data/mp3/"> #這裡定義要監控的本地目錄,這個很重要
- <remote ip="1.1.1.100" name="mp3"/> #要同步到哪臺伺服器,Rsync標籤是什麼
- <!--<remote ip="192.168.8.39" name="tongbu"/>-->
- <!--<remote ip="192.168.8.40" name="tongbu"/>-->
- </localpath>
- <rsync> #配置Rsync資訊
- <commonParams params="-artuz"/> #rsync的引數
- <auth start="true" users="syncuser" passwordfile="/etc/rsyncd/rsyncd.pass"/>
- <userDefinedPort start="false" port="874"/><!-- port=874 --> # 定義rsync埠
- <timeout start="false" time="100"/><!-- timeout=100 --> #定義傳輸超時時間
- <ssh start="false"/> #Rsync的時候,是否使用ssh加密
- </rsync>
- <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
- <crontab start="false" schedule="600"><!--600mins--> #定義crontab定期完全同步兩端檔案
- <crontabfilter start="false"> #crontab同步時候的過濾條件,上面的過濾部開頭要開
- <exclude expression="*.php"></exclude>
- <exclude expression="info/*"></exclude>
- </crontabfilter>
- </crontab>
- <plugin start="false" name="command"/> # 下面就是一些外掛的設定了
- </sersync>
- <plugin name="command">
- <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
- <filter start="false">
- <include expression="(.*)\.php"/>
- <include expression="(.*)\.sh"/>
- </filter>
- </plugin>
- <plugin name="socket">
- <localpath watch="/opt/tongbu">
- <deshost ip="192.168.138.20" port="8009"/>
- </localpath>
- </plugin>
- <plugin name="refreshCDN">
- <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
- <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
- <sendurl base="http://pic.xoyo.com/cms"/>
- <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
- </localpath>
- </plugin>
- </head>
因為這裡rsync的時候,使用了認證使用者和密碼,所以要定義一下密碼檔案
- # vim /etc/rsyncd/rsyncd.pass
- 123456
然後許可權改為600
- # chmod 600 /etc/rsyncd/rsyncd.pass
上面對配置檔案進行了簡單的說明,下面詳細的說一下!
- <host hostip="localhost" port="8008"></host>
hostip與port是針對外掛的保留欄位,對於同步功能沒有任何作用,保留預設即可。
- <filter start="true">
- <exclude expression="(.*)\.gz"></exclude>
- <exclude expression="^info/*"></exclude>
- </filter>
將start設定為 true,在exclude標籤中,填寫正規表示式,預設給出兩個例子分別是過濾以”.gz”結尾的檔案與過濾監控目錄下的info路徑(監控路徑/info /*),可以根據需要新增,但開啟的時候,自己測試一下,正規表示式如果出現錯誤,控制檯會有提示。相比較使用rsync 的exclude功能,被過濾的路徑,不會加入監控,大大減少rsync的通訊量。
- <inotify>
- <delete start="true"/>
- <createFolder start="true"/>
- <createFile start="true"/>
- </inotify>
對於大多數應用,可以嘗試把createFile(監控檔案事件選項)設定為false來提高效能,減少 rsync通訊。因為拷貝檔案到監控目錄會產生create事件與close_write事件,所以如果關閉create事件,只監控檔案拷貝結束時的事 件close_write,同樣可以實現檔案完整同步。
注意:強將createFolder保持為true,如果將createFolder設為false,則不會對產生的目錄進行監控,該目錄下的子檔案與子目錄也不會被監控。所以除非特殊需要,請開啟。預設情況下對建立檔案(目錄)事件與刪除檔案(目錄)事件都進行監控,如果專案中不需要刪除遠端目標伺服器的檔案(目錄),則可以將delete 引數設定為false,則不對刪除事件進行監控。
- <debug start="false"/>
設定為true,開啟debug模式,會在sersync正在執行的控制檯,列印inotify事件與rsync同步命令。
- <fileSystem xfs="false"/>
對於xfs檔案系統的使用者,需要將這個選項開啟,才能使sersync正常工作.
- <localpath watch="/opt/tongbu">
- <remote ip="192.168.0.104" name="tongbu1"/>
- <!--<remote ip="192.168.8.39" name="tongbu"/>-->
- <!--<remote ip="192.168.8.40" name="tongbu"/>-->
- </localpath>
檔案監控與遠端同步設定,這裡使用watch設定本地要監控的目錄,使用remote設定遠端的伺服器IP,使用name設定無端rsync服務裡面定義的標籤
- <rsync>
- <commonParams params="-artuz"/>
- <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
- <userDefinedPort start="false" port="874"/><!-- port=874 -->
- <timeout start="false" time="100"/><!-- timeout=100 -->
- <ssh start="false"/>
- </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的方式進行傳輸。
- <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/>
對於失敗的傳輸,會進行重新傳送,再次失敗就會寫入rsync_fail_log,然後每隔一段時間(timeToExecute進行設定)執行該指令碼再次重新傳送,然後清空該指令碼。可以通過path來設定日誌路徑。
- <crontab start="false" schedule="600"><!--600mins-->
- <crontabfilter start="false">
- <exclude expression="*.gz"></exclude>
- <exclude expression="info/*"></exclude>
- </crontabfilter>
- </crontab>
crontab可以對監控路徑與遠端目標主機每隔一段時間進行一次整體同步,可能由於一些原因兩次失敗重傳都失敗了,這個時候如果開啟了crontab功 能,還可以進一步保證各個伺服器檔案一致,如果檔案量比較大,crontab的時間間隔要設的大一些,否則可能增加通訊開銷。schedule這個引數是設定crontab的時間間隔,預設是600分鐘
如果開啟了filter檔案過濾功能,那麼crontab整體同步也需要設定過濾,否則雖然實時同步的時候檔案被過濾了,但crontab整體同步的時候 如果不單獨設定crontabfilter,還會將需過濾的檔案同步到遠端,crontab的過濾正則與filter過濾的不同,也給出了兩個例項分別對 應與過濾檔案與目錄。總之如果同時開啟了filter與crontab,則要開啟crontab的crontabfilter,並按示例設定使其與filter的過濾一一對應。
2、client配置Rsync服務
首先安裝rsync
- # sudo apt-get install rsync
然後定義rsync的配置檔案
- # Section 1: Global settings
- port = 873
- uid = root
- gid = root
- use chroot = yes
- read only = no
- max connections = 7
- pid file = /var/run/rsyncd.pid
- log file = /var/log/rsyncd.log
- hosts allow = *
- transfer logging = yes
- log format = %t %a %m %f %b
- syslog facility = local3
- timeout = 300
- # Section 2: Directory to be synced
- [mp3]
- path = /data/
- list = yes
- ignore errors = yes
- auth users = syncuser
- secrets file = /etc/rsyncd/rsync.pass
定義一下密碼檔案
- # vim /etc/rsyncd/rsync.pass
- syncuser:123456
然後就可以開戶服務了
- [root@node100 ~]# rsync --daemon --config=/etc/rsync.conf
- [root@node100 ~]# ps -ef | grep rsync
- root 3124 1 0 17:26 ? 00:00:00 rsync --daemon --config=/etc/rsync.conf
- root 3130 3085 0 17:26 pts/0 00:00:00 grep rsync
如果需要將sersync執行前,已經存在的所有檔案或目錄全部同步到遠端,要以-r引數執行sersync,將本地與遠端整體同步一次。
如果設定了過濾器,即在xml檔案中,filter為true,則暫時不能使用-r引數進行整體同步。-r引數將會無效。
- ./sersync2 -r
開戶服務使用以下命令
- ./sersync2 -d
對於sersync使用可執行檔案目錄下的預設配置檔案confxml.xml,如果需要使用另一個配置檔案,可以使用-o引數指定其它配置檔案。
- ./sersync2 -o XXXX.xml
指定預設的執行緒池的執行緒總數
- ./sersync2 -n num
本文轉自 gm100861 51CTO部落格,原文連結:http://blog.51cto.com/gm100861/949094
相關文章
- sersync 實時同步檔案
- linux下兩臺伺服器檔案實時同步方案實現Linux伺服器
- C#實現伺服器間檔案同步C#伺服器
- CentOS7 下使用 rsync+sersync 配置檔案自動同步CentOS
- rsync + lsyncd 檔案實時同步/備份
- nginx實現檔案伺服器Nginx伺服器
- HttpFileCollection 實現多檔案上傳HTTP
- Rsync服務讓SLB下多臺centos伺服器檔案同步更新CentOS伺服器
- linux 利用rsync實現檔案增量同步Linux
- 增量FTP實現檔案的異地同步FTP
- NIO Socket實現檔案伺服器伺服器
- [shell例項]——用指令碼實現向多臺伺服器批量複製檔案(nmap、scp)指令碼伺服器
- PHP實現單檔案、多檔案上傳 封裝 物件導向實現檔案上傳PHP封裝物件
- Awk 多檔案操作的實現方法
- 利用Rsync服務讓SLB下多臺centos伺服器檔案同步更新CentOS伺服器
- 檔案實時同步後防篡改的操作記錄
- Netty 實現HTTP檔案伺服器NettyHTTP伺服器
- js實現使用檔案流下載csv檔案JS
- linux rsync +inotify 實現 實時同步Linux
- 同一臺伺服器部署多個專案,實現不同域名訪問伺服器
- struts動態多檔案上傳實現
- SpringMVC多個檔案上傳實現SpringMVC
- 使用Servlet實現檔案下載Servlet
- 02 使用配置檔案+反射實現反射
- 簡單實現時間倒數計時與伺服器同步效果伺服器
- 使用 Azure Blob Stoage 實現一個靜態檔案伺服器伺服器
- 【方法】Html5實現檔案非同步上傳HTML非同步
- Java實現FTP跨伺服器檔案操作JavaFTP伺服器
- 【Golang實現檔案伺服器】(一)初始版本Golang伺服器
- Java實現定時備份檔案教程Java
- Android 用Retrofit 2實現多檔案上傳實戰Android
- python多程式實現檔案海量複製Python
- SpringMVC實現多檔案上傳原始碼SpringMVC原始碼
- 使用Spring實現上傳檔案Spring
- 使用dompdf/dompdf實現生成pdf檔案
- 點選按鈕,實現檔案下載,通過按鈕傳送url,spring後臺實現伺服器端檔案下載。Spring伺服器
- 基於Flume做FTP檔案實時同步的windows服務。FTPWindows
- [20170425]實現磁碟檔案與U盤同步.txt