sersync基于rsync+inotify實現(xiàn)數(shù)據(jù)實時同步

前言

提到數(shù)據(jù)同步就必然會談到rsync,一般簡單的服務(wù)器數(shù)據(jù)傳輸會使用ftp/sftp等方式奶浦,但是這樣的方式效率不高兄墅,不支持差異化增量同步也不支持實時傳輸。針對數(shù)據(jù)實時同步需求大多數(shù)人會選擇rsync+inotify-tools的解決方案澳叉,但是這樣的方案也存在一些缺陷(文章中會具體指出)隙咸,sersync是國人基于前兩者開發(fā)的工具,不僅保留了優(yōu)點同時還強化了實時監(jiān)控成洗,文件過濾五督,簡化配置等功能,幫助用戶提高運行效率泌枪,節(jié)省時間和網(wǎng)絡(luò)資源概荷。

可靠高效的數(shù)據(jù)實時同步方式


更新歷史

2015年08月13日 - 初稿

閱讀原文 - http://wsgzao.github.io/post/sersync/

擴(kuò)展閱讀

基于rsync+sersync的服務(wù)器文件同步實戰(zhàn) - http://www.markdream.com/technologies/server/syncfile-by-rsync.shtml
通過 rsync sersync 實現(xiàn)高效的數(shù)據(jù)實時同步架構(gòu) - https://www.cnhzz.com/rsync_sersync/
rsync - https://rsync.samba.org/
inotify-tools - https://github.com/rvoicilas/inotify-tools
sersync - http://code.google.com/p/sersync/


原理

Synchronize files and folders between servers -using inotiy and rsync with c++ 服務(wù)器實時同步文件,服務(wù)器鏡像解決方案

sersync主要用于服務(wù)器同步碌燕,web鏡像等功能误证。基于boost1.43.0,inotify api,rsync command.開發(fā)修壕。目前使用的比較多的同步解決方案是inotify-tools+rsync 愈捅,另外一個是google開源項目Openduckbill(依賴于inotify- tools),這兩個都是基于腳本語言編寫的慈鸠。相比較上面兩個項目蓝谨,本項目優(yōu)點是:

  1. sersync是使用c++編寫,而且對linux系統(tǒng)文件系統(tǒng)產(chǎn)生的臨時文件和重復(fù)的文件操作進(jìn)行過濾(詳細(xì)見附錄青团,這個過濾腳本程序沒有實現(xiàn))譬巫,所以在結(jié)合rsync同步的時候,節(jié)省了運行時耗和網(wǎng)絡(luò)資源督笆。因此更快芦昔。
  2. 相比較上面兩個項目,sersync配置起來很簡單娃肿,其中bin目錄下已經(jīng)有基本上靜態(tài)編譯的2進(jìn)制文件咕缎,配合bin目錄下的xml配置文件直接使用即可珠十。
  3. 另外本項目相比較其他腳本開源項目,使用多線程進(jìn)行同步凭豪,尤其在同步較大文件時焙蹭,能夠保證多個服務(wù)器實時保持同步狀態(tài)。
  4. 本項目有出錯處理機(jī)制嫂伞,通過失敗隊列對出錯的文件重新同步孔厉,如果仍舊失敗,則按設(shè)定時長對同步失敗的文件重新同步末早。
  5. 本項目自帶crontab功能烟馅,只需在xml配置文件中開啟,即可按您的要求然磷,隔一段時間整體同步一次郑趁。無需再額外配置crontab功能。
  6. 本項目socket與http插件擴(kuò)展姿搜,滿足您二次開發(fā)的需要寡润。

針對上圖的設(shè)計架構(gòu),這里做幾點說明舅柜,來幫助大家閱讀和理解該圖

