資料同步演算法研究

來源:互聯網
上載者:User

1、引言

 基於LAN或WAN的網路應用之間進行資料轉送或者同步非常普遍,比如遠端資料鏡像、備份、複製、同步,資料下載、上傳、共用等等,最為簡單的做法自然就是對資料進行完全複製。然而,資料在網路上來回被複製多次後就會存在大量副本,很多情形下這些檔案副本之間僅有很小的差異,很可能是從同一個檔案版本演化而來。如果對檔案進行完全複製,在檔案較大的情況下,會佔用大量網路頻寬,同步時間也會較長。目前,廣域網路WAN的頻寬與訪問延遲仍然是急需解決的問題,完全複製使得很多網路應用無法提供良好的服務品質,比如Distributed File System(DFS)、雲端儲存(Cloud Storage)。Rsync與RDC(Remote Differential Compression)是兩種最為常見的資料同步演算法,它們僅傳輸差異資料,從而節省網路頻寬並提高效率。本文基於這兩種演算法思想並藉助重複資料刪除(De-duplication)技術,對資料同步演算法進行深入研究與分析,並研發了原型系統。首先介紹rsync與RDC演算法,然後詳細描述演算法設計與相應的資料結構,並重點分析檔案分塊、差異編碼、檔案同步演算法,最後簡介推拉兩種應用模式。

2、相關工作

 Rsync是類Unix環境下的一個高效的遠程檔案複製(同步)工具,它通過著名的Rsync演算法來最佳化流程,減少了資料通訊量並提高檔案傳輸效率。假設現在有兩台電腦Alpha和Beta ,電腦Alpha能夠訪問A檔案,電腦Beta能夠訪問B檔案,檔案A和B非常相似,電腦Alpha和Beta通過低速網路互聯。它的大致流程如下(詳細過程請參考Rsync作者Andrew Tridgell的tech_report.ps):
 1、Beta將檔案B分割成連續不重疊的固定大小資料區塊S,最後一個資料區塊上可能會小於S位元組;
 2、Beta對於每一個資料區塊,計算出兩個校正值,一個32位的弱滾動校正和一個128位的MD4校正;
 3、Beta將校正值發送給Alpha;
 4、Alpha通過搜尋檔案A的所有大小為S的資料區塊(位移量可以任意,不一定非要是S的倍數),來尋找與檔案B的某一塊有著相同的弱校正碼和強校正碼的資料區塊。這主要由滾動校正Rolling checksum快速完成;
 5、Alpha給Beta發送重構A檔案的指令,每一條指令是一個檔案B資料區塊引用(匹配)或者是檔案A資料區塊(未匹配)。
  Rsync是一個非常優秀的工具,但它仍然存在一些不足之處。
 1、Rolling checksum雖然可以節省大量checksum校正計算量,也對checksum搜尋作了最佳化,但多出一倍以上的hash尋找,這個消耗不小;
 2、Rsync演算法中,Alpha和Beta計算量是不對等的,Alpha計算量非常大,而Bete計算量非常小。通常Alpha是伺服器,因此壓力較大;
 3、Rsync中資料區塊大小是固定的,對資料變化的適應能力有限。
 RDC演算法的典型代表是微軟DFS中的DFSR(Distributed File System Replication),它與Rsync不同之處在於採用一致的分塊規則對複製的源檔案和目標檔案進行切分。因此,RDC對於源端和目標端的計算量是對等的。RDC和RSync演算法在設重點上有所不同,Rsync追求更高的重複資料發現而不惜計算量;RDC在兩者之間作了一個折衷,目標是以少量的計算快速探索資料差異,當然重複資料發現不及Rsync。另外,Rsync是定長分塊策略,而RDC是變長分塊策略。

3、重複資料刪除技術

 De-duplication,即重複資料刪除,它是一種非常新的且流行度很高的儲存技術,可以大大減少資料的數量。重複資料刪除技術,通過資料集中重複的資料,從而消除冗餘資料。藉助dedup技術,可以提高儲存系統的效率,有效節約成本、減少傳輸過程中的網路頻寬。同時它也是一種綠色儲存技術,能有效降低能耗。
 Dedupe按照消重的粒度可以分為檔案級和資料區塊級。檔案級的dedup技術也稱為單一執行個體儲存(SIS, Single Instance Store),資料區塊級的重複資料刪除,其消重粒度更小,可以達到4-24KB之間。顯然,資料區塊級的可以提供更高的資料消重率,因此目前主流的 dedup產品都是資料區塊級的。將檔案都分割成資料區塊(定長或變長的資料區塊),採用MD5或SHA1等Hash演算法 (可以同時使用兩種或以上hash演算法或CRC校正等,以獲得非常小機率的資料碰撞發生)為資料區塊計算指紋(FP, Fingerprint)。具有相同FP指紋的資料區塊即可認為是相同的資料區塊,儲存系統中僅需要保留一份。這樣,一個物理檔案在儲存系統就對應一個邏輯表示,由一組FP組成的中繼資料。當進行讀取檔案時,先讀取邏輯檔案,然後根據FP序列,從儲存系統中取出相應資料區塊,還原物理檔案副本。
 Dedupe技術目前主要應用於資料備份,因此對資料進行多次備份後,存在大量重複資料,非常適合這種技術。事實上,dedupe技術可以用於很多場合,包括線上資料、近線資料、離線資料存放區系統,甚至可以在檔案系統、卷管理器、NAS、SAN中實施。也可以用於網路資料轉送,當然也可以應用於資料打包技術。Dedupe技術可以協助眾多應用降低資料存放區量,節省網路頻寬,提高儲存效率、減小備份視窗,綠色節能。

