sersync+rsync实现实时同步
在分布式應(yīng)用中會(huì)遇到一個(gè)問題,就是多個(gè)服務(wù)器間的文件如何能始終保持一致。一種經(jīng)典的辦法是將需要保持一致的文件存儲(chǔ)在NFS上,這種方法雖然簡(jiǎn)單方便但卻將本來多點(diǎn)的應(yīng)用在文件存儲(chǔ)上又變成了單點(diǎn),這違背了分布式應(yīng)用部署的初衷。為了保留多點(diǎn)特性,文件仍然保存在各服務(wù)器上,那就需要在每個(gè)服務(wù)器中保持文件的同步。
服務(wù)器同步的解決方案有很多。比較流行的有inotify-tools+rsync和Openduckbill(依賴于inotify-tools)。現(xiàn)在介紹一個(gè)解決方案sersync,相對(duì)上面兩個(gè)項(xiàng)目有以下優(yōu)點(diǎn):
sersync是使用c++編寫,而且對(duì)linux系統(tǒng)文件系統(tǒng)產(chǎn)生的臨時(shí)文件和重復(fù)的文件操作進(jìn)行過濾,所以在結(jié)合rsync同步的時(shí)候,節(jié)省了運(yùn)行時(shí)耗和網(wǎng)絡(luò)資源。因此更快。
sersync配置起來很簡(jiǎn)單,其中bin目錄下已經(jīng)有基本上靜態(tài)編譯的2進(jìn)制文件,配合bin目錄下的xml配置文件直接使用即可。
使用多線程進(jìn)行同步,尤其在同步較大文件時(shí),能夠保證多個(gè)服務(wù)器實(shí)時(shí)保持同步狀態(tài)。
有出錯(cuò)處理機(jī)制,通過失敗隊(duì)列對(duì)出錯(cuò)的文件重新同步,如果仍舊失敗,則按設(shè)定時(shí)長(zhǎng)對(duì)同步失敗的文件重新同步。
自帶crontab功能,只需在xml配置文件中開啟,即可按要求隔一段時(shí)間整體同步一次。無需再額外配置crontab功能。
能夠?qū)崿F(xiàn)socket與http插件擴(kuò)展。
sersync2完全安裝配置說明(一) —-基本功能使用
當(dāng)前版本的sersync依賴于rsync進(jìn)行同步。如下圖所示,在同步主服務(wù)器上開啟sersync,將監(jiān)控路徑中的文件同步到目標(biāo)服務(wù)器,因此需要在主服務(wù)器配置sersync,在同步目標(biāo)服務(wù)器配置rsync。對(duì)于rsync配置,在google上可以找到很多資料,以下只是一些必要的配置和使用說明,僅供參考,請(qǐng)根據(jù)您的實(shí)際情況修改。
如圖所示,需要在同步主服務(wù)器上配置sersync,在同步目標(biāo)服務(wù)器配置rsync,并在目標(biāo)服務(wù)器開啟rsync守候進(jìn)程,這樣在主服務(wù)器產(chǎn)生的文 件,就會(huì)被sersync實(shí)時(shí)同步到多個(gè)目標(biāo)服務(wù)器。在centos系統(tǒng)下默認(rèn)已經(jīng)安裝了rsync,只需進(jìn)行配置,并開啟rsync守候進(jìn)程即可。
配置同步目標(biāo)服務(wù)器rsync
在多臺(tái)目標(biāo)服務(wù)器上配置如下:
vi /etc/rsyncd.confuid=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 = *上面配置文件,表明允許主服務(wù)器(假設(shè)ip為192.168.0.100)訪問,rsync同步模塊名為[tongbu1],將同步過來的文件放入path指定的目錄/opt/tongbu1。如果有多臺(tái)從服務(wù)器,則每一臺(tái)都需要進(jìn)行類似的rsync配置,上面的uid gid要換成您服務(wù)器的相應(yīng)用戶,主意rysnc要有對(duì)被同步目錄的操作權(quán)限。配置好之后,使用如下命令,開啟rsync守護(hù)進(jìn)程:
rsync --daemon在主服務(wù)器上安裝配置sresync
在google code下載sersync的可執(zhí)行文件版本,里面有配置文件與可執(zhí)行文件,這里用sersync2.5進(jìn)行說明,新版本配置形式類似。
1.在主服務(wù)器上開啟sersync守護(hù)進(jìn)程,使sersync在后臺(tái)運(yùn)行,開啟實(shí)時(shí)同步。
./sersync -d過程如下:
[root@localhost GNU-Linux-x86]# lsconfxml.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已經(jīng)開啟,可以在本地監(jiān)控路徑下建立文件,查看遠(yuǎn)程是否同步成功。2.在開啟實(shí)時(shí)監(jiān)控的之前對(duì)主服務(wù)器目錄與遠(yuǎn)程目標(biāo)機(jī)目錄進(jìn)行一次整體同步
./sersync -r如果需要將sersync運(yùn)行前,已經(jīng)存在的所有文件或目錄全部同步到遠(yuǎn)程,要以-r參數(shù)運(yùn)行sersync,將本地與遠(yuǎn)程整體同步一次。
如果設(shè)置了過濾器,即在xml文件中,filter為true,則暫時(shí)不能使用-r參數(shù)進(jìn)行整體同步。-r參數(shù)將會(huì)無效。
3.查看啟動(dòng)參數(shù)幫助
./sersync --help4.指定配置文件
./sersync -o XXXX.xml對(duì)于sersync使用可執(zhí)行文件目錄下的默認(rèn)配置文件confxml.xml,如果需要使用另一個(gè)配置文件,可以使用-o參數(shù)指定其它配置文件。
5.指定默認(rèn)的線程池的線程總數(shù)
./sersync -n num例如 ./sersync -n 5 則指定線程總數(shù)為5,如果不指定,默認(rèn)啟動(dòng)線程池?cái)?shù)量是10,如果cpu使用過高,可以通過這個(gè)參數(shù)調(diào)低,如果機(jī)器配置較高,可以用-n跳高線程總數(shù)。
6.不進(jìn)行同步,只運(yùn)行插件
./sersync -m pluginName例如./sersync -m command,則在監(jiān)控到文件事件后,不對(duì)遠(yuǎn)程目標(biāo)服務(wù)器進(jìn)行同步,而是直接運(yùn)行command插件。
7.多個(gè)參數(shù)可以配合使用
./sersync -n 8 -o abc.xml -r -d表示,設(shè)置線程池工作線程為8個(gè),指定abc.xml作為配置文件,在實(shí)時(shí)監(jiān)控前作一次整體同步,以守護(hù)進(jìn)程方式在后臺(tái)運(yùn)行。
8.通常情況下,對(duì)本地到遠(yuǎn)程整體同步一遍后,在后臺(tái)運(yùn)行實(shí)時(shí)同步。
./sersync -dsersync2 完全安裝配置說明(二) —-可選功能與xml高級(jí)配置
XML文件說明
sersync可選功能是通過xml配置文件來實(shí)現(xiàn)的,基本配置文件如下:
| 01 | <?xmlversion="1.0"encoding="ISO-8859-1"?> |
| 02 | <headversion="2.5"> |
| 03 | <hosthostip="localhost"port="8008"></host> |
| 04 | <filterstart="false"> |
| 05 | <excludeexpression="(.*)\.gz"></exclude> |
| 06 | <excludeexpression="^info/*"></exclude> |
| 07 | </filter> |
| 08 | <inotify> |
| 09 | <deletestart="true"/> |
| 10 | <createFolderstart="true"/> |
| 11 | <createFilestart="true"/> |
| 12 | </inotify> |
| 13 | <debugstart="false"/> |
| 14 | <sersync> |
| 15 | <localpathwatch="/opt/tongbu"> |
| 16 | <remoteip="192.168.0.104"name="tongbu1"/> |
| 17 | <!--<remote ip="192.168.8.39" name="tongbu"/>--> |
| 18 | <!--<remote ip="192.168.8.40" name="tongbu"/>--> |
| 19 | </localpath> |
| 20 | <rsync> |
| 21 | <commonParamsparams="-artuz"/> |
| 22 | <authstart="false"users="root"passwordfile="/etc/rsync.pas"/> |
| 23 | <userDefinedPortstart="false"port="874"/><!-- port=874 --> |
| 24 | <timeoutstart="false"time="100"/><!-- timeout=100 --> |
| 25 | <sshstart="false"/> |
| 26 | </rsync> |
| 27 | <failLogpath="/tmp/rsync_fail_log.sh"timeToExecute="60"/><!--default every 60min execute once--> |
| 28 | <crontabstart="false"schedule="600"><!--600mins--> |
| 29 | <crontabfilterstart="false"> |
| 30 | <excludeexpression="*.gz"></exclude> |
| 31 | <excludeexpression="info/*"></exclude> |
| 32 | </crontabfilter> |
| 33 | </crontab> |
| 34 | <pluginstart="false"name="command"/> |
| 35 | </sersync> |
下面做逐行的進(jìn)行解釋說明:
<host hostip="localhost" port="8008"></host>hostip與port是針對(duì)插件的保留字段,對(duì)于同步功能沒有任何作用,保留默認(rèn)即可。
filter文件過濾功能
對(duì)于sersync監(jiān)控的文件,會(huì)默認(rèn)過濾系統(tǒng)的臨時(shí)文件(以“.”開頭,以“~”結(jié)尾),除了這些文件外,可以自定義其他需要過濾的文件。
<filter start="true"> <exclude expression="(.*)\.gz"></exclude> <exclude expression="^info/*"></exclude> </filter>將start設(shè)置為 true,在exclude標(biāo)簽中,填寫正則表達(dá)式,默認(rèn)給出兩個(gè)例子分別是過濾以”.gz”結(jié)尾的文件與過濾監(jiān)控目錄下的info路徑(監(jiān)控路徑/info /*),可以根據(jù)需要添加,但開啟的時(shí)候,自己測(cè)試一下,正則表達(dá)式如果出現(xiàn)錯(cuò)誤,控制臺(tái)會(huì)有提示。相比較使用rsync 的exclude功能,被過濾的路徑,不會(huì)加入監(jiān)控,大大減少rsync的通訊量。
inotify監(jiān)控參數(shù)設(shè)定(優(yōu)化)
對(duì)于inotify監(jiān)控參數(shù)可以進(jìn)行設(shè)置,根據(jù)您項(xiàng)目的特點(diǎn)優(yōu)化srsync。
對(duì)于大多數(shù)應(yīng)用,可以嘗試把createFile(監(jiān)控文件事件選項(xiàng))設(shè)置為false來提高性能,減少 rsync通訊。因?yàn)榭截愇募奖O(jiān)控目錄會(huì)產(chǎn)生create事件與close_write事件,所以如果關(guān)閉create事件,只監(jiān)控文件拷貝結(jié)束時(shí)的事 件close_write,同樣可以實(shí)現(xiàn)文件完整同步。
注意:強(qiáng)將createFolder保持為true,如果將createFolder設(shè)為false,則不會(huì)對(duì)產(chǎn)生的目錄進(jìn)行監(jiān)控,該目錄下的子文件與子目錄也不會(huì)被監(jiān)控。所以除非特殊需要,請(qǐng)開啟。默認(rèn)情況下對(duì)創(chuàng)建文件(目錄)事件與刪除文件(目錄)事件都進(jìn)行監(jiān)控,如果項(xiàng)目中不需要?jiǎng)h除遠(yuǎn)程目標(biāo)服務(wù)器的文件(目錄),則可以將delete 參數(shù)設(shè)置為false,則不對(duì)刪除事件進(jìn)行監(jiān)控。
Debug開啟
<debug start="false"/>設(shè)置為true,開啟debug模式,會(huì)在sersync正在運(yùn)行的控制臺(tái),打印inotify事件與rsync同步命令。
XFS文件系統(tǒng)
對(duì)于xfs文件系統(tǒng)的用戶,需要將這個(gè)選項(xiàng)開啟,才能使sersync正常工作.
文件監(jiān)控與遠(yuǎn)程同步設(shè)置
<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參數(shù)配置
<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參數(shù),默認(rèn)是-artuz
auth start=”false” 設(shè)置為true的時(shí)候,使用rsync的認(rèn)證模式傳送,需要配置user與passwrodfile(–password-file=/etc/rsync.pas),來使用。userDefinedPort 當(dāng)遠(yuǎn)程同步目標(biāo)服務(wù)器的rsync端口不是默認(rèn)端口的時(shí)候使用(–port=874)。timeout設(shè)置rsync的timeout時(shí)間(–timeout=100)。ssh 使用rsync -e ssh的方式進(jìn)行傳輸。
失敗日志腳步配置
對(duì)于失敗的傳輸,會(huì)進(jìn)行重新傳送,再次失敗就會(huì)寫入rsync_fail_log,然后每隔一段時(shí)間(timeToExecute進(jìn)行設(shè)置)執(zhí)行該腳本再次重新傳送,然后清空該腳本。可以通過path來設(shè)置日志路徑。
Crontab定期整體同步功能
<crontab start="false" schedule="600"><!--600mins--> <crontabfilter start="false"> <exclude expression="*.gz"></exclude> <exclude expression="info/*"></exclude> </crontabfilter> </crontab>crontab可以對(duì)監(jiān)控路徑與遠(yuǎn)程目標(biāo)主機(jī)每隔一段時(shí)間進(jìn)行一次整體同步,可能由于一些原因兩次失敗重傳都失敗了,這個(gè)時(shí)候如果開啟了crontab功 能,還可以進(jìn)一步保證各個(gè)服務(wù)器文件一致,如果文件量比較大,crontab的時(shí)間間隔要設(shè)的大一些,否則可能增加通訊開銷。schedule這個(gè)參數(shù)是設(shè)置crontab的時(shí)間間隔,默認(rèn)是600分鐘
如果開啟了filter文件過濾功能,那么crontab整體同步也需要設(shè)置過濾,否則雖然實(shí)時(shí)同步的時(shí)候文件被過濾了,但crontab整體同步的時(shí)候 如果不單獨(dú)設(shè)置crontabfilter,還會(huì)將需過濾的文件同步到遠(yuǎn)程,crontab的過濾正則與filter過濾的不同,也給出了兩個(gè)實(shí)例分別對(duì) 應(yīng)與過濾文件與目錄。總之如果同時(shí)開啟了filter與crontab,則要開啟crontab的crontabfilter,并按示例設(shè)置使其與filter的過濾一一對(duì)應(yīng)。
插件設(shè)置
<plugin start="false" name="command"/>當(dāng)設(shè)置為true的時(shí)候,將文件同步到遠(yuǎn)程服務(wù)器后會(huì)調(diào)用name參數(shù)指定的插件。詳見請(qǐng)看插件設(shè)置。
轉(zhuǎn)載于:https://blog.51cto.com/zhangshaoxiong/1307054
總結(jié)
以上是生活随笔為你收集整理的sersync+rsync实现实时同步的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: delphi 最全日期格式_DateUt
- 下一篇: mongodb morphia