高性能重復數據檢測與刪除技術研究
這里介紹一些零碎的有關數據重刪的東西,以前總結的,放上可以和大家交流交流。
1 數據量的爆炸增長對現有存儲系統的容量、吞吐性能、可擴展性、可靠性、安全性、 可維護性和能耗管理等各個方面都帶來新的挑戰, 消除冗余信息優化存儲空間效率成為 緩解存儲容量瓶頸的重要手段,現有消除信息冗余的主要技術包括數據壓縮[8]和數據去 重。
2 數據壓縮是通過編碼方法用更少的位( bit)表達原始數據的過程,根據編碼 過程是否損失原始信息量,又可將數據壓縮細分為無損壓縮和有損壓縮。無損壓縮通常 利用統計冗余,用較少的位表達具有更高出現頻率的位串,根據編碼算法和字典信息可 從無損壓縮數據中完全恢復出原始數據信息。
3 數據去重
數據去重( Data Deduplication)是在數據集或數據流中發現和消除重復內容以提高 數據的存儲和/或傳輸效率的過程,又稱重復數據刪除( Duplicate Data Elimination),簡 稱去重或重刪。作為優化存儲空間的一項關鍵技術,數據去重有助於減少存儲系統的資 源開銷和總體擁有成本( Total Cost of Ownership, TCO),其優點包括:
增加單位存儲空間所能容納的數據量以提高存儲空間效率。
減少維護單位數據量所需的設備資源和降低相應能耗。
通過避免發送重復內容提高網絡傳輸效率。
4 數據備份。
數據備份通過創建和 轉儲目標數據集在不同時間點的多個副本來提高數據的可靠性。數據備份根據策略不同 一般可分為全量備份( Full Backup)、差異增量備份( Differential Incremental Backup) 和累積增量備份( Cumulative Incremental Backup)。全量備份每次復制並保存目標數據 集的完整副本,因此需要最長的備份時間和最多的存儲空間;差異增量備份僅復制和保 存上一次全量或差異增量備份之后修改過的數據,該策略減少了數據傳輸量,但恢復數 據時需要首先還原到上一次全量備份,然后依次還原所有后續的差異增量數據,具有較 差的恢復時間目標( Recovery Time Objectives, RTO);累積增量備份復制和保存上一次 全量備份之后修改過的所有數據, 因此恢復數據時僅需要還原上一次全量備份和最近的。
5 重復數據的界定方法
新型存儲解決方案引入基於內容的重復數據界定方法,此 類方法可工作在字節、塊或文件等三種不同的粒度級別。
字節級重復數據界定方法主要采用 Delta 編碼算法[24]。該算法將文件看成一系列符 號組成的有序串,通過計算並編碼待處理文件 Fnew 與既有基准文件 Fbase 之間的差量數 據形成 delta(Fnew, Fbase)文件。若 Fnew 與 Fbase 之間具有很高的相似度,則僅存儲 delta(Fnew,Fbase)能夠達到節約存儲空間的效果。
文件級重復數據界定方法通常采用高可靠性哈希算法(如 MD5 和 SHA-1)為給定 文件生成具有極低沖突概率的標識符(也稱指紋),並通過篩查相同標識符來識別重復 文件文件是管理非結構化數據所普遍使用的數據組織單元,常見文件如文檔、圖 片、音頻和視頻等都具有特定的數據結構且容易作為整體在不同的存儲區域(如文件夾)
塊級重復數據界定方法主要用於在相似而不相同的文件之間檢測重復數據, 其通常 采用基於哈希的內容標識技術, 以達到比字節級去重更高的重復數據篩查速度和更廣的 重復內容檢測范圍。確定分塊邊界的主要方法可分為兩類,包括:固定長度分塊和可變 長度分塊。
固定長度分塊方法通常將目標文件划分為具有相同尺寸 Lfixed 的分塊( block), 然后去重過程計算每個分塊的指紋,並從中篩查出重復的數據對象。該方法簡單高效, 但當文件因插入數據而形成新版本時, 原有分塊的邊界可能漂移到無法用既定算法捕獲 的位置,從而導致重復數據無法被檢測。
基於滑動窗口的固定長度分塊方法[30]采用長度為 W=Lfixed 的窗口分析文件數據。該 方法首先計算窗口內數據的哈希值, 然后查詢系統中是否已存在重復哈希記錄。若存在, 則確定當前窗口內的數據為重復分塊,並直接將窗口滑動到未處理的數據區;反之,則 將窗口向前滑動一個字節,重新計算窗口內數據的哈希值並查詢其重復性。若窗口向前 滑動 Lfixed 字節仍未捕捉到重復分塊,則划分之前的數據為一個長度為 Lfixed 的非重復分。此類方法能夠解決因插入數據導致的邊界 漂移問題,但其需要頻繁計算候選分塊指紋和查詢指紋重復性,具有很高的時間開銷, 因此缺乏實用性。
基於內容的分塊( Content Defined Chunking, CDC)算法是最常用的可變長度分塊 方法[31-33],其通常利用長度 w<<Lfixed 的滑動窗口分析文件數據,並采用具有較低計算復 雜度的哈希算法快速計算窗口內數據的指紋,若發現某個指紋匹配預定義的模式,則選 擇該滑動窗口所在位置為一個塊邊界。如圖 1.6 所示,由於滑動窗口中數據的指紋僅依 賴於其內容和既定的哈希函數,文件a中數據塊 e 的邊界能夠在文件b中重新捕獲,進 而后續的重復數據也都能夠被再次發現。此類方法通常選用 Rabin 指紋算法[34]計算窗口 內數據的指紋,其計算效率遠高於用於生成塊指紋的高可靠性哈希算法(如 MD5 和SHA-1),具有很強的實用性且被廣泛應用到各種去重解決方案中。
6 去重效率的評估方法
在基於網絡的分布式存儲環境中,數據去重可以選擇性部署在源端(客戶端)或宿 端(服務端)。源端去重( Source Deduplication) [36,37]首先在客戶端計算待傳輸數據的 指紋並通過與服務端進行指紋比對發現和消除重復內容, 然后僅向服務端發送非重復數 據內容,從而達到同時節約網絡帶寬和存儲資源的目標。宿端去重( DestinationDeduplication) [11]直接將客戶端的數據傳輸到服務端,並在服務端內部檢測和消除重復 內容。兩種部署方式都能夠提高存儲空間效率,其主要區別在於源端去重通過消耗客戶。
數據去重的效率可從時間和空間兩個維度進行評估。從時效性方面,可將數據去重 方 法 划 分 為 在 線 去 重 (Inline Deduplication ) [38] 和 后 處 理 去 重 (Postprocessing Deduplication) [39]。在線去重在數據寫入存儲系統之前完成重復內容的界定、檢測和刪 除過程。為了保障實時性,在線去重通常在內存中維護全部的數據索引(如哈希表), 且需要消耗大量的計算資源。后處理去重將數據寫入存儲系統之后再適時檢測和消除重 復內容,其對計算和內存資源占用率較低,但具有較大的硬盤空間開銷且無法保障去重過程的完成時間。
去重時間效率(去重性能)的量化評價指標為吞吐率( Throughput)。宿端去重的 吞吐率通常以網卡吞吐能力為上限。
7 當前去重方法突破性能瓶頸的主要技術手段包括構造內存快速索引、 挖掘數據局部 性、利用數據相似性和使用新型存儲介質等。
8 Data Domain 去重 文件系統( Data Domain Deduplication File System, DDDFS)的技術架構。 DDDFS 分為 訪問接口、文件服務、內容管理、段管理和容器管理五個層次,其中訪問接口層對外提 供 NFS、 CIFS 和 VTL 等標准協議的訪問服務;文件服務層負責名字空間及文件元數據 管理;內容管理層將文件分割為可變長的數據段(塊),並計算段指紋和創建文件的段 構造表;段管理層維護數據段的索引信息並偵測和消除其中的重復數據;內容管理層將 平均長度為 8KB 的段聚合並封裝在 4MB 大小的容器中, 並采用順序壓縮算法進一步提高數據的存儲空間效率, 此外, 采用容器作為存儲單元還有利於提高數據的讀寫吞吐率。
9 提高去重效率的方法
Mark Lillibridge 等[17]於 2009 年提出 Sparse Indexing 方法同時挖掘數據的局部性和 相似性以進一步減少內存開銷。 Sparse Indexing 采用雙限雙模算法( Two-Thresholds
Two-Divisors, TTTD) [41]將備份數據流切割成平均長度為 4KB 的分塊,並按基於內容 的分塊算法的基本原則將分塊序列划分為 10MB 量級的數據段。在存儲端, Sparse
Indexing 以 1/2n 的采樣率從每段數據中抽取分塊指紋並以此創建內存索引,其中被采樣 的塊指紋稱為鈎子( hook),每個鈎子維護至多 L 個與之關聯的段標識符。每個新數據 段 S 首先會被取樣,然后通過查詢內存索引確定與該數據段共享鈎子數量最多的 M 個 相似數據段。最后, Sparse Indexing 加載 M 個相似數據段的全部指紋信息與新數據段 S 的指紋序列進行比對並消除后者所含重復分塊。由上可知, Sparse Indexing 是一種近似的去重解決方案,它允許少量重復內容存在於相似度較低的數據段之間,從而達到減少內存開銷和提高去重性能的目標。
為了避免查找重復內容時的硬盤訪問瓶頸和進一步提高去重性能, Biplob Debnath 等[21]在 ChunkStash 解決方案中采用固態盤存儲全部指紋索引。 ChunkStash 將數據流划 分成平均長度為 8KB 的分塊序列,每個分塊采用 64 字節記錄指紋和元數據信息,每1024 個塊被封裝為一個保持局部性的容器( Container),其相應的 64KB 指紋信息被保 存在固態盤的一個邏輯頁面中,固態盤具有 100~1000 倍於磁盤的訪問效率,因此能夠 從根本上提升指紋的查找性能。 ChunkStash 在內存中維護三種數據結構,包括元數據緩 存、寫緩存和緊湊型哈希表( Compact Hash Table)。其中元數據緩存維護從固態盤預取 的各容器的指紋序列,用於挖掘數據局部性;寫緩存用於緩沖去重后的數據及其指紋, 以便封裝為容器和提高固態盤索引的寫入效率; 緊湊型哈希表用於存儲固態盤索引的摘 要信息,每個表項包含 2 字節的緊湊指紋摘要和 4 字節的固態盤地址,以便去重過程能 夠直接從固態盤中讀取該表項對應容器的完整指紋信息。對於新收到的數據塊,ChunkStash 首先在元數據緩存和寫緩存中查找可能的重復指紋, 若未找到則進一步查詢 緊湊型哈希表, 並在哈希命中時讀取固態盤上對應容器的指紋頁面確認該數據塊的重復 性。由於緊湊型哈希表僅記錄 2字節的指紋摘要,當查詢某個目標發生哈希沖突時則會 導致對固態盤的錯誤讀取。 根據上述數據可知, 若采用 8KB 的平均分塊長度, 則 256GB固態盤可存儲約 32TB 數據的全部塊指紋,而對應的內存開銷約為 24GB。為了進一步 節約內存開銷, Biplob Debnath 等提出采用類似於 Sparse Indexing 的采樣方法,僅在每 個容器中抽取部分指紋插入緊湊型哈希表,並允許 ChunkStash 成為一種近似去重方法。 其實驗顯示,當采用 1.563%的采樣率時,僅有約 0.5%的重復分塊無法識別。
Wen Xia 等[42]提出 SiLo 去重解決方案,綜合挖掘數據的局部性和相似性以 提高去重性能和減少內存開銷。 SiLo 在變長塊( Chunk)和文件的基礎上引入段 ( Segment)和區( Block)的概念,其中變長塊是長度在 8KB 量級的重復數據刪除單 元;段是長度在 2MB 量級的相似性評估單元,大文件的數據可能分布到多個段中,而 多個小文件的內容也可能被聚合為一個段;區由多個段構成,是長度在 256MB 量級的 局部性保持單元。SiLo 在內存中維護三種數據結構:相似性哈希表 ( Similarity Hash Table,SHT)、讀緩存和寫緩存。其中, SHT 保存來自各個段的樣本指紋,讀緩存維護最近使 用過的含有重復數據的區所對應的塊指紋序列, 寫緩存用於將捕獲的非重復數據塊聚合 為段和區並寫入硬盤。對於新數據段 Si, SiLo 首先提取其樣本指紋並查詢 SHT 判斷系 統中是否存在重復或相似段, 若發現相似段則確保相似段所屬區的全部指紋被加載到讀 緩存,最后在緩存中檢索 Si 所含分塊的指紋並消除重復內容。值得注意的是,若 Si 之 前的鄰近段被檢測出相似性,則即使 Si 未被識別為相似段, SiLo 仍可能通過查詢讀緩 存預取的指紋序列識別出 Si所含的重復內容。與前述的解決方案相比, SiLo 並不單方 面依賴數據的局部性或相似性,因而對不同類型的數據集有更好的適應性。