日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sersync进行实时同步数据

發布時間:2025/5/22 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sersync进行实时同步数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上面是網絡 可以有多個目標服務器,本機同步也可以(要同時開sersync服務和rsync守護進程)


需求:


1、源服務器上 要備份的是 ?/opt/tongbu1/ /opt/tongbu2/目錄包括子目錄下的 所有文件,其他文件不備份


2、備份服務器上 備份的路徑 /home/bgi_tj/tongbu1 ? /home/bgi_tj/tongbu2 ,當然備份的服務器有可能不止一臺


由于源服務器上文件比較多,一開始同步方案:寫一個rsync腳本,然后定時執行同步,但是這樣不能做到實時同步,后來使用rsync+inotify 寫成腳本來做實時同步,也不行,是因為inotify可以做到實時監控文件或文件夾創建或是修改,然后通知rsync,但是rsync同步之前都會先構造一個Filelist(文件一多,構造這個列表的時間就長,系統負載也比較大),所以只要有文件創建或者修改,那么都會構造列表,所以這么做不適合大批量文件進行實時同步,這時可以用sersync,

sersync使用 inotify 監控操作系統對磁盤的操作事件,通過接收到的事件生成帶特定參數的rsync命令行并執行,從而達到實時增量同步的目的。

前提是。你的linux ?內核要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

詳細解讀文件系統事件–inotify+rsync同步需要過濾事件!

對于Inotify的使用,IBM有一篇文章介紹很詳細,不需要我贅述,鏈接如下:

也可以看我的博客:

http://lilinji.blog.51cto.com/5441000/1194739

http://www.ibm.com/developerworks/cn/linux/l-inotifynew/

大家往往使用inotify-tool比較熟悉,對于其監控文件系統的一些特性,卻很少有人總結,有些人用開源的 Inotify腳本程序進行rsync同步,但我希望還是要對文件事件進行過濾,否則會做大量的重復操作和冗余操作,主要原因是,在我們隊文件進行編輯操 作的時候會產生大量的冗余事件,這些事件有些是臨時文件的產生,有些是對監控文件的冗余操作。詳細見下面的測試。

測試環境:

ubuntu 文件系統Ext4

CentOS 文件系統Ext3

測試工具: Inotify api編寫的監控程序,并將發生的事件打印如下:


如圖所示,產生事件256與8,分別代表create事件與write_close事件。

2.使用vi語句創建test文件,vi test,產生事件如下:

如圖所示,會產生一些臨時文件,他們一swp與swpx進行結尾。其中512事件代表刪除文件,可見我們在進行vi的時候,其實背后會有很多額外的操作開銷。但具體問什么需要這么繁瑣的過程,目前還不清楚。

3.對通過vi打開的文件,進行write操作,在vi命令提示符下執行w,產生如下8個事件


如圖所示,這回會產生一些名字叫4913的事件,這個數字貌似是不變的,就是你write其他文件,也會產生4913事件。但如果創建的文件本身名字就叫4913,那么會產生其它數字的臨時文件,真是奇怪…

其中64是move_from事件,是將文件mv出當前路徑時產生事件,128代表將其他路徑文件移入當前路徑,移 出與移入操作可以通過cookie值,來確定是否是同一文件。可見,當移動操作時候,是將test移動為test~,其實是修改了名字,通過cookie 可以看出,它們是對同一文件的操作。

如果對vi打開的文件做退出操作,即執行q命令:

對同一個文件做write and close操作的時候,即在vi命令行下,執行wq,則產生10個事件如下:

可見,如果不對事件進行監控,一個簡單的write操作都會產生很多冗余事件。

但也有些事件是唯一的,舉例如下:

1.對已經產生的文件,重新進行touch操作,如test已經產生了,再次執行touch test操作時事件如下:

如圖,只產生了write_close事件,覆蓋了已經touch的文件。

2.從其他路徑cp一個文件,到監控路徑:

相當于進行了一次寫覆蓋操作。

3.從其他路徑move一個文件到監控路徑:

只產生了move_to事件。

4.剛才看到了,如果write名為test文件,產生臨時文件4913,如果我write名為4913的文件時候,事件如下:

如果write為5036,時候,會產生數字為其它的臨時文件,真的是有意思。

所以那些希望使用inotify與Rsync進行同步的用戶,腳本里要加上過濾功能啊。

我在后續的文章里提到我自己寫的服務器同步程序,功能如下:

1 .過濾臨時文件和不需要的事件,比如在write的時候只產生一個事件,這樣就之需要rsync一次即可。

