您好,登錄后才能下訂單哦!
本篇內容主要講解“rsync算法的原理是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“rsync算法的原理是什么”吧!
rsync命令是一個遠程數據同步工具,可通過LAN/WAN快速同步多臺主機間的文件。rsync使用所謂的“rsync算法”來使本地和遠程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不同部分。具體使用可以參考https://man.linuxde.net/rsync。
可以同步兩個文件不同的部分,這個引起我的好奇,那么是怎么做的?
其實一種簡單的思路是,那兩個文件放一起,比對一下不就知道了,這里的問題就是一個文件在遠端,一個在本地,那么如果按照這種方式,豈不是要傳一個文件過去,直接覆蓋就好了。而sync的思路就是如果文件某個部分變了,那么就同步這一塊內容,至于這一塊的內容怎么標識和原來的不一樣,需要同步,簡單我們想到的是數據摘要,如果兩個md5不一樣,不就改變了需要同步了嗎。那么我們看一下rsync是怎么處理的。
首先,我們會把fileDst的文件平均切分成若干個小塊,比如我們按照1024個字節劃分,然后對每塊計算兩個標識,rsync使用兩個方式計算:
一個叫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,但是前面這一字節的內容需要同步給目標機器上。目標機器上會有一個臨時文件,當匹配結束后會替換掉原來的目標文件。如果文件改動比較大,那么對文件做這么多計算還是直接把文件傳輸過去,哪一個效率更高呢?
還有就是計算checksum,弱的是32byte,強的128byte,所以還是有可能有重復的情況吧,只是這個概率非常低2的160次方吧,這樣看,是不是比直接傳輸覆蓋的情況出錯概率更低呢!
到此,相信大家對“rsync算法的原理是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。