日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

rsync文件实时同步_从文件同步rsync算法谈起

發(fā)布時(shí)間:2025/5/22 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 rsync文件实时同步_从文件同步rsync算法谈起 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
之前在某個(gè)產(chǎn)品中使用了Gossip算法進(jìn)行數(shù)據(jù)庫數(shù)據(jù)的同步,但是在新的產(chǎn)品中有個(gè)需求,就是當(dāng)文件變化時(shí),(由于文件比較大,比較多)支持增量推送到文件服務(wù)器上。于是想到了Unix下的rsync算法,本文也是拜讀了很多大佬的作品,從自己理解的角度整理出來。關(guān)于rsync算法的原文請(qǐng)閱讀

https://rsync.samba.org/tech_report/tech_report.html

1、同步技術(shù)

一般除了rsync增量同步外,還有一種scp的同步方式,用于將文件上傳和下載,類似于ftp協(xié)議。scp?username@servicename:/path/filename?/var/localdir舉例:比如使用這個(gè)命令scp root@192.168.0.1:/path/ClassPath.xml /var/localdir。意思就是將192.168.0.1服務(wù)器上面的Classpath.xml文件下載到本地的var/localdir文件夾中。scp?/var/filename?username@servicename:/path舉例:比如使用scp /a.xml root@192.168.0.1:/path ,意思就是將本地的a.xml文件上傳到192.168.0.1 服務(wù)器的path路徑下,用戶名root。

? ? ? 當(dāng)然了,還可以在scp命令的后面加上-r 參數(shù),用于下載和上傳整個(gè)文件夾。類似與rmdir 命令遞歸刪除文件夾了。在使用scp的前提是對(duì)端服務(wù)器開啟文件的寫入權(quán)限。

? ? 關(guān)于ftp這種應(yīng)用層的上傳下載協(xié)議,我也在項(xiàng)目中用過,這里不再敘述,推薦一個(gè)開源組件libcurl,可以支持多種協(xié)議,使用也比較簡(jiǎn)單。

2、rsync算法原理

? ? ? 一般情況下,如果我們要同步的文件只想傳不同的部分,我們就需要對(duì)兩邊的文件做差異對(duì)比,但是這兩個(gè)問題在兩臺(tái)不同的機(jī)器上無法做對(duì)比。如果我們做對(duì)比,就要把一個(gè)文件傳到另一臺(tái)機(jī)器上做對(duì)比,但這樣一來,我們就傳了整個(gè)文件,這與我們只想傳輸不同部的初衷相背。

? ? rsync的算法是讓這兩邊的文件不見面,但還能知道它們間有什么不同。

? ? rsync的算法如下:(假設(shè)我們同步源文件名為fileSrc,同步目的文件叫fileDst)

1)分塊Checksum算法。首先,我們會(huì)把fileDst的文件平均切分成若干個(gè)小塊,比如每塊512個(gè)字節(jié)(一般在2的整數(shù)次方,比如512,1024,最后一塊會(huì)小于這個(gè)數(shù)),然后對(duì)每塊計(jì)算兩個(gè)checksum,

  • 一個(gè)叫rolling checksum,是弱checksum,32位的checksum,其使用的是Mark Adler發(fā)明的adler-32算法,

  • 另一個(gè)是強(qiáng)checksum,128位的,以前用md4,現(xiàn)在用md5 hash算法。

這里使用兩個(gè)checksum算法,是因?yàn)槲覀冃枰粋€(gè)快算法來鑒別文件塊的不同,但是弱的adler32算法碰撞概率太高了,所以我們還要引入強(qiáng)的checksum算法以保證兩文件塊是相同的。也就是說,弱的checksum是用來區(qū)別不同,而強(qiáng)的是用來確認(rèn)相同。

2)傳輸算法同步目標(biāo)端會(huì)把fileDst的一個(gè)checksum列表傳給同步源,這個(gè)列表里包括了三個(gè)東西,rolling checksum(4字節(jié),32bits),

md5 checksume(16字節(jié),128bits),文件塊編號(hào)。

3)checksum查找算法。同步源端拿到fileDst的checksum數(shù)組后,會(huì)把這個(gè)數(shù)據(jù)存到一個(gè)hash table中,用rolling checksum做hash,以便獲得O(1)時(shí)間復(fù)雜度的查找性能。這個(gè)hash table是16bits的,所以,hash table的尺寸是2的16次方,對(duì)rolling checksum的hash會(huì)被散列到0 到 2^16 – 1中的某個(gè)整數(shù)值。

? ?算法的流程如下所示:

? ?首先從目的文件獲取了文件塊的checksum,然后開始計(jì)算源端的文件。

1)取fileSrc的第一個(gè)文件塊(我們假設(shè)的是512個(gè)長(zhǎng)度),也就是從fileSrc的第1個(gè)字節(jié)到第512個(gè)字節(jié),取出來后做rolling checksum計(jì)算。計(jì)算好的值到hash表中查。

2)如果查到了,說明發(fā)現(xiàn)在fileDst中有潛在相同的文件塊,于是就再比較md5的checksum,因?yàn)閞olling checksume太弱了,可能發(fā)生碰撞。于是還要算md5的128bits的checksum,這樣一來,我們就有 2^-(32+128) = 2^-160的概率發(fā)生碰撞,這太小了可以忽略。如果rolling checksum和md5 checksum都相同,這說明在fileDst中有相同的塊,我們需要記下這一塊在fileDst下的文件編號(hào)

3)如果fileSrc的rolling checksum 沒有在hash table中找到,那就不用算md5 checksum了。表示這一塊中有不同的信息。總之,只要rolling checksum 或 md5 checksum 其中有一個(gè)在fileDst的checksum hash表中找不到匹配項(xiàng),那么就會(huì)觸發(fā)算法對(duì)fileSrc的rolling動(dòng)作。于是,算法會(huì)住后移動(dòng)1個(gè)字節(jié),取fileSrc中字節(jié)2-513的文件塊要做checksum,然后執(zhí)行step1。

4)這樣,我們就可以找出fileSrc相鄰兩次匹配中的那些文本字符,這些就是我們要往同步目標(biāo)端傳的文件內(nèi)容了。

? ? ?經(jīng)過算法的計(jì)算和對(duì)比,將不同的文件和文件塊組成一個(gè)新的列表發(fā)送到fileDst端,fileDst端收到新的文件列表,則進(jìn)行組裝成新的文件。最終兩個(gè)文件同步成功。

3?總結(jié)

? ? ? rolling checksum算法給我們提供了一種增量同步的思路。通過循環(huán)校驗(yàn)查找,找到相同的塊。最終將不同的數(shù)據(jù)同步過去即可,極大的減少了網(wǎng)絡(luò)傳輸?shù)膸挕?/p>

總結(jié)

以上是生活随笔為你收集整理的rsync文件实时同步_从文件同步rsync算法谈起的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。