sersync进行实时同步数据
上面是網(wǎng)絡(luò) 可以有多個目標(biāo)服務(wù)器,本機同步也可以(要同時開sersync服務(wù)和rsync守護進程)
需求:
1、源服務(wù)器上 要備份的是 ?/opt/tongbu1/ /opt/tongbu2/目錄包括子目錄下的 所有文件,其他文件不備份
2、備份服務(wù)器上 備份的路徑 /home/bgi_tj/tongbu1 ? /home/bgi_tj/tongbu2 ,當(dāng)然備份的服務(wù)器有可能不止一臺
由于源服務(wù)器上文件比較多,一開始同步方案:寫一個rsync腳本,然后定時執(zhí)行同步,但是這樣不能做到實時同步,后來使用rsync+inotify 寫成腳本來做實時同步,也不行,是因為inotify可以做到實時監(jiān)控文件或文件夾創(chuàng)建或是修改,然后通知rsync,但是rsync同步之前都會先構(gòu)造一個Filelist(文件一多,構(gòu)造這個列表的時間就長,系統(tǒng)負載也比較大),所以只要有文件創(chuàng)建或者修改,那么都會構(gòu)造列表,所以這么做不適合大批量文件進行實時同步,這時可以用sersync,
sersync使用 inotify 監(jiān)控操作系統(tǒng)對磁盤的操作事件,通過接收到的事件生成帶特定參數(shù)的rsync命令行并執(zhí)行,從而達到實時增量同步的目的。
前提是。你的linux ?內(nèi)核要2.16.1 以上
sersync項目介紹:
http://code.google.com/p/sersync/
使用指南
http://www.linuxidc.com/Linux/2012-02/53572.htm
http://www.linuxidc.com/Linux/2012-02/53571.htm
詳細解讀文件系統(tǒng)事件–inotify+rsync同步需要過濾事件!
對于Inotify的使用,IBM有一篇文章介紹很詳細,不需要我贅述,鏈接如下:
也可以看我的博客:
http://lilinji.blog.51cto.com/5441000/1194739
http://www.ibm.com/developerworks/cn/linux/l-inotifynew/
大家往往使用inotify-tool比較熟悉,對于其監(jiān)控文件系統(tǒng)的一些特性,卻很少有人總結(jié),有些人用開源的 Inotify腳本程序進行rsync同步,但我希望還是要對文件事件進行過濾,否則會做大量的重復(fù)操作和冗余操作,主要原因是,在我們隊文件進行編輯操 作的時候會產(chǎn)生大量的冗余事件,這些事件有些是臨時文件的產(chǎn)生,有些是對監(jiān)控文件的冗余操作。詳細見下面的測試。
測試環(huán)境:
ubuntu 文件系統(tǒng)Ext4
CentOS 文件系統(tǒng)Ext3
測試工具: Inotify api編寫的監(jiān)控程序,并將發(fā)生的事件打印如下:
如圖所示,產(chǎn)生事件256與8,分別代表create事件與write_close事件。
2.使用vi語句創(chuàng)建test文件,vi test,產(chǎn)生事件如下:
如圖所示,會產(chǎn)生一些臨時文件,他們一swp與swpx進行結(jié)尾。其中512事件代表刪除文件,可見我們在進行vi的時候,其實背后會有很多額外的操作開銷。但具體問什么需要這么繁瑣的過程,目前還不清楚。
3.對通過vi打開的文件,進行write操作,在vi命令提示符下執(zhí)行w,產(chǎn)生如下8個事件
如圖所示,這回會產(chǎn)生一些名字叫4913的事件,這個數(shù)字貌似是不變的,就是你write其他文件,也會產(chǎn)生4913事件。但如果創(chuàng)建的文件本身名字就叫4913,那么會產(chǎn)生其它數(shù)字的臨時文件,真是奇怪…
其中64是move_from事件,是將文件mv出當(dāng)前路徑時產(chǎn)生事件,128代表將其他路徑文件移入當(dāng)前路徑,移 出與移入操作可以通過cookie值,來確定是否是同一文件。可見,當(dāng)移動操作時候,是將test移動為test~,其實是修改了名字,通過cookie 可以看出,它們是對同一文件的操作。
如果對vi打開的文件做退出操作,即執(zhí)行q命令:
對同一個文件做write and close操作的時候,即在vi命令行下,執(zhí)行wq,則產(chǎn)生10個事件如下:
可見,如果不對事件進行監(jiān)控,一個簡單的write操作都會產(chǎn)生很多冗余事件。
但也有些事件是唯一的,舉例如下:
1.對已經(jīng)產(chǎn)生的文件,重新進行touch操作,如test已經(jīng)產(chǎn)生了,再次執(zhí)行touch test操作時事件如下:
如圖,只產(chǎn)生了write_close事件,覆蓋了已經(jīng)touch的文件。
2.從其他路徑cp一個文件,到監(jiān)控路徑:
相當(dāng)于進行了一次寫覆蓋操作。
3.從其他路徑move一個文件到監(jiān)控路徑:
只產(chǎn)生了move_to事件。
4.剛才看到了,如果write名為test文件,產(chǎn)生臨時文件4913,如果我write名為4913的文件時候,事件如下:
如果write為5036,時候,會產(chǎn)生數(shù)字為其它的臨時文件,真的是有意思。
所以那些希望使用inotify與Rsync進行同步的用戶,腳本里要加上過濾功能啊。
我在后續(xù)的文章里提到我自己寫的服務(wù)器同步程序,功能如下:
1 .過濾臨時文件和不需要的事件,比如在write的時候只產(chǎn)生一個事件,這樣就之需要rsync一次即可。
2 .當(dāng)rsync失敗的時候,會進行稍后重新執(zhí)行,如果仍舊失敗,10小時候再次執(zhí)行,確保服務(wù)器同步準(zhǔn)確。
3 .對于本地沒有的文件,我也會對遠程文件路徑進行刪除,同時不會比較其他文件,那些使用 rsync –include=/* –include=xxx.php$ –exclude=* ?的用戶注意了,那種執(zhí)行方式,效率很低,會遞歸比較所有目錄。
4.支持主機到多個分機的同步,別且使用多線程同時執(zhí)行,使文件在所有服務(wù)器上保持一致。并且同時同步inotiy產(chǎn)生的多個文件。
5.線程的數(shù)量可以根據(jù)服務(wù)器的性能,進行配置,好服務(wù)器可以開得多,同時執(zhí)行的更多。
可執(zhí)行文件及源碼地址如下: http://code.google.com/p/sersync/
Sersync服務(wù)器同步程序 項目簡介與設(shè)計框架
http://code.google.com/p/sersync/
項目簡介:
本項目利用inotify與rsync對服務(wù)器進行實時同步,其中inotify用于監(jiān)控文件系統(tǒng)事件,rsync是目前廣泛使用的同步算法,其優(yōu)點是只對文件不同的部分進行操作,所以其優(yōu)勢大大超過使用掛接文件系統(tǒng)的方式進行鏡像同步。
目前使用的比較多的同步程序版本是inotify-tools,另外一個是google開源項目Openduckbill(依賴于inotify- tools),這兩個都是基于腳本語言編寫的,其設(shè)計思路同樣是采用inotify與rsync命令。 相比較上面兩個項目,本項目優(yōu)點是:
1.sersync是使用c++編寫,而且對linux系統(tǒng)文件系統(tǒng)產(chǎn)生的臨時文件和重復(fù)的文件操作進行過濾(我稍后會提到),所以在結(jié)合rsync同步的時候,節(jié)省了運行時耗和網(wǎng)絡(luò)資源。因此更快。
2.相比較上面兩個項目,sersync配置起來很簡單:在http://code.google.com/p/sersync/downloads /list 處下載源碼(分為32版本,與64位版本),其中bin目錄下已經(jīng)有我編譯好的2進制文件,配合bin目錄下的xml文件直接使用即可。
3.另外本項目相比較其他腳本開源項目,使用多線程進行同步,尤其在同步較大文件時,能夠保證多個服務(wù)器實時保持同步狀態(tài)。
4.本項目自帶出錯處理機制,通過失敗隊列對出錯的文件重新出錯,如果仍舊失敗,則每10個小時對同步失敗的文件重新同步。
5.本項目自帶crontab功能,只需在xml配置文件中開啟,即可按您的要求,隔一段時間整體同步一次。
6.本項目自帶socket與http協(xié)議擴展,滿足您二次開發(fā)的需要。
插件相關(guān)xml
| 01 | <sersync> |
| 02 | ...... |
| 03 | <pluginstart="false"name="command"/> |
| 04 | </sersync> |
| 05 | <pluginname="command"> |
| 06 | <paramprefix="/bin/sh"suffix=""ignoreError="true"/> |
| 07 | <filterstart="false"> |
| 08 | <includeexpression="(.*)\.php"/> |
| 09 | <includeexpression="(.*)\.sh"/> |
| 10 | </filter> |
| 11 | </plugin> |
| 12 | <pluginname="socket"> |
| 13 | <localpathwatch="/opt/tongbu"> |
| 14 | <deshostip="192.168.138.20"port="8009"/> |
| 15 | </localpath> |
| 16 | </plugin> |
| 17 | <pluginname="refreshCDN"> |
| 18 | <localpathwatch="/data0/htdocs/cms.xoyo.com/site/"> |
| 19 | <cdninfodomainname="ccms.chinacache.com"port="80"username="xxxx"passwd="xxxx"/> |
| 20 | <sendurlbase="http://pic.xoyo.com/cms"/> |
| 21 | <regexurlregex="false"match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/p_w_picpaths"/> |
| 22 | </localpath> |
| 23 | </plugin> |
如上面的xml所示,其中plugin標(biāo)簽設(shè)置為true時候,在同步文件或路徑到遠程之后后,調(diào)用插件。通過name參數(shù)指定需要執(zhí)行的插件。目前支持的有command refreshCDN socket http四種插件。http插件目前由于兼容性原因去除,以后會重新加入。
以下模塊(command refreshCDN http socket)可以單獨使用(發(fā)生文件改變不同步只調(diào)用插件),只需在命令行下使用-m 參數(shù)即可。如果需要作為插件與同步程序一起使用,見同步程序說明的插件配置。
command插件
當(dāng)文件同步完成后,會調(diào)用command插件,如同步文件是test.php,則test.php文件在改動之后,調(diào)用rsync同步到遠程服務(wù)器后,調(diào)用command插件,執(zhí)行
/bin/sh test.php suffix >/dev/null 2>&1如果suffix 設(shè)置了,則會放在inotify事件test.php之后
如果ignoreError為true,則會添加>/dev/null 2>&1
當(dāng)然還可以設(shè)置command的filter,當(dāng)filter為ture,include可以只對正則匹配到的文件,調(diào)用command。
“refreshCDN”,就在同步過程中將文件發(fā)送到目 的服務(wù)器后刷新cdn接口。如果不想使用,則將start屬性設(shè)為false即可。如果需要使用其他插件,則查看其他plugin標(biāo)簽,將插件名稱改為 xml中其它插件的名稱即可。該模塊根據(jù)chinaCDN的協(xié)議,進行設(shè)計,當(dāng)有文件產(chǎn)生的時候,就向cdn接口發(fā)送需要刷新的路徑位置。刷新CDN模塊需要配置的xml文件如下。
其中 localpath watch 是需要監(jiān)控的目錄。
cdnifo標(biāo)簽制定了cdn接口的域名,端口號,以及用戶名與密碼。
sendurl標(biāo)簽是需要刷新的url的前綴。
regexurl標(biāo)簽中的,regex屬性為true時候,使用match屬性的正則語句匹配inotify返回的路徑信息,并將正則匹配到的部分作為url一部分,
舉例:
如果產(chǎn)生文件事件為:/data0/htdoc/cms.xoyo.com/site/jx3.xoyo.com/p_w_picpath/a/123.txt
經(jīng)過上面的match正則匹配后,最后刷新的路徑是:
http://pic.xoyo.com/cms/jx3/a/123.txt;
如果regex屬性為false,最后刷新的路徑是
http://pic.xoyo.com/cms/jx3.xoyo.com/p_w_picpaths/a/123.txt;
socket插件
socket插件,開啟該模塊,則向指定ip與端口發(fā)送inotify所產(chǎn)生的文件路徑信息。
Http插件
http插件,可以向指定域名的主機post,inotify監(jiān)控的事件。
單獨運行插件
插件也可以單獨使用,即不對遠程目標(biāo)機進行同步,直接調(diào)用插件:
只調(diào)用command插件
./sersync -d -m command只調(diào)用refreshCDN插件
./sersync -d -m refreshCDN只調(diào)用socket插件
./sersync -d -m socket只調(diào)用http插件
./sersync -d -m httpsersync2完全安裝配置說明
當(dāng)前版本的sersync依賴于rsync進行同步。如下圖所示,在同步主服務(wù)器上開啟sersync,將監(jiān)控路徑中的文件同步到目標(biāo)服務(wù)器,因此需要在主服務(wù)器配置sersync,在同步目標(biāo)服務(wù)器配置rsync。對于rsync配置,在google上可以找到很多資料,以下只是一些必要的配置和使用說明,僅供參考,請根據(jù)您的實際情況修改。
如圖所示,需要在同步主服務(wù)器上配置sersync,在同步目標(biāo)服務(wù)器配置rsync,并在目標(biāo)服務(wù)器開啟rsync守候進程,這樣在主服務(wù)器產(chǎn)生的文 件,就會被sersync實時同步到多個目標(biāo)服務(wù)器。在centos系統(tǒng)下默認已經(jīng)安裝了rsync,只需進行配置,并開啟rsync守候進程即可。
配置同步目標(biāo)服務(wù)器rsync
在主服務(wù)器上安裝配置sresync
在目標(biāo)服務(wù)器上配置rsync
1.創(chuàng)建目錄和文件
[root@router bookfm]# mkdir /etc/rsyncd/
[root@router rsyncd]# touch rsyncd.conf ? ? ? ? #創(chuàng)建rsync的配置文件
[root@router rsyncd]# touch rsyncd.secrets ? ?
#創(chuàng)建rsync的密碼文件,里面包含用戶名和密碼,用冒號分開
[root@router rsyncd]#chmod -R 600 . ? ? ? ? ? ? ? ?
#只有root才能讀取這些文件
[root@router rsyncd]# vim rsyncd.conf
uid = root ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
#系統(tǒng)中存在的用戶,這個用戶要能對備份的路徑有寫入權(quán)限
gid = root ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
#系統(tǒng)中存在的用戶組,用戶組要能對備份的路徑有寫入權(quán)限
max connections = 100 ? ? ? ? ?#最大連接數(shù)
use chroot = no ? ? ? ? ? ? ?
log file = /var/rsync/rsync.log ? ? ? #指定同步日志
pid file = /var/rsync/rsyncd.pid ? ? #指定運行時PID文件
lock file = /var/rsync/rsyncd.lock ?
[book]
path = /backup/bookfm ? ? ? ? ? ? ? ? ? #指定備份的路徑
read only=no ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#可寫入 ?
ignore errors = yes ? ? ? ? ? ? ? ? ? ? ? ? ? ?#忽略錯誤
secrets file =/etc/rsyncd/rsyncd.secrets ?
? #指定rsync自身的密碼文件(非系統(tǒng)用戶)
auth users = bookbackup ? ? ? ? ? #指定這個共享名驗證的用戶名
hosts allow = ?192.168.100.246/24 ? ? ? ? ? #只允許這個IP地址
hosts deny = * ? ? ? ? ? ? ? ? #而禁止其他所有IP
[root@router rsyncd]# vim rsyncd.secrets
bookbackup:123456
2.啟動rsync守護進程
[root@router rsyncd]#rsync --daemon --config=/etc/rsyncd/rsyncd.conf
如果不指定端口,默認是873,如果有啟用iptables,那么請放行873端口
rsync --daemon --port=9091 --config=/etc/rsyncd/rsyncd.conf ? 自定義端口時記得防火墻放行該端口
四、在源服務(wù)器上,開啟sersync服務(wù)
[root@server10 book]# /usr/local/GNU-Linux-x86/sersync2 選項
-r 進行整體同步一次
-d 后臺運行
-o 指定配置文件路徑
-n 指定默認的線程池的線程總數(shù),如果不指定,默認啟動線程池數(shù)量是10(適用于四核服務(wù)器)
/usr/local/GNU-Linux-x86/sersync2 -r -d -o /usr/local/GNU-Linux-x86/confxml.xml
通常情況下使用這種方式,對本地到遠程整體同步一次后,在后臺運行實時同步。
/usr/local/GNU-Linux-x86/sersync2 -d -o /usr/local/GNU-Linux-x86/confxml.xml
在源服務(wù)器上開啟sersync守護進程,使sersync在后臺運行,開啟實時同步。
/usr/local/GNU-Linux-x86/sersync2 -r -o /usr/local/GNU-Linux-x86/confxml.xml
在開啟實時監(jiān)控的之前對主服務(wù)器目錄與遠程目標(biāo)機目錄進行一次整體同步
如果設(shè)置了過濾器,即在xml文件中,filter為true,則暫時不能使用-r參數(shù)進行整體同步。-r參數(shù)將會無效
/usr/local/GNU-Linux-x86/sersync2 -n 5 -r -o /usr/local/GNU-Linux-x86/confxml.xml
指定默認的線程池的線程總數(shù),如果不指定,默認啟動線程池數(shù)量是10(適用于四核服務(wù)器)
如果cpu使用過高,可以通過這個參數(shù)調(diào)低,如果機器配置較高,可以用-n調(diào)高線程總數(shù)。
基于上述情況,可以使用以下命令來啟動sersync服務(wù)(如果同步時不過濾文件即filter start=false)
/usr/local/GNU-Linux-x86/sersync2 -n 5 -r -d -o /usr/local/GNU-Linux-x86/confxml.xml
但是根據(jù)自身的情況(因為只備份original.xxx文件),所以必須要啟用文件過濾(即filter start=true),一旦啟用了這個參數(shù),那么-r參數(shù)就無效,而-r參數(shù)又是進行整體同步的參數(shù),那就無法進行一次整體同步。
基于這種情況,可以在源上開啟rsync服務(wù),然后在目標(biāo)上用rsync進行一次整體同步,然后停止源上面的rsync服務(wù),開啟sersync服務(wù),進行實時同步
/usr/local/GNU-Linux-x86/sersync2 -d -o /usr/local/GNU-Linux-x86/confxml.xml
五、測試
在源服務(wù)器上指定目錄下創(chuàng)建original.pdf文件,然后看看目標(biāo)上備份的路徑里面有沒有該文件,然后再創(chuàng)建aaaa文件,看sersync是否同步該文件。
經(jīng)測試,備份時可以做到實時同步,而且系統(tǒng)負載也較小。
在google code下載sersync的可執(zhí)行文件版本,里面有配置文件與可執(zhí)行文件,這里用sersync2.5進行說明,新版本配置形式類似。
1.在主服務(wù)器上開啟sersync守護進程,使sersync在后臺運行,開啟實時同步。
./sersync -d過程如下:
[root@localhost GNU-Linux-x86]# lsconfxml.xml ?sersync2
[root@localhost GNU-Linux-x86]# ./sersync2 -d
set 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)控路徑下建立文件,查看遠程是否同步成功。2.在開啟實時監(jiān)控的之前對主服務(wù)器目錄與遠程目標(biāo)機目錄進行一次整體同步
./sersync -r如果需要將sersync運行前,已經(jīng)存在的所有文件或目錄全部同步到遠程,要以-r參數(shù)運行sersync,將本地與遠程整體同步一次。
如果設(shè)置了過濾器,即在xml文件中,filter為true,則暫時不能使用-r參數(shù)進行整體同步。-r參數(shù)將會無效。
3.查看啟動參數(shù)幫助
./sersync --help4.指定配置文件
./sersync -o XXXX.xml對于sersync使用可執(zhí)行文件目錄下的默認配置文件confxml.xml,如果需要使用另一個配置文件,可以使用-o參數(shù)指定其它配置文件。
5.指定默認的線程池的線程總數(shù)
./sersync -n num例如 ./sersync -n 5 則指定線程總數(shù)為5,如果不指定,默認啟動線程池數(shù)量是10,如果cpu使用過高,可以通過這個參數(shù)調(diào)低,如果機器配置較高,可以用-n跳高線程總數(shù)。
6.不進行同步,只運行插件
./sersync -m pluginName例如./sersync -m command,則在監(jiān)控到文件事件后,不對遠程目標(biāo)服務(wù)器進行同步,而是直接運行command插件。
7.多個參數(shù)可以配合使用
./sersync -n 8 -o abc.xml -r -d表示,設(shè)置線程池工作線程為8個,指定abc.xml作為配置文件,在實時監(jiān)控前作一次整體同步,以守護進程方式在后臺運行。
8.通常情況下,對本地到遠程整體同步一遍后,在后臺運行實時同步。
./sersync -d轉(zhuǎn)載于:https://blog.51cto.com/lilinji/1197344
總結(jié)
以上是生活随笔為你收集整理的sersync进行实时同步数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代码行统计脚本.
- 下一篇: android常用代码