4、資料同步演算法

 如Rsync假設現在有兩台電腦Alpha和Beta ,電腦Alpha能夠訪問A檔案,電腦Beta能夠訪問B檔案,檔案A和B非常相似,電腦Alpha和Beta通過低速網路互聯。基於dedupe技術的資料同步演算法大致流程與Rsync相似,簡單描述如下:
 1、Beta採用資料切分演算法,如FSP(fixed-size partition)、CDC(content-defined chuking),將檔案B分割成大小相等或不等的資料區塊;
 2、Beta對於每一個資料區塊,計算一個類似rsync弱校正值和md5強校正值,並記錄資料區塊長度len和在檔案B中的位移量offset;
 3、Beta將這將資料區塊資訊發送給Alpha;
 4、Alpha採用同樣的資料區塊切分技術將檔案A切成大小相等或不等的資料區塊,並與Beta發過來的資料資訊進行搜尋匹配,產生差異編碼資訊;
 5、Alpha將差異編碼資訊發送給Beta,並同時發送重構檔案A的指令;
 6、Beta根據差異編碼資訊和檔案B重構檔案A。
 上面演算法描述中,有幾個關鍵問題需要解決,即檔案切分、切分資料區塊資訊描述、差異編碼、差異編碼資訊描述、檔案同步。檔案切分、差異編碼、檔案同步將在後續部分介紹,這裡對切分資料區塊資訊描述和差異編碼資訊描述作說明。
 切分資料區塊資訊的資料檔案布局由檔案頭(chunk_file_header)和資料區塊描述(chunk_block_entry)實體集組成,具體定義如下。其中,檔案頭定義了檔案B的資料區塊大小、資料區塊總數。檔案頭後緊隨一組資料區塊描述實體,每個實體代表一個資料區塊,定義了塊長度、塊在檔案B中的位移、弱校正值和強md5校正值。 
/* define chunk file header and block entry */<br />typedef struct _chunk_file_header {<br /> uint32_t block_sz;<br /> uint32_t block_nr;<br />} chunk_file_header;<br />#define CHUNK_FILE_HEADER_SZ (sizeof(chunk_file_header))<br />typedef struct _chunk_block_entry {<br /> uint64_t offset;<br /> uint32_t len;<br /> uint8_t md5[16 + 1];<br /> uint8_t csum[10 + 1];<br />} chunk_block_entry;<br />#define CHUNK_BLOCK_ENTRY_SZ (sizeof(chunk_block_entry))
 差異編碼資訊的資料檔案布局同樣由檔案頭(delta_file_header)和資料區塊描述實體(delta_block_entry)集組成,如下所定義。其中,檔案頭定義了檔案A的資料區塊總數、最後一個資料的長度和位移。檔案頭後緊隨一組資料區塊描述實體,每個實體代表一個資料區塊,定義了資料區塊長度、位移以及資料區塊位置指示。如果embeded為1,則表示資料區塊位於差異編碼檔案中offset處,資料緊隨該實體後;如果embeded為0,則表示資料區塊位於檔案B中offset處。最後資料區塊儲存於差異編碼檔案尾部,長度和位移由頭部指示。
/* define delta file header and block entry */<br />typedef struct _delta_file_header {<br /> uint32_t block_nr;<br /> uint32_t last_block_sz;<br /> uint64_t last_block_offset; /* offset in delta file */<br />} delta_file_header;<br />#define DELTA_FILE_HEADER_SZ (sizeof(delta_file_header))<br />typedef struct _delta_block_entry {<br /> uint64_t offset;<br /> uint32_t len;<br /> uint8_t embeded; /* 1, block in delta file; 0, block in source file. */<br />} delta_block_entry;<br />#define DELTA_BLOCK_ENTRY_SZ (sizeof(delta_block_entry))
 從即時效能方面考慮,資料區塊資訊和差異編碼資訊並不一定要寫入檔案,可以存在於Cache中,但資料布局與上面描述相同。

