sersync+rsync实现实时同步
在分布式應用中會遇到一個問題,就是多個服務器間的文件如何能始終保持一致。一種經典的辦法是將需要保持一致的文件存儲在NFS上,這種方法雖然簡單方便但卻將本來多點的應用在文件存儲上又變成了單點,這違背了分布式應用部署的初衷。為了保留多點特性,文件仍然保存在各服務器上,那就需要在每個服務器中保持文件的同步。
服務器同步的解決方案有很多。比較流行的有inotify-tools+rsync和Openduckbill(依賴于inotify-tools)。現在介紹一個解決方案sersync,相對上面兩個項目有以下優點:
sersync是使用c++編寫,而且對linux系統文件系統產生的臨時文件和重復的文件操作進行過濾,所以在結合rsync同步的時候,節省了運行時耗和網絡資源。因此更快。
sersync配置起來很簡單,其中bin目錄下已經有基本上靜態編譯的2進制文件,配合bin目錄下的xml配置文件直接使用即可。
使用多線程進行同步,尤其在同步較大文件時,能夠保證多個服務器實時保持同步狀態。
有出錯處理機制,通過失敗隊列對出錯的文件重新同步,如果仍舊失敗,則按設定時長對同步失敗的文件重新同步。
自帶crontab功能,只需在xml配置文件中開啟,即可按要求隔一段時間整體同步一次。無需再額外配置crontab功能。
能夠實現socket與http插件擴展。
sersync2完全安裝配置說明(一) —-基本功能使用
當前版本的sersync依賴于rsync進行同步。如下圖所示,在同步主服務器上開啟sersync,將監控路徑中的文件同步到目標服務器,因此需要在主服務器配置sersync,在同步目標服務器配置rsync。對于rsync配置,在google上可以找到很多資料,以下只是一些必要的配置和使用說明,僅供參考,請根據您的實際情況修改。
如圖所示,需要在同步主服務器上配置sersync,在同步目標服務器配置rsync,并在目標服務器開啟rsync守候進程,這樣在主服務器產生的文 件,就會被sersync實時同步到多個目標服務器。在centos系統下默認已經安裝了rsync,只需進行配置,并開啟rsync守候進程即可。
配置同步目標服務器rsync
在多臺目標服務器上配置如下:
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 = *上面配置文件,表明允許主服務器(假設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]# 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已經開啟,可以在本地監控路徑下建立文件,查看遠程是否同步成功。2.在開啟實時監控的之前對主服務器目錄與遠程目標機目錄進行一次整體同步
./sersync -r如果需要將sersync運行前,已經存在的所有文件或目錄全部同步到遠程,要以-r參數運行sersync,將本地與遠程整體同步一次。
如果設置了過濾器,即在xml文件中,filter為true,則暫時不能使用-r參數進行整體同步。-r參數將會無效。
3.查看啟動參數幫助
./sersync --help4.指定配置文件
./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 -dsersync2 完全安裝配置說明(二) —-可選功能與xml高級配置
XML文件說明
sersync可選功能是通過xml配置文件來實現的,基本配置文件如下:
| 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> |
下面做逐行的進行解釋說明:
<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。
對于大多數應用,可以嘗試把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文件系統
對于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的方式進行傳輸。
失敗日志腳步配置
對于失敗的傳輸,會進行重新傳送,再次失敗就會寫入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參數指定的插件。詳見請看插件設置。
轉載于:https://blog.51cto.com/zhangshaoxiong/1307054
總結
以上是生活随笔為你收集整理的sersync+rsync实现实时同步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: delphi 最全日期格式_DateUt
- 下一篇: 白天做梦梦到很多蛇是什么意思