差異編碼信息的數(shù)據(jù)文件布局同樣由文件頭(delta_file_header)和數(shù)據(jù)塊描述實體(delta_block_entry)集組成,如下所定義。其中,文件頭定義了文件A的數(shù)據(jù)塊總數(shù)、最后一個數(shù)據(jù)的長度和偏移。文件頭后緊隨一組數(shù)據(jù)塊描述實體,每個實體代表一個數(shù)據(jù)塊,定義了數(shù)據(jù)塊長度、偏移以及數(shù)據(jù)塊位置指示。如果embeded為1,則表示數(shù)據(jù)塊位于差異編碼文件中offset處,數(shù)據(jù)緊隨該實體后;如果embeded為0,則表示數(shù)
據(jù)塊位于文件B中offset處。最后數(shù)據(jù)塊存儲于差異編碼文件尾部,長度和偏移由頭部指示。
view plaincopy to clipboardprint? /* define delta file header and block entry */ typedef struct _delta_file_header { uint32_t block_nr; uint32_t last_block_sz; uint64_t last_block_offset; /* offset in delta file */ } delta_file_header; #define DELTA_FILE_HEADER_SZ (sizeof(delta_file_header)) typedef struct _delta_block_entry { uint64_t offset; uint32_t len; uint8_t embeded; /* 1, block in delta file; 0, block in source file. */ } delta_block_entry; #define DELTA_BLOCK_ENTRY_SZ (sizeof(delta_block_entry)) /* define delta file header and block entry */ typedef struct _delta_file_header { uint32_t block_nr; uint32_t last_block_sz; uint64_t last_block_offset; /* offset in delta file */ } delta_file_header; #define DELTA_FILE_HEADER_SZ (sizeof(delta_file_header)) typedef struct _delta_block_entry { uint64_t offset; uint32_t len; uint8_t embeded; /* 1, block in delta file; 0, block in source file. */ } delta_block_entry; #define DELTA_BLOCK_ENTRY_SZ (sizeof(delta_block_entry))
從實時性能方面考慮,數(shù)據(jù)塊信息和差異編碼信息并不一定要寫入文件,可以存在于Cache中,但數(shù)據(jù)布局與上面描述相同。
5、文件切分
Dedupe技術(shù)中,數(shù)據(jù)分塊算法主要有三種,即定長切分(fixed-size partition)、CDC切分(content-defined chunking)和滑動塊(sliding block)切分。定長分塊算法采用預先定義好的塊大小對文件進行切分,并進行弱校驗值和md5強校驗值。弱校驗值主要是為了提升差異編碼的性能,先計算弱校驗值并進行hash查找,如果發(fā)現(xiàn)則計算md5強校驗值并作進一步hash查找。由于弱校驗值計算量要比md5小很多,因此可以有效提高編碼性能。定長分塊算法的優(yōu)點是簡單、性能高,但它對數(shù)據(jù)插入和刪除非常敏感,處理十分低效,不能根據(jù)內(nèi)容變化作調(diào)整和優(yōu)化。
CDC算法是一種變長分塊算法,它應用數(shù)據(jù)指紋(如Rabin指紋)將文件分割成長度大小不等的分塊策略。與定長分塊算法不同,它是基于文件內(nèi)容進行數(shù)據(jù)塊切分的,因此數(shù)據(jù)塊大小是可變化的。算法執(zhí)行過程中,CDC使用一個固定大小(如48字節(jié))的滑動窗口對文件數(shù)據(jù)計算數(shù)據(jù)指紋。如果指紋滿足某個條件,如當它的值模特定的整數(shù)等于預先設定的數(shù)時,則把窗口位置作為塊的邊界。CDC算法可能會出現(xiàn)病態(tài)現(xiàn)象,即指紋條件不能滿足,塊邊界不能確定,導致數(shù)據(jù)塊過大。實現(xiàn)中可以對數(shù)據(jù)塊的大小進行限定,設定上下限,解決這種問題。CDC算法對文件內(nèi)容變化不敏感,插入或刪除數(shù)據(jù)只會影響到檢少的數(shù)據(jù)塊,其余數(shù)據(jù)塊不受影響。CDC算法也是有缺陷的,數(shù)據(jù)塊大小的確定比較困難,粒度太細則開銷太大,粒度過粗則dedup效果不佳。如何兩者之間權(quán)衡折衷,這是一個難點。
出處:CSDN
責任編輯:bluehearts
上一頁 數(shù)據(jù)同步算法研究 [2] 下一頁 數(shù)據(jù)同步算法研究 [4]
◎進入論壇網(wǎng)絡編程版塊參加討論
|