Dropbox差異同步算法rsync及其改進算法原理

摘自:http://wangyuanzju.blog.163.com/blog/static/130292010101252632998/?latestBlog

沒想到這位兄弟已經對此有研究,我做同步時,已經實現了他指的本地rsync的算法。

Dropbox差異同步算法rsync及其改進算法原理

計算機科學 2010-11-12 17:26:32 閱讀176 評論5  字號: 訂閱

之前用過rsync很多次,只知道可以做差異同步也沒研究過原理。所謂差異同步是指只通過傳輸兩文件的差異部分將兩文件同步到一致,自己取的稱謂,不知道學術術語是什麼。差異同步算法中最有名的就是rsync系列了。

近來研究Dropbox,想看看它的同步怎麼做的,沒找到官方資料,不過據推測應該用的就是rsync,於是,看看鼎鼎大名的rsync是怎麼實現的吧。

rsync算法要解決的問題很簡單:A和B兩個文件在兩臺服務器中,要將A同步到與B一致,要求儘量減少同步帶來的網絡傳輸開銷。

rsync基本算法
先說基本的rsync算法,並不複雜,簡單的說是三步:
1、按固定大小將A分爲多塊,每塊都計算出一個32位的滾動哈希值和一個128位的MD4(有些也用MD5),發給B一端。
2、B一端從位置0開始按的同樣塊大小的滾動哈希值,查找看是否命中A給的某個滾動哈希值,若匹配,則表明B文件中的這塊內容與對應的A中的那塊內容很可能是一致的,但由於32位的哈希值強度不夠,因此再計算MD4,若還是匹配,則確認是一致內容,這時B發給A端匹配的段號。對於那些不能匹配的內容,則發給A端原始內容。
3、A端得到B端給的匹配信息,構造一個與B一致的複本,若是匹配的塊,則拷貝原A文件中對應的塊,若是不匹配內容則追加之。

滾動哈希值的設計基於Adler32算法,使得2~K+1字節的哈希可以根據1~K字節哈希和1、K+1字節的內容快速計算得到,這可以提高從位置0開始依次計算滾動哈希值的效率。

據試驗一般來說塊大小取500~1000字節效果比較好。

rsync初級優化
在上述基本算法之上可以進行一些初級的優化,比如:
1、傳輸數據再做壓縮
2、先用更短小的哈希值作同步,然後比較同步後二者MD5,如果不一樣,再換用更長的哈希值,如此在大多數情況下可以減小哈希值的傳輸開銷。因爲如果用500字節的塊大小的話,一個32位的滾動哈希值和一個128位的MD4會佔用原始數據1/25的開銷,並不太小

基於rsync的改進算法
基於rsync的改進算法主要有多輪rsync本地rsync兩個。

多輪rsync的原理簡單的說就是先用較大的塊大小按rsync的方法處理一輪,但只傳輸那些命中的塊,那些沒命中的數據稱爲“空洞”,按較小的塊大小再按rsync的方法又處理一輪,如此雙可能產生規模更小的“空洞”,如此按來一輪,直到塊大小到配置的最小塊大小爲止。最後一輪跟原始rsync是一樣的,當然只處理上一輪遺留下來的“空洞”。多輪rsync在理論上可以將最差情況下的複雜度(以傳輸的數據量稱是)從原rsync的O(sqrt(n))提高到O(ln n)。試驗中有時多輪rsync可以比原rsync有10倍的提升,但大部分情況下是類似的。

本地rsync則是直接更新A到與B一致,原始rsync算法是需要構造一個與B一致的副本。爲實現這一點,需要先拿到所有匹配信息後進行拓撲排序,再依次應用,是有些複雜的。
發佈了80 篇原創文章 · 獲贊 8 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章