1、引言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、重複資料刪除技術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校驗值。
view plain
copy to clipboard
print?
/* define chunk file header and block entry */
typedef
struct _chunk_file_header chunk_file_header;
#define chunk_file_header_sz (sizeof(chunk_file_header))
typedef
struct _chunk_block_entry chunk_block_entry;
#define chunk_block_entry_sz (sizeof(chunk_block_entry))
差異編碼資訊的資料檔案布局同樣由檔案頭(delta_file_header)和資料塊描述實體(delta_block_entry)集組成,如下 所定義。其中,檔案頭定義了檔案a的資料塊總數、最後乙個資料的長度和偏移。檔案頭後緊隨一組資料塊描述實體,每個實體代表乙個資料塊,定義了資料塊長 度、偏移以及資料塊位置指示。如果embeded為1,則表示資料塊位於差異編碼檔案中offset處,資料緊隨該實體後;如果embeded為0,則表 示資料塊位於檔案b中offset處。最後資料塊儲存於差異編碼檔案尾部,長度和偏移由頭部指示。
view plain
copy to clipboard
print?
/* define delta file header and block entry */
typedef
struct _delta_file_header delta_file_header;
#define delta_file_header_sz (sizeof(delta_file_header))
typedef
struct _delta_block_entry delta_block_entry;
#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模式
演算法研究 MNIST資料集
mnist mixed national institute of standards and technology database 是乙個計算機視覺資料集,它包含70000張手寫數字的灰度,其中每一張包含 28 x 28 個畫素點。每一張都有對應的標籤,也就是對應的數字,例如上面這張的標籤就是 ...
Camshift演算法研究
根據獲得的色彩直方圖將原始影象轉化成色彩概率分布影象,這個過程就被稱作 back projection 在opencv 中的直方圖函式中,包含back projection 的函式,函式原型是 void cvcalcbackproject iplimage img,cvarr backproject...
Diff演算法研究
在unix linux的世界裡面,如果我們需要比較兩個檔案,就會用乙個比較的命令 diff。而這個diff的原理是什麼呢?在diff裡面,我們比較的兩個檔案叫做old和new,而一般是按行來比較。這裡我們可以抽象成乙個字串的比較,比如 old abcdefger new abdefereger 那麼...