本發明涉及數據存儲技術領域,特別是涉及一種重復數據刪除方法及裝置。
背景技術:
隨著信息技術和互聯網技術的發展,各種數據正以倍數級速度逐年增長,高性能但容量相對較小的固態存儲介質在存儲系統中占的比重越來越大。重復數據刪除技術通過對發送到存儲系統的數據流進行分塊、比對計算,將重復的數據刪除掉,實現存儲資源的高效利用。在重復數據刪除的實現中,用戶寫到存儲中的數據流首先根據一定的塊大小進行分割,然后重刪模塊對分割后的數據塊的全部數據進行哈希計算(MD5或SHA1),生成該數據塊的全局唯一的數據指紋。然后系統在全局重刪元數據表(數據塊的指紋信息和數據塊的存儲地址等信息)中對該指紋進行查找,如果查找到該指紋信息,則將該數據塊丟棄并返回給上層模塊查找到的與指紋信息對應的LBA地址,如果查找不到,這為該數據塊分配地址并將重刪數據塊元數據添加到全局表中。
由于對數據塊計算簽名和從全局重刪元數據表中查找數據塊簽名是數據重刪模塊的性能瓶頸點,業界普遍使用帶互斥鎖保護的全局刪除元數據表并行查找策略。在全局元數據表中,HASH桶的桶標的大小決定了互斥鎖的粒度大小。隨著桶標大小的增大,數據重刪的效率越高。隨著并行線程數量的增加,數據重刪的效率同樣越來越高,當并行線程數據增長到一定數量后,數據重刪效率增長幅度逐漸減小并達到一個極限。這種并行策略由于處理一致性鎖的開銷,未能達到期望的性能需求。
技術實現要素:
本發明的目的是提供一種重復數據刪除方法及裝置,以解決現有帶互斥鎖的重復數據刪除方法效率較低、資源消耗較多的問題。
為解決上述技術問題,本發明提供一種重復數據刪除方法,包括:
將數據流劃分為預設塊大小的數據塊;
對每個數據塊進行指紋計算,將計算出的指紋信息添加到數據塊結構的屬性中;
獲取計算出的指紋的固定長度前綴,根據所述固定長度前綴將所述數據塊分發到不同的處理隊列中;
每個處理隊列的工作線程通過并行的方式進行查重操作,刪除所述數據塊中的重復數據。
可選地,所述根據所述固定長度前綴將所述數據塊分發到不同的處理隊列中包括:
根據所述固定長度前綴將全局重刪元數據表劃分為多個重刪子元數據表;
所述每個處理隊列的工作線程通過并行的方式進行查重操作,刪除所述數據塊中的重復數據包括:
每個查重線程對應一個所述重刪子元數據表,分別對相應重刪子元數據表中的元數據進行查重,刪除所述重復數據。
可選地,所述分別對相應重刪子元數據表中的元數據進行查重,刪除所述重復數據包括:
根據數據塊的指紋信息從所述重刪子元數據表中進行查找,如果查找到數據塊指紋,則調用數據塊的回調函數更新所述數據塊的地址;如果未查找到所述數據塊指紋,則為所述數據塊申請存儲地址,并將所述數據塊添加到寫入列表中。
可選地,在所述將所述數據塊添加到寫入列表中之后還包括:
對所述數據塊進行調度與合并,進行數據的寫入。
可選地,所述對每個數據塊進行指紋計算包括:
采用MD5或SAH1的方法對所述數據進行指紋計算。
本發明還提供了一種重復數據刪除裝置,包括:
數據分塊子模塊,用于將數據流劃分為預設塊大小的數據塊;
指紋計算子模塊,用于對每個數據塊進行指紋計算,將計算出的指紋信息添加到數據塊結構的屬性中;
固定長度前綴獲取子模塊,用于獲取計算出的指紋的固定長度前綴,根據所述固定長度前綴將所述數據塊分發到不同的處理隊列中;
查重子模塊,用于每個處理隊列的工作線程通過并行的方式進行查重操作,刪除所述數據塊中的重復數據。
可選地,所述固定長度前綴獲取子模塊具體為根據所述固定長度前綴將全局重刪元數據表劃分為多個重刪子元數據表的模塊;
所述查重子模塊具體為每個查重線程對應一個所述重刪子元數據表,分別對相應重刪子元數據表中的元數據進行查重,刪除所述重復數據的模塊。
可選地,所述查重子模塊具體用于:根據數據塊的指紋信息從所述重刪子元數據表中進行查找,如果查找到數據塊指紋,則調用數據塊的回調函數更新所述數據塊的地址;如果未查找到所述數據塊指紋,則為所述數據塊申請存儲地址,并將所述數據塊添加到寫入列表中。
可選地,還包括:
寫入模塊,用于在將所述數據塊添加到寫入列表中之后,對所述數據塊進行調度與合并,進行數據的寫入。
可選地,所述指紋計算子模塊具體為:采用MD5或SAH1的方法對所述數據進行指紋計算的模塊。
本發明所提供的重復數據刪除方法及裝置,將數據流劃分為預設塊大小的數據塊;對每個數據塊進行指紋計算,將計算出的指紋信息添加到數據塊結構的屬性中;獲取計算出的指紋的固定長度前綴,根據固定長度前綴將數據塊分發到不同的處理隊列中;每個處理隊列的工作線程通過并行的方式進行查重操作,刪除數據塊中的重復數據。本申請基于數據塊指紋的固定長度前綴,將接收的數據塊分發到不同的處理隊列中,使用單獨的線程對每個處理隊列中的數據塊進行處理,只從對應指紋固定長度前綴的重刪元數據塊子表中查重,避免了一致性鎖的開銷;每個處理隊列工作線程通過并行的方式實現查重操作,減少了去重計算中系統資源的消耗,提高了數據重刪效率。
附圖說明
為了更清楚的說明本發明實施例或現有技術的技術方案,下面將對實施例或現有技術描述中所需要使用的附圖作簡單的介紹,顯而易見地,下面描述中的附圖僅僅是本發明的一些實施例,對于本領域普通技術人員來講,在不付出創造性勞動的前提下,還可以根據這些附圖獲得其他的附圖。
圖1為本發明所提供的重復數據刪除方法的一種具體實施方式的流程圖;
圖2為本發明所提供的重復數據刪除方法的另一種具體實施方式的流程圖;
圖3為本發明所提供的重復數據刪除方法的另一種具體實施方式的示意圖;
圖4為本發明實施例提供的重復數據刪除裝置的結構框圖。
具體實施方式
為了使本技術領域的人員更好地理解本發明方案,下面結合附圖和具體實施方式對本發明作進一步的詳細說明。顯然,所描述的實施例僅僅是本發明一部分實施例,而不是全部的實施例。基于本發明中的實施例,本領域普通技術人員在沒有做出創造性勞動前提下所獲得的所有其他實施例,都屬于本發明保護的范圍。
本發明所提供的重復數據刪除方法的一種具體實施方式的流程圖如圖1所示,該方法包括:
步驟S101:將數據流劃分為預設塊大小的數據塊;
步驟S102:對每個數據塊進行指紋計算,將計算出的指紋信息添加到數據塊結構的屬性中;
具體地,可以采用MD5或SAH1的方法對所述數據進行指紋計算,當然并不限于這兩種方式。
步驟S103:獲取計算出的指紋的固定長度前綴,根據所述固定長度前綴將所述數據塊分發到不同的處理隊列中;
步驟S104:每個處理隊列的工作線程通過并行的方式進行查重操作,刪除所述數據塊中的重復數據。
本發明所提供的重復數據刪除方法,將數據流劃分為預設塊大小的數據塊;對每個數據塊進行指紋計算,將計算出的指紋信息添加到數據塊結構的屬性中;獲取計算出的指紋的固定長度前綴,根據固定長度前綴將數據塊分發到不同的處理隊列中;每個處理隊列的工作線程通過并行的方式進行查重操作,刪除數據塊中的重復數據。本申請基于數據塊指紋的固定長度前綴,將接收的數據塊分發到不同的處理隊列中,使用單獨的線程對每個處理隊列中的數據塊進行處理,只從對應指紋固定長度前綴的重刪元數據塊子表中查重,避免了一致性鎖的開銷;每個處理隊列工作線程通過并行的方式實現查重操作,減少了去重計算中系統資源的消耗,提高了數據重刪效率。
在上述實施例的基礎上,本發明所提供的重復數據刪除方法中,步驟S103根據所述固定長度前綴將所述數據塊分發到不同的處理隊列中的過程可以具體為:
根據所述固定長度前綴將全局重刪元數據表劃分為多個重刪子元數據表;
進一步地,步驟S104每個處理隊列的工作線程通過并行的方式進行查重操作,刪除所述數據塊中的重復數據的過程可以具體為:
每個查重線程對應一個所述重刪子元數據表,分別對相應重刪子元數據表中的元數據進行查重,刪除所述重復數據。
如圖2本發明所提供的重復數據刪除方法的另一種具體實施方式的流程圖所示,該方法包括:
步驟S201:將數據流劃分為預設塊大小的數據塊;
用戶寫入數據到達存儲系統的重復數據刪除模塊后,首先數據分塊子模塊根據設定的塊大小將數據流劃分成指定大小的數據塊,并將這些數據塊添加到dup_fb_list等待指紋計算子模塊進行處理。
步驟S202:對每個數據塊進行指紋計算,將計算出的指紋信息添加到數據塊結構的屬性中;
指紋計算子模塊不斷的從fb_list上獲取待處理的數據塊,對每個數據塊緩沖區中的全部數據進行指紋計算,將計算出的指紋信息添加到數據塊結構的屬性中。
步驟S203:根據所述固定長度前綴將全局重刪元數據表劃分為多個重刪子元數據表;
根據該前綴值將該數據塊轉移到不同的查重鏈表dup_que_xxx_li st。如果從fb_list獲取的數據塊序列為(a1,b2,c3,d1,e2,f3,g1,h2,i3,j1,k2,l3,m1,m2,o3),則根據指紋定長前綴將數據塊劃分到三個不同的隊列中:(a1,d1,g1,j1,m1)、(b2,e2,h2,k2,m2)、(c3,f3,i3,l3,o3),并且數據塊在子隊列中的順序不變,保持數據塊的局部特性。
步驟S204:每個查重線程對應一個所述重刪子元數據表,分別對相應重刪子元數據表中的元數據進行查重,刪除所述重復數據。
每個查重線程對應一個查重數據塊鏈表,并只從與指紋固定長度前綴對應的重刪元數據子表進行查詢。該查重線程從dup_que_xxx_list鏈表中獲取待處理數據塊,根據數據塊的指紋信息從對應重刪元數據子表中進行查找,如果查找到數據塊指紋,則調用數據塊的回調函數更新該數據塊的地址;如果未能查找到該數據塊指紋,則將為該數據塊申請存儲地址并將數據塊添加到dup_wr_list,然后將該數據塊的元數據添加到重刪元數據子表中,元數據包括數據塊指紋、LBA地址、新建時間等。
作為一種具體實施方式,本發明在將所述數據塊添加到寫入列表中之后還包括:對所述數據塊進行調度與合并,進行數據的寫入。數據寫入線程不斷從dup_wr_list上獲取要寫入磁盤的的數據塊,并通過一定的算法進行數據塊的調度和合并,并負責將數據塊提交給下層IO模塊。
采用數據塊指紋固定長度前綴將全局重刪元數據表劃分成多個子元數據表,每個子表對應一個線程用于數據塊指紋的查重,充分利用多核心處理器的并行能力,如圖3本發明所提供的重復數據刪除方法的另一種具體實施方式的示意圖。使用指紋固定長度前綴的方式劃分元數據子表的策略,可以確保各子表中的數據塊指紋的全局唯一性和局部特性。
下面對本發明實施例提供的重復數據刪除裝置進行介紹,下文描述的重復數據刪除裝置與上文描述的重復數據刪除方法可相互對應參照。
圖4為本發明實施例提供的重復數據刪除裝置的結構框圖,參照圖4重復數據刪除裝置可以包括:
數據分塊子模塊100,用于將數據流劃分為預設塊大小的數據塊;
指紋計算子模塊200,用于對每個數據塊進行指紋計算,將計算出的指紋信息添加到數據塊結構的屬性中;
固定長度前綴獲取子模塊300,用于獲取計算出的指紋的固定長度前綴,根據所述固定長度前綴將所述數據塊分發到不同的處理隊列中;
查重子模塊400,用于每個處理隊列的工作線程通過并行的方式進行查重操作,刪除所述數據塊中的重復數據。
在上述實施例的基礎上,本發明所提供的重復數據刪除裝置中,上述固定長度前綴獲取子模塊具體為根據所述固定長度前綴將全局重刪元數據表劃分為多個重刪子元數據表的模塊;
所述查重子模塊具體為每個查重線程對應一個所述重刪子元數據表,分別對相應重刪子元數據表中的元數據進行查重,刪除所述重復數據的模塊。
進一步地,所述查重子模塊具體用于:根據數據塊的指紋信息從所述重刪子元數據表中進行查找,如果查找到數據塊指紋,則調用數據塊的回調函數更新所述數據塊的地址;如果未查找到所述數據塊指紋,則為所述數據塊申請存儲地址,并將所述數據塊添加到寫入列表中。
作為一種具體實施方式,本申請實施例所提供的重復數據刪除裝置還可以進一步包括:
寫入模塊,用于在將所述數據塊添加到寫入列表中之后,對所述數據塊進行調度與合并,進行數據的寫入。
在上述任一實施例的基礎上,本申請中指紋計算子模塊可以具體為:采用MD5或SAH1的方法對所述數據進行指紋計算的模塊。
本發明所提供的重復數據刪除裝置,將數據流劃分為預設塊大小的數據塊;對每個數據塊進行指紋計算,將計算出的指紋信息添加到數據塊結構的屬性中;獲取計算出的指紋的固定長度前綴,根據固定長度前綴將數據塊分發到不同的處理隊列中;每個處理隊列的工作線程通過并行的方式進行查重操作,刪除數據塊中的重復數據。本申請基于數據塊指紋的固定長度前綴,將接收的數據塊分發到不同的處理隊列中,使用單獨的線程對每個處理隊列中的數據塊進行處理,只從對應指紋固定長度前綴的重刪元數據塊子表中查重,避免了一致性鎖的開銷;每個處理隊列工作線程通過并行的方式實現查重操作,減少了去重計算中系統資源的消耗,提高了數據重刪效率。
相比于傳統的基于細粒度的一致性鎖的并行查重方案,本申請所提供的無鎖并行重復數據刪除方法,可以將重復數據刪除的IO吞吐量提高2~5倍。
本說明書中各個實施例采用遞進的方式描述,每個實施例重點說明的都是與其它實施例的不同之處,各個實施例之間相同或相似部分互相參見即可。對于實施例公開的裝置而言,由于其與實施例公開的方法相對應,所以描述的比較簡單,相關之處參見方法部分說明即可。
專業人員還可以進一步意識到,結合本文中所公開的實施例描述的各示例的單元及算法步驟,能夠以電子硬件、計算機軟件或者二者的結合來實現,為了清楚地說明硬件和軟件的可互換性,在上述說明中已經按照功能一般性地描述了各示例的組成及步驟。這些功能究竟以硬件還是軟件方式來執行,取決于技術方案的特定應用和設計約束條件。專業技術人員可以對每個特定的應用來使用不同方法來實現所描述的功能,但是這種實現不應認為超出本發明的范圍。
結合本文中所公開的實施例描述的方法或算法的步驟可以直接用硬件、處理器執行的軟件模塊,或者二者的結合來實施。軟件模塊可以置于隨機存儲器(RAM)、內存、只讀存儲器(ROM)、電可編程ROM、電可擦除可編程ROM、寄存器、硬盤、可移動磁盤、CD-ROM、或技術領域內所公知的任意其它形式的存儲介質中。
以上對本發明所提供的重復數據刪除方法以及裝置進行了詳細介紹。本文中應用了具體個例對本發明的原理及實施方式進行了闡述,以上實施例的說明只是用于幫助理解本發明的方法及其核心思想。應當指出,對于本技術領域的普通技術人員來說,在不脫離本發明原理的前提下,還可以對本發明進行若干改進和修飾,這些改進和修飾也落入本發明權利要求的保護范圍內。