rsync文件实时同步_从文件同步rsync算法谈起
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算法。
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3-正则表达式基本使用方法(
- 下一篇: ssl双向认证_SSL握手协议不清楚?v