5、檔案切分

 Dedupe技術中,資料分塊演算法主要有三種,即定長切分(fixed-size partition)、CDC切分(content-defined chunking)和滑動塊(sliding
block)切分。定長分塊演算法採用預先定義好的塊大小對檔案進行切分,並進行弱校正值和md5強校正值。弱校正值主要是為了提升差異編碼的效能,先計算弱校正值並進行hash尋找,如果發現則計算md5強校正值並作進一步hash尋找。由於弱校正值計算量要比md5小很多,因此可以有效提高編碼效能。定長分塊演算法的優點是簡單、效能高,但它對資料插入和刪除非常敏感,處理十分低效,不能根據內容變化作調整和最佳化。
 CDC演算法是一種變長分塊演算法,它應用資料指紋(如Rabin指紋)將檔案分割成長度大小不等的分塊策略。與定長分塊演算法不同,它是基於檔案內容進行資料區塊切分的,因此資料區塊大小是可變化的。演算法執行過程中,CDC使用一個固定大小(如48位元組)的滑動視窗對檔案資料計算資料指紋。如果指紋滿足某個條件,如當它的值模特定的整數等於預先設定的數時,則把視窗位置作為塊的邊界。CDC演算法可能會出現病態現象,即指紋條件不能滿足,塊邊界不能確定,導致資料區塊過大。實現中可以對資料區塊的大小進行限定,設定上下限,解決這種問題。CDC演算法對檔案內容變化不敏感,插入或刪除資料只會影響到檢少的資料區塊,其餘資料區塊不受影響。CDC演算法也是有缺陷的,資料區塊大小的確定比較困難,粒度太細則開銷太大,粒度過粗則dedup效果不佳。如何兩者之間權衡折衷,這是一個痛點。
 滑動塊演算法結合了定長切分和CDC切分的優點,塊大小固定。它對定長資料區塊先計算弱校正值,如果匹配則再計算md5強校正值,兩者都匹配則認為是一個資料區塊邊界。該資料區塊前面的資料片段也是一個資料區塊,它是不定長的。如果滑動視窗移過一個塊大小的距離仍無法匹配,則也認定為一個資料區塊邊界。滑動塊演算法對插入和刪除問題處理非常高效,並且能夠檢測到比CDC更多的冗餘資料,它的不足是容易產生資料片段。

6、差異編碼

 差異編碼的基礎是檔案B資料分塊資訊和檔案A,它首先對檔案A進行對等資料分塊(滑動塊演算法除外,它對檔案B的切分是定長演算法,而對檔案A是滑動塊演算法),然後匹配檔案B資料分塊資訊。如果資料區塊匹配,則用資料區塊索引表示,達到重複資料刪除效果。否則,則將對應的檔案A資料區塊寫入差異編碼檔案中。資料區塊匹配演算法方面,定長切分和CDC切分是基本相同,檔案A採用和檔案B對等的切分演算法進行資料區塊切分。滑動塊演算法與其他兩種演算法不同,它與rsync類似,它對檔案B的切分是定長演算法,而對檔案A的切分是滑動塊演算法。因此,這種演算法切分是不對等的。然後根據檔案B構造hashtable,通過hash尋找進行匹配,並按照差異編碼資料布局構造相應資料檔案。

7、檔案同步

 Beta得到差異編碼檔案delta,再結合已有的檔案B,即可以將檔案B同步成檔案A的副本。同步演算法遍曆delta檔案,讀取每一個資料區塊描述實體,根據embeded標誌分別從delta和檔案B中讀取相應的資料區塊,重新構造出檔案A。

8、PULL與PUSH模式

 資料同步有PULL和PUSH兩種應用模式,PULL是將遠端資料同步到本地,而PUSH是將本機資料同步到遠程。對應到同步演算法,主要區別在於資料分塊和差異編碼位置不同。PULL和PUSH同步模式步驟分別如下所述。
 PULL同步模式流程:
 1、本地對檔案A進行資料切分,產生資料區塊描述檔案chunk;
 2、上傳chunk檔案至遠程伺服器;
 3、遠程伺服器對檔案B進行差異編碼,產生差異編碼檔案delta;
 4、下載delta檔案至本地;
 5、本地同步檔案A至檔案B,相當於下載檔案B到本地檔案A。

 PUSH同步模式流程:
 1、遠程伺服器對檔案B進行資料切分,產生資料區塊描述檔案chunk;
 2、下載chunk檔案至本地;
 3、本地對檔案A進行差異編碼,產生差異編碼檔案delta;
 4、上傳delta檔案至遠程伺服器;
 5、遠程同步檔案B到A,相當於上傳檔案A到遠程檔案B。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.