在分佈式應用中會遇到一個問題,就是多個服務器間的文件如何能始終保持一致。一種經典的辦法是將須要保持一致的文件存儲在NFS上,這種方法雖然簡單方便但卻將原本多點的應用在文件存儲上又變成了單點,這違背了分佈式應用部署的初衷。爲了保留多點特性,文件仍然保存在各服務器上,那就須要在每一個服務器中保持文件的同步。linux
服務器同步的解決方案有不少。比較流行的有inotify-tools+rsync和Openduckbill(依賴於inotify-tools)。如今介紹一個解決方案sersync,相對上面兩個項目有如下優勢:c++
當前版本的sersync依賴於rsync進行同步。以下圖所示,在同步主服務器上開啓sersync,將監控路徑中的文件同步到目標服務器,所以須要在主服務器配置sersync,在同步目標服務器配置rsync。對於rsync配置,在google上能夠找到不少資料,如下只是一些必要的配置和使用說明,僅供參考,請根據您的實際狀況修改。ssh
如圖所示,須要在同步主服務器上配置sersync,在同步目標服務器配置rsync,並在目標服務器開啓rsync守候進程,這樣在主服務器產生的文 件,就會被sersync實時同步到多個目標服務器。在centos系統下默認已經安裝了rsync,只需進行配置,並開啓rsync守候進程便可。socket
配置同步目標服務器rsync
在多臺目標服務器上配置以下:
vi /etc/rsyncd.conf
uid=root
gid=root
max connections=36000
use chroot=no
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
[tongbu1]
path=/opt/tongbu1
comment = xoyo video files
ignore errors = yes
read only = no
hosts allow = 192.168.0.100/24
hosts deny = *
上面配置文件,代表容許主服務器(假設ip爲192.168.0.100)訪問,rsync同步模塊名爲[tongbu1],將同步過來的文件放入path指定的目錄/opt/tongbu1。若是有多臺從服務器,則每一臺都須要進行相似的rsync配置,上面的uid gid要換成您服務器的相應用戶,主意rysnc要有對被同步目錄的操做權限。配置好以後,使用以下命令,開啓rsync守護進程:
rsync --daemon
在主服務器上安裝配置sresync
在google code下載sersync的可執行文件版本,裏面有配置文件與可執行文件,這裏用sersync2.5進行說明,新版本配置形式相似。
1.在主服務器上開啓sersync守護進程,使sersync在後臺運行,開啓實時同步。
./sersync -d
過程以下:
[root@localhost GNU-Linux-x86]# ls
confxml.xml sersync2[root@localhost GNU-Linux-x86]# ./sersync2 -dset the system paramexecute:echo 50000000 > /proc/sys/fs/inotify/max_user_watchesexecute:echo 327679 > /proc/sys/fs/inotify/max_queued_eventsparse the command paramdaemon thread num: 10parse xml config filehost ip : localhost host port: 8008config xml parse successplease set /etc/rsyncd.conf max connections=0 Manuallysersync working thread 12 = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads)please according your cpu ,use -n param to adjust the cpu raterun the sersync:watch path is: /opt/tongbu
代表,sersync已經開啓,能夠在本地監控路徑下創建文件,查看遠程是否同步成功。
2.在開啓實時監控的以前對主服務器目錄與遠程目標機目錄進行一次總體同步
./sersync -r
若是須要將sersync運行前,已經存在的全部文件或目錄所有同步到遠程,要以-r參數運行sersync,將本地與遠程總體同步一次。
若是設置了過濾器,即在xml文件中,filter爲true,則暫時不能使用-r參數進行總體同步。-r參數將會無效。
3.查看啓動參數幫助
./sersync --help
4.指定配置文件
./sersync -o XXXX.xml
對於sersync使用可執行文件目錄下的默認配置文件confxml.xml,若是須要使用另外一個配置文件,可使用-o參數指定其它配置文件。
5.指定默認的線程池的線程總數
./sersync -n num
例如 ./sersync -n 5 則指定線程總數爲5,若是不指定,默認啓動線程池數量是10,若是cpu使用太高,能夠經過這個參數調低,若是機器配置較高,能夠用-n跳高線程總數。
6.不進行同步,只運行插件
./sersync -m pluginName
例如./sersync -m command,則在監控到文件事件後,不對遠程目標服務器進行同步,而是直接運行command插件。
7.多個參數能夠配合使用
./sersync -n 8 -o abc.xml -r -d
表示,設置線程池工做線程爲8個,指定abc.xml做爲配置文件,在實時監控前做一次總體同步,以守護進程方式在後臺運行。
8.一般狀況下,對本地到遠程總體同步一遍後,在後臺運行實時同步。
./sersync -d
XML文件說明
sersync可選功能是經過xml配置文件來實現的,基本配置文件以下:
01 |
<? xml version = "1.0" encoding = "ISO-8859-1" ?> |
03 |
< host hostip = "localhost" port = "8008" ></ host > |
05 |
< exclude expression = "(.*)\.gz" ></ exclude > |
06 |
< exclude expression = "^info/*" ></ exclude > |
10 |
< createFolder start = "true" /> |
11 |
< createFile start = "true" /> |
15 |
< localpath watch = "/opt/tongbu" > |
16 |
< remote ip = "192.168.0.104" name = "tongbu1" /> |
21 |
< commonParams params = "-artuz" /> |
22 |
< auth start = "false" users = "root" passwordfile = "/etc/rsync.pas" /> |
23 |
< userDefinedPort start = "false" port = "874" /> |
24 |
< timeout start = "false" time = "100" /> |
27 |
< failLog path = "/tmp/rsync_fail_log.sh" timeToExecute = "60" /> |
28 |
< crontab start = "false" schedule = "600" > |
29 |
< crontabfilter start = "false" > |
30 |
< exclude expression = "*.gz" ></ exclude > |
31 |
< exclude expression = "info/*" ></ exclude > |
34 |
< plugin start = "false" name = "command" /> |
下面作逐行的進行解釋說明:
<host hostip="localhost" port="8008"></host>
hostip與port是針對插件的保留字段,對於同步功能沒有任何做用,保留默認便可。
filter文件過濾功能
對於sersync監控的文件,會默認過濾系統的臨時文件(以「.」開頭,以「~」結尾),除了這些文件外,能夠自定義其餘須要過濾的文件。
<filter start="true">
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
</filter>
將start設置爲 true,在exclude標籤中,填寫正則表達式,默認給出兩個例子分別是過濾以」.gz」結尾的文件與過濾監控目錄下的info路徑(監控路徑/info /*),能夠根據須要添加,但開啓的時候,本身測試一下,正則表達式若是出現錯誤,控制檯會有提示。相比較使用rsync 的exclude功能,被過濾的路徑,不會加入監控,大大減小rsync的通信量。
inotify監控參數設定(優化)
對於inotify監控參數能夠進行設置,根據您項目的特色優化srsync。
<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開啓
<debug start="false"/>
設置爲true,開啓debug模式,會在sersync正在運行的控制檯,打印inotify事件與rsync同步命令。
XFS文件系統
<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>
詳見sersync2 徹底安裝配置說明(一) —-基本功能使用
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按期總體同步功能
<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的過濾一一對應。
插件設置
<plugin start="false" name="command"/>
當設置爲true的時候,將文件同步到遠程服務器後會調用name參數指定的插件。詳見請看插件設置。