1 ) 線程組線程是等待線程隊列的守護(hù)線程梭纹,當(dāng)事件隊列中有事件產(chǎn)生的時候,線程組守護(hù)線程就會逐個喚醒同步線程致份。當(dāng)隊列中 Inotify 事件較多的時候变抽,同步線程就會被全部喚醒一起工作。這樣設(shè)計的目的是為了能夠同時處理多個 Inotify 事件氮块,從而提升服務(wù)器的并發(fā)同步能力绍载。同步線程的最佳數(shù)量=核數(shù) x 2 + 2。
2 ) 那么之所以稱之為線程組線程滔蝉,是因為每個線程在工作的時候击儡,會根據(jù)服務(wù)器上新寫入文件的數(shù)量去建立子線程,子線程可以保證所有的文件與各個服務(wù)器同時同步蝠引。當(dāng)要同步的文件較大的時候阳谍,這樣的設(shè)計可以保證每個遠(yuǎn)程服務(wù)器都可以同時獲得需要同步的文件。
3 ) 服務(wù)線程的作用有三個:

  • 處理同步失敗的文件螃概,將這些文件再次同步矫夯,對于再次同步失敗的文件會生成 rsync_fail_log.sh 腳本,記錄失敗的事件吊洼。
  • 每隔10個小時執(zhí)行 rsync_fail_log.sh 腳本一次训貌,同時清空腳本。
  • crontab功能融蹂,可以每隔一定時間旺订,將所有路徑整體同步一次。

4 ) 過濾隊列的建立是為了過濾短時間內(nèi)產(chǎn)生的重復(fù)的inotify信息超燃,例如在刪除文件夾的時候区拳,inotify就會同時產(chǎn)生刪除文件夾里的文件與刪除文件夾的事件,通過過濾隊列意乓,當(dāng)刪除文件夾事件產(chǎn)生的時候樱调,會將之前加入隊列的刪除文件的事件全部過濾掉,這樣只產(chǎn)生一條刪除文件夾的事件届良,從而減輕了同步的負(fù)擔(dān)笆凌。同時對于修改文件的操作的時候,會產(chǎn)生臨時文件的重復(fù)操作士葫。

角色

注意主從配置的區(qū)別乞而,記得調(diào)整SELinux和防火墻

iptables配置實踐 - http://wsgzao.github.io/post/iptables/
LTMP手動編譯安裝以及全自動化部署實踐 - http://wsgzao.github.io/post/ltmp/

  1. 服務(wù)器A(主服務(wù)器)
  2. 服務(wù)器B(從服務(wù)器/備份服務(wù)器)
  3. rsync默認(rèn)TCP端口為873

服務(wù)器B

#在服務(wù)器B上安裝rsync
cd /app/local
wget  http://rsync.samba.org/ftp/rsync/src/rsync-3.1.1.tar.gz
tar zxf rsync-3.1.1.tar.gz
cd rsync-3.1.1
./configure
make && make install

#設(shè)置rsync的配置文件
vi /etc/rsyncd.conf

#服務(wù)器B上的rsyncd.conf文件內(nèi)容
uid=root
gid=root
#最大連接數(shù)
max connections=36000
#默認(rèn)為true,修改為no慢显,增加對目錄文件軟連接的備份 
use chroot=no
#定義日志存放位置
log file=/var/log/rsyncd.log
#忽略無關(guān)錯誤
ignore errors = yes
#設(shè)置rsync服務(wù)端文件為讀寫權(quán)限
read only = no 
#認(rèn)證的用戶名與系統(tǒng)帳戶無關(guān)在認(rèn)證文件做配置爪模,如果沒有這行則表明是匿名
auth users = rsync
#密碼認(rèn)證文件,格式(虛擬用戶名:密碼)
secrets file = /etc/rsync.pass
#這里是認(rèn)證的模塊名荚藻,在client端需要指定屋灌,可以設(shè)置多個模塊和路徑
[rsync]
#自定義注釋
comment  = rsync
#同步到B服務(wù)器的文件存放的路徑
path=/app/data/site/
[img]
comment  = img
path=/app/data/site/img

#創(chuàng)建rsync認(rèn)證文件  可以設(shè)置多個,每行一個用戶名:密碼应狱,注意中間以“:”分割
echo "rsync:rsync" > /etc/rsync.pass

