Deduplication去重算法基礎之可變長度數據分片

  Deduplication(去重,消重)是近年來存儲業界非常熱門的一個技術,無論是Primary Storage,還是備份系統,抑或是雲存儲比如百度迅雷的網盤,都需要考慮dedup來減少冗餘,降低成本。當然了各種系統對dedup的需求是不一樣的。Primary Storage對性能要求高,特別是IOPS指標,這樣很難實現在線的dedup,往往只會採用離線的dedup在閒時進行去重。備份系統則是各有千秋,去重備份系統的領頭羊DataDomain是採用榨乾CPU能力的在線dedup,由於有一些獨特的技術,能做到吞吐量每小時數T。而網盤服務中,多用戶可能存在重複文件,但各用戶的帶寬有限,往往是採用文件級去重,客戶端在上傳文件之前就進行文件hash計算,只傳輸雲端沒有的新文件。


  Dedup從技術上說,分文件級去重和塊級去重。文件級的去重,最原始是對整個文件做一個hash取得key值,實現簡單,效果一般。如上所述,在多用戶環境中重複文件很多的條件下,能取得一定的去重效果。但是在實踐中,往往完全相同的文件還是不多見的。例如網盤中的電影文件,往往同一個電影同一個文件,有些用戶獲取文件時,部分數據不全(往往出現在BT下載中種子沒了的情況下)。這時候文件還是可以流暢觀看的,但是如果用全文件級別的hash,一點差異就會導致完全不同的hash值。而且動輒數G的文件做全文的hash消耗太大。據我所知,有些網盤服務是在大文件的某些特定偏移取出特定大小的數據塊,然後算出多個hash值。如果兩個文件的多個hash值匹配,就判斷兩個文件是相同文件。


  塊級的去重,除了能消除重複的文件,還能在同一個文件有部分變化時,只保留變化部分。而實現塊級的去重,數據如何分塊是關鍵。數據分塊方法分爲固定長度分塊和可變長分塊。固定長度分塊實現起來也相當的簡單,但是如果文件中有小小的新增或者刪除改動,會造成舊的分塊失效,從增刪數據位置開始,所有的分塊hash值都改變。如圖:

wKioL1O2twjiVqJiAAClJozNrPA819.jpg

  所以,變長分塊纔是最終解決之道。變長分塊要達到的目標就是,當數據中有新增或者刪除的數據時,變動的數據隻影響周圍1-2個數據塊,只有這1-2個數據塊的hash值發生改變,而後續更多的數據塊還是按照原來的方式分塊,hash值不變。

  

  這樣一來,可以想到的解決方法是,變長分塊要根據數據內容特徵來分塊。如果能根據數據內容的特徵來分塊的話,如果發生文件內容改變,情況會如下圖:wKiom1O2tzfAOpuNAADEbLxXxfI676.jpg

  這樣,除了1-2個數據塊以外,其他的數據塊hash值沒有發生變化。但是問題來了,如何找到和定義這些分割點(Anchor)呢?


  首先能想到的最粗糙的,就是按數據本身的內容值來找。比如,我們可以搜索數據流中所有連續4個字節爲0的數據,把這4個字節,做爲如上圖中紅色的分割點。這樣是不是就可以了呢?


  理論上,這樣粗糙的分割可以完成變長切分的功能。但是這樣的特徵值分佈效果不好,一個文件中很容易出現完全沒有4個連續0的情況,也可能文件中出現大段的連續0,造成大量無效數據分割點。這種粗糙的分割點造成我們完全無法預測文件中分割點的分佈情況,無法預測最終數據塊的大小。數據塊太大會造成修改後失效率高,數據塊太小會造成讀寫性能低下。


  所以,我們對一個好的變長數據切分算法的要求是,通過數學方法能對最終切分的效果有一定的預期。數據塊的大小最好能在我們需要的大小附近正態分佈,最終平均大小是我們期望的大小。下面就來介紹一個靠譜的分塊算法,源自一片論文A Low-bandwidth Network File System


  這個文章介紹的方法簡單來說,就是如果期望分塊大小在8K上下,那麼就算數據流中每一個48字節的數據塊的hash值(順序計算0-47字節,1-48字節,2-49字節等等等等),然後把hash值對8K取模(xor 0x1fff),最後找出數據流中所有模值的數據塊做爲分割點。

wKioL1O2uEmhxiXMAAB6j08X6ms465.jpg


  論文中做了一些實驗,論證了窗口(分割點數據塊大小)取24字節或者48字節影響不大,48字節結果略好。Hash算法採用rabin hash。最終數據塊大小的分佈,中位值是5.8K,平均值非常接近8K。可以說,這是一個相當令人滿意的算法。論文中的算法爲了避免出現極端情況(過多或者過少分割點造成過大或者過小數據塊),設置了數據塊的上下限,數據塊最小2K,最大64K


  在實際產品中,這些參數都要根據實際的數據流特徵來進行微調。比如某公司產品,數據塊下限4K,上限12K。在計算分割點的hash算法的選擇上,實際產品中爲了減輕計算負擔(因爲CPU還有大量去重運算),很可能選擇雖然分佈效果不好但更輕量級的算法。


  變長分塊的奧祕就介紹到這,以後有時間還會介紹Dedup產品其它的關鍵技術點。

(寫這篇文章主要原因是,現有中文文章對變長數據塊的分割介紹的實在太晦澀難懂了!)


鳴謝參考過的博文:

http://qing.blog.sina.com.cn/tj/88ca09aa33000uyo.html Data Dedup技術簡介 EMC研究院

http://mss.sjtu.edu.cn/bencandy.php?fid=14&id=167  上海交大 海量存儲實驗室 重複數據刪除綜述

http://blog.csdn.net/liuaigui/article/details/5829083 重複數據刪除

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章