2 .當rsync失敗的時候,會進行稍后重新執行,如果仍舊失敗,10小時候再次執行,確保服務器同步準確。

3 .對于本地沒有的文件,我也會對遠程文件路徑進行刪除,同時不會比較其他文件,那些使用 rsync –include=/* –include=xxx.php$ –exclude=* ?的用戶注意了,那種執行方式,效率很低,會遞歸比較所有目錄。

4.支持主機到多個分機的同步,別且使用多線程同時執行,使文件在所有服務器上保持一致。并且同時同步inotiy產生的多個文件。

5.線程的數量可以根據服務器的性能,進行配置,好服務器可以開得多,同時執行的更多。

可執行文件及源碼地址如下: http://code.google.com/p/sersync/


Sersync服務器同步程序 項目簡介與設計框架

http://code.google.com/p/sersync/

項目簡介:

本項目利用inotify與rsync對服務器進行實時同步,其中inotify用于監控文件系統事件,rsync是目前廣泛使用的同步算法,其優點是只對文件不同的部分進行操作,所以其優勢大大超過使用掛接文件系統的方式進行鏡像同步。
目前使用的比較多的同步程序版本是inotify-tools,另外一個是google開源項目Openduckbill(依賴于inotify- tools),這兩個都是基于腳本語言編寫的,其設計思路同樣是采用inotify與rsync命令。 相比較上面兩個項目,本項目優點是:
1.sersync是使用c++編寫,而且對linux系統文件系統產生的臨時文件和重復的文件操作進行過濾(我稍后會提到),所以在結合rsync同步的時候,節省了運行時耗和網絡資源。因此更快。
2.相比較上面兩個項目,sersync配置起來很簡單:在http://code.google.com/p/sersync/downloads /list 處下載源碼(分為32版本,與64位版本),其中bin目錄下已經有我編譯好的2進制文件,配合bin目錄下的xml文件直接使用即可。
3.另外本項目相比較其他腳本開源項目,使用多線程進行同步,尤其在同步較大文件時,能夠保證多個服務器實時保持同步狀態。
4.本項目自帶出錯處理機制,通過失敗隊列對出錯的文件重新出錯,如果仍舊失敗,則每10個小時對同步失敗的文件重新同步。
5.本項目自帶crontab功能,只需在xml配置文件中開啟,即可按您的要求,隔一段時間整體同步一次。
6.本項目自帶socket與http協議擴展,滿足您二次開發的需要。

插件相關xml


view sourceprint?
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標簽設置為true時候,在同步文件或路徑到遠程之后后,調用插件。通過name參數指定需要執行的插件。目前支持的有command refreshCDN socket http四種插件。http插件目前由于兼容性原因去除,以后會重新加入。

以下模塊(command refreshCDN http socket)可以單獨使用(發生文件改變不同步只調用插件),只需在命令行下使用-m 參數即可。如果需要作為插件與同步程序一起使用,見同步程序說明的插件配置。

command插件

當文件同步完成后,會調用command插件,如同步文件是test.php,則test.php文件在改動之后,調用rsync同步到遠程服務器后,調用command插件,執行

/bin/sh test.php suffix >/dev/null 2>&1

如果suffix 設置了,則會放在inotify事件test.php之后
如果ignoreError為true,則會添加>/dev/null 2>&1
當然還可以設置command的filter,當filter為ture,include可以只對正則匹配到的文件,調用command。

“refreshCDN”,就在同步過程中將文件發送到目 的服務器后刷新cdn接口。如果不想使用,則將start屬性設為false即可。如果需要使用其他插件,則查看其他plugin標簽,將插件名稱改為 xml中其它插件的名稱即可。該模塊根據chinaCDN的協議,進行設計,當有文件產生的時候,就向cdn接口發送需要刷新的路徑位置。刷新CDN模塊需要配置的xml文件如下。


<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/p_w_picpaths"/> </localpath> </plugin>

其中 localpath watch 是需要監控的目錄。

cdnifo標簽制定了cdn接口的域名,端口號,以及用戶名與密碼。

sendurl標簽是需要刷新的url的前綴。

regexurl標簽中的,regex屬性為true時候,使用match屬性的正則語句匹配inotify返回的路徑信息,并將正則匹配到的部分作為url一部分,

舉例:

如果產生文件事件為:/data0/htdoc/cms.xoyo.com/site/jx3.xoyo.com/p_w_picpath/a/123.txt

經過上面的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與端口發送inotify所產生的文件路徑信息。

Http插件

http插件,可以向指定域名的主機post,inotify監控的事件。


單獨運行插件

插件也可以單獨使用,即不對遠程目標機進行同步,直接調用插件:

只調用command插件

./sersync -d -m command

只調用refreshCDN插件

./sersync -d -m refreshCDN

只調用socket插件

./sersync -d -m socket

只調用http插件

./sersync -d -m http

sersync2完全安裝配置說明


當前版本的sersync依賴于rsync進行同步。如下圖所示,在同步主服務器上開啟sersync,將監控路徑中的文件同步到目標服務器,因此需要在主服務器配置sersync,在同步目標服務器配置rsync。對于rsync配置,在google上可以找到很多資料,以下只是一些必要的配置和使用說明,僅供參考,請根據您的實際情況修改。


如圖所示,需要在同步主服務器上配置sersync,在同步目標服務器配置rsync,并在目標服務器開啟rsync守候進程,這樣在主服務器產生的文 件,就會被sersync實時同步到多個目標服務器。在centos系統下默認已經安裝了rsync,只需進行配置,并開啟rsync守候進程即可。

配置同步目標服務器rsync


rsync --daemon

在主服務器上安裝配置sresync

在目標服務器上配置rsync




1.創建目錄和文件


[root@router bookfm]# mkdir /etc/rsyncd/


[root@router rsyncd]# touch rsyncd.conf ? ? ? ? #創建rsync的配置文件


[root@router rsyncd]# touch rsyncd.secrets ? ?


#創建rsync的密碼文件,里面包含用戶名和密碼,用冒號分開


[root@router rsyncd]#chmod -R 600 . ? ? ? ? ? ? ? ?


#只有root才能讀取這些文件


[root@router rsyncd]# vim rsyncd.conf


uid = root ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?


#系統中存在的用戶,這個用戶要能對備份的路徑有寫入權限

gid = root ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?


#系統中存在的用戶組,用戶組要能對備份的路徑有寫入權限

max connections = 100 ? ? ? ? ?#最大連接數

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自身的密碼文件(非系統用戶)

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 ? 自定義端口時記得防火墻放行該端口




四、在源服務器上,開啟sersync服務




[root@server10 book]# /usr/local/GNU-Linux-x86/sersync2 選項


-r 進行整體同步一次


-d 后臺運行


-o 指定配置文件路徑


-n 指定默認的線程池的線程總數,如果不指定,默認啟動線程池數量是10(適用于四核服務器)




/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


在源服務器上開啟sersync守護進程,使sersync在后臺運行,開啟實時同步。





/usr/local/GNU-Linux-x86/sersync2 -r -o /usr/local/GNU-Linux-x86/confxml.xml


在開啟實時監控的之前對主服務器目錄與遠程目標機目錄進行一次整體同步


如果設置了過濾器,即在xml文件中,filter為true,則暫時不能使用-r參數進行整體同步。-r參數將會無效





/usr/local/GNU-Linux-x86/sersync2 -n 5 -r -o /usr/local/GNU-Linux-x86/confxml.xml


指定默認的線程池的線程總數,如果不指定,默認啟動線程池數量是10(適用于四核服務器)


如果cpu使用過高,可以通過這個參數調低,如果機器配置較高,可以用-n調高線程總數。





基于上述情況,可以使用以下命令來啟動sersync服務(如果同步時不過濾文件即filter start=false)


/usr/local/GNU-Linux-x86/sersync2 -n 5 -r -d -o /usr/local/GNU-Linux-x86/confxml.xml





但是根據自身的情況(因為只備份original.xxx文件),所以必須要啟用文件過濾(即filter start=true),一旦啟用了這個參數,那么-r參數就無效,而-r參數又是進行整體同步的參數,那就無法進行一次整體同步。


基于這種情況,可以在源上開啟rsync服務,然后在目標上用rsync進行一次整體同步,然后停止源上面的rsync服務,開啟sersync服務,進行實時同步


/usr/local/GNU-Linux-x86/sersync2 -d -o /usr/local/GNU-Linux-x86/confxml.xml


五、測試


在源服務器上指定目錄下創建original.pdf文件,然后看看目標上備份的路徑里面有沒有該文件,然后再創建aaaa文件,看sersync是否同步該文件。


經測試,備份時可以做到實時同步,而且系統負載也較小。






在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 -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已經開啟,可以在本地監控路徑下建立文件,查看遠程是否同步成功。

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



轉載于:https://blog.51cto.com/lilinji/1197344

總結

以上是生活随笔為你收集整理的sersync进行实时同步数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。