#設(shè)置文件所有者讀取共郭、寫入權(quán)限
chmod 600 /etc/rsyncd.conf  
chmod 600 /etc/rsync.pass  

#啟動服務(wù)器B上的rsync服務(wù)
#rsync --daemon -v
rsync --daemon

#監(jiān)聽端口873
netstat -an | grep 873
lsof -i tcp:873

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rsync   31445 root    4u  IPv4 443872      0t0  TCP *:rsync (LISTEN)
rsync   31445 root    5u  IPv6 443873      0t0  TCP *:rsync (LISTEN)

#設(shè)置rsync為服務(wù)啟動項(可選)
echo "/usr/local/bin/rsync --daemon" >> /etc/rc.local

#要 Kill rsync 進(jìn)程,不要用 kill -HUP {PID} 的方式重啟進(jìn)程疾呻,以下3種方式任選
#ps -ef|grep rsync|grep -v grep|awk '{print $2}'|xargs kill -9
#cat /var/run/rsyncd.pid | xargs kill -9
pkill rsync
#再次啟動
/usr/local/bin/rsync --daemon

服務(wù)器A

#安裝rsync
cd /app/local
wget  http://rsync.samba.org/ftp/rsync/src/rsync-3.1.1.tar.gz
tar zxf rsync-3.1.1.tar.gz
cd rsync-3.1.1
./configure
make && make install

#安裝inotify-tools
cd /app/local
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
tar zxf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure --prefix=/app/local/inotify 
make && make install

#安裝sersync
cd /app/local
wget https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz
tar zxf sersync2.5.4_64bit_binary_stable_final.tar.gz
mv /app/local/GNU-Linux-x86/ /app/local/sersync
cd /app/local/sersync
#配置下密碼文件除嘹,因為這個密碼是要訪問服務(wù)器B需要的密碼和上面服務(wù)器B的密碼必須一致
echo "rsync" > /app/local/sersync/user.pass
#修改權(quán)限
chmod 600 /app/local/sersync/user.pass
#修改confxml.conf
vi /app/local/sersync/confxml.xml


<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
 <host hostip="localhost" port="8008"></host>
 <debug start="true"/>
 <fileSystem xfs="false"/>
 <filter start="false">
 <exclude expression="(.*)\.php"></exclude>
 <exclude expression="^data/*"></exclude>
 </filter>
 <inotify>
 <delete start="true"/>
 <createFolder start="true"/>
 <createFile start="false"/>
 <closeWrite start="true"/>
 <moveFrom start="true"/>
 <moveTo start="true"/>
 <attrib start="false"/>
 <modify start="false"/>
 </inotify>
 
 <sersync>
 <localpath watch="/home/"> <!-- 這里填寫服務(wù)器A要同步的文件夾路徑-->
 <remote ip="8.8.8.8" name="rsync"/> <!-- 這里填寫服務(wù)器B的IP地址和模塊名-->
 <!--<remote ip="192.168.28.39" name="tongbu"/>-->
 <!--<remote ip="192.168.28.40" name="tongbu"/>-->
 </localpath>
 <rsync>
 <commonParams params="-artuz"/>
 <auth start="true" users="rsync" passwordfile="/app/local/sersync/user.pass"/> <!-- rsync+密碼文件 這里填寫服務(wù)器B的認(rèn)證信息-->
 <userDefinedPort start="false" port="874"/><!-- port=874 -->
 <timeout start="false" time="100"/><!-- timeout=100 -->
 <ssh start="false"/>
 </rsync>
 <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once--><!-- 修改失敗日志記錄(可選)-->
 <crontab start="false" schedule="600"><!--600mins-->
 <crontabfilter start="false">
 <exclude expression="*.php"></exclude>
 <exclude expression="info/*"></exclude>
 </crontabfilter>
 </crontab>
 <plugin start="false" name="command"/>
 </sersync>
 
 <!-- 下面這些有關(guān)于插件你可以忽略了 -->
 <plugin name="command">
 <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
 <filter start="false">
 <include expression="(.*)\.php"/>
 <include expression="(.*)\.sh"/>
 </filter>
 </plugin>
 
 <plugin name="socket">
 <localpath watch="/home/demo">
 <deshost ip="210.36.158.xxx" port="8009"/>
 </localpath>
 </plugin>
 <plugin name="refreshCDN">
 <localpath watch="/data0/htdocs/cdn.markdream.com/site/">
 <cdninfo domainname="cdn.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
 <sendurl base="http://cdn.markdream.com/cms"/>
 <regexurl regex="false" match="cdn.markdream.com/site([/a-zA-Z0-9]*).cdn.markdream.com/images"/>
 </localpath>
 </plugin>
