rsync算法簡介

    rsync命令是一個遠程數據同步工具,可經過LAN/WAN快速同步多臺主機間的文件。rsync使用所謂的「rsync算法」來使本地和遠程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不一樣部分。具體使用能夠參考https://man.linuxde.net/rsynchtml

    能夠同步兩個文件不一樣的部分,這個引發個人好奇,那麼是怎麼作的?linux

    其實一種簡單的思路是,那兩個文件放一塊兒,比對一下不就知道了,這裏的問題就是一個文件在遠端,一個在本地,那麼若是按照這種方式,豈不是要傳一個文件過去,直接覆蓋就行了。而sync的思路就是若是文件某個部分變了,那麼就同步這一塊內容,至於這一塊的內容怎麼標識和原來的不同,須要同步,簡單咱們想到的是數據摘要,若是兩個md5不同,不就改變了須要同步了嗎。那麼咱們看一下rsync是怎麼處理的。算法

    首先,咱們會把fileDst的文件平均切分紅若干個小塊,好比咱們按照1024個字節劃分,而後對每塊計算兩個標識,rsync使用兩個方式計算:shell

  • 一個叫rolling checksum,是弱checksum,32位的checksum,其使用的是Mark Adler發明的adler-32算法,
  • 一個是強checksum,128位的,之前用md4,如今用md5 hash算法。

    再者就是同步目標端會把文件的一個計算後的列表傳給同步源文件這,這個列表裏包括了三個東西,rolling checksum,md5 checksume,文件塊編號。數組

    源機器拿到了這個列表後,會對文件作一樣的計算和目標計算值作對比,這樣就知道哪些文件塊改變了,這裏立馬想到的是若是源文件好比中間或者開頭加入了一個字符,那麼每一塊計算的值不就改變了,還不是要所有同步?由於在比對的後面用了「挪步」的方式。工具

    同步源端拿到fileDst的checksum數組後,會把這個數據存到一個hash table中,用rolling checksum作hash,以便得到O(1)時間複雜度的查找性能,簡單點能夠理解成map,只是不知道這個hash table在衝突碰撞的時候是怎麼處理的。性能

    而後在源文件這裏開始計算,若是弱checksum和強checksum一致,那麼這就是同一個文件,若是隻要其中一個不一致,那麼就是不一樣的部分。因而,算法會住後移動 1個字節,再計算文件塊要作checksum,可是前面這一字節的內容須要同步給目標機器上。目標機器上會有一個臨時文件,當匹配結束後會替換掉原來的目標文件。若是文件改動比較大,那麼對文件作這麼多計算仍是直接把文件傳輸過去,哪個效率更高呢?    .net

    還有就是計算checksum,弱的是32byte,強的128byte,因此仍是有可能有重複的狀況吧,只是這個機率很是低2的160次方吧,這樣看,是否是比直接傳輸覆蓋的狀況出錯機率更低呢!htm

  我參考的大神寫的博客寫的不錯,有興趣你們能夠看看!blog

參考:

https://coolshell.cn/articles/7425.html

https://man.linuxde.net/rsync

http://www.javashuo.com/article/p-xsiiepeq-dd.html

相關文章
相關標籤/搜索