</head>

#運行sersync
nohup /app/local/sersync/sersync2 -r -d -o /app/local/sersync/confxml.xml >/app/local/sersync/rsync.log 2>&1 &
nohup /app/local/sersync/sersync2 -r -d -o /app/local/sersync/img.xml >/app/local/sersync/img.log 2>&1 &

-d:啟用守護(hù)進(jìn)程模式
-r:在監(jiān)控前,將監(jiān)控目錄與遠(yuǎn)程主機(jī)用rsync命令推送一遍
-n: 指定開啟守護(hù)線程的數(shù)量罐韩,默認(rèn)為10個
-o:指定配置文件憾赁,默認(rèn)使用confxml.xml文件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市散吵,隨后出現(xiàn)的幾起案子龙考,更是在濱河造成了極大的恐慌,老刑警劉巖矾睦,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晦款,死亡現(xiàn)場離奇詭異,居然都是意外死亡枚冗,警方通過查閱死者的電腦和手機(jī)缓溅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赁温,“玉大人坛怪,你說我怎么就攤上這事淤齐。” “怎么了袜匿?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵更啄,是天一觀的道長。 經(jīng)常有香客問我居灯,道長祭务,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任怪嫌,我火速辦了婚禮义锥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岩灭。我一直安慰自己拌倍,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布噪径。 她就那樣靜靜地躺著贰拿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熄云。 梳的紋絲不亂的頭發(fā)上膨更,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機(jī)與錄音缴允,去河邊找鬼荚守。 笑死,一個胖子當(dāng)著我的面吹牛练般,可吹牛的內(nèi)容都是我干的矗漾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼薄料,長吁一口氣:“原來是場噩夢啊……” “哼敞贡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起摄职,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤誊役,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谷市,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛔垢,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年迫悠,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹏漆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖艺玲,靈堂內(nèi)的尸體忽然破棺而出括蝠,到底是詐尸還是另有隱情,我是刑警寧澤饭聚,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布又跛,位于F島的核電站,受9級特大地震影響若治,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜感混,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一端幼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弧满,春花似錦婆跑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至募谎,卻和暖如春扶关,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背数冬。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工节槐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拐纱。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓铜异,卻偏偏與公主長得像,于是被迫代替她去往敵國和親秸架。 傳聞我的和親對象是個殘疾皇子揍庄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 說明: 操作系統(tǒng):CentOS 5.X 源服務(wù)器:192.168.21.129 目標(biāo)服務(wù)器:192.168.21....
    好一朵閱讀 1,243評論 0 0
  • 4層負(fù)載均衡和7層負(fù)載均衡的區(qū)別。A东抹、rsync的安裝蚂子;軟件包安裝# yum install rsync 注...
    米開朗基樂閱讀 3,650評論 0 1
  • 隨著應(yīng)用系統(tǒng)規(guī)模的不斷擴(kuò)大,對數(shù)據(jù)的安全性和可靠性也提出的更好的要求缭黔,rsync在高端業(yè)務(wù)系統(tǒng)中也逐漸暴露出了很多...
    jimlin閱讀 1,060評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理缆镣,服務(wù)發(fā)現(xiàn),斷路器试浙,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 1.1 inotify介紹 inotify是一種強大的董瞻、細(xì)粒度的、異步的文件系統(tǒng)事件控制機(jī)制。linux內(nèi)核從2....
    minima1ist閱讀 571評論 0 0