本申請涉及存儲領(lǐng)域,尤其涉及一種數(shù)據(jù)重刪技術(shù)。
背景技術(shù):
重刪(全稱為重復數(shù)據(jù)刪除)技術(shù),是一種自動搜索重復數(shù)據(jù),并將相同數(shù)據(jù)保留唯一副本的存儲技術(shù)。通過重刪處理,可消除存儲系統(tǒng)的冗余數(shù)據(jù),降低對存儲容量的需求。
實現(xiàn)重刪技術(shù)的方法有很多種,但目前比較流行在線重刪技術(shù)是基于hash(譯為散列或哈希)算法實現(xiàn)重刪,該種重刪方法主要包括:將寫入的數(shù)據(jù)劃分成定長或者不定長的數(shù)據(jù)塊,計算每個數(shù)據(jù)塊的散列值(也可稱為指紋),通過散列值匹配,保留新增數(shù)據(jù),刪除重復數(shù)據(jù)。
在重刪技術(shù)中,需要重刪元數(shù)據(jù),重刪元數(shù)據(jù)包括邏輯地址映射表和指紋映射表,根據(jù)邏輯地址映射表和指紋映射表對寫入數(shù)據(jù)進行重刪處理,建立重刪副本。
邏輯地址映射表包括多條邏輯地址映射記錄,每條記錄包括lun的邏輯地址與重刪副本的物理地址之間的映射關(guān)系,lun(logicalunitnumber,邏輯單元號)是存儲系統(tǒng)中,為用戶提供的數(shù)據(jù)訪問的存儲單元,lun包括多個邏輯地址塊,每個邏輯地址塊具有編號,該編號可稱為邏輯地址,其中,邏輯地址可稱為lba(logicalblockaddress,邏輯區(qū)塊地址)。存儲系統(tǒng)中還包括用于保存重刪副本的存儲介質(zhì),例如,磁盤、ssd和nvram等,存儲介質(zhì)可被劃分成多個物理區(qū)塊,每個區(qū)塊均具有物理地址,也可稱為pba(physicsblockaddress,物理區(qū)塊地址)。
指紋映射表包括多條指紋映射記錄,每條指紋映射記錄包括數(shù)據(jù)的指紋與數(shù)據(jù)的重刪副本的物理地址pba之間的映射關(guān)系,指紋指可采用hash算法得到,也可以稱為hash到pba的映射關(guān)系。指紋映射表的作用是,當有待寫入數(shù)據(jù)進行重刪處理時,通過到指紋映射表中查詢是否存在有相同指紋,來初步判斷是否存在與待寫入數(shù)據(jù)相同的重刪副本,避免重復寫入數(shù)據(jù)。
目前的重刪技術(shù)中,重刪元數(shù)據(jù)中指紋映射表通常緩存在存儲系統(tǒng)的內(nèi)存中,有多少指紋映射記錄,就為其分配多少內(nèi)存,指紋映射記錄的增加也對應(yīng)造成內(nèi)存消耗增加,而每次對io數(shù)據(jù)進行重刪處理時,都需要查詢指紋映射表來判斷是否存在重刪副本,內(nèi)存消耗的增加會影響查詢速度,因此會影響io的處理速度和整個重刪處理的性能。并且,指紋映射記錄的數(shù)據(jù)量與重刪副本的容量成正比,當重刪副本的容量較小時,指紋映射記錄可以全部緩存在內(nèi)存,但隨著重刪副本的容量的增加,指紋映射記錄需要占用更大的內(nèi)存,當存儲系統(tǒng)無法提供更大的內(nèi)存時,為了保證重刪的性能,一般采用限制重刪副本的容量方式,這樣重刪副本的容量受到限制,目前的重刪技術(shù),一般用于存儲容量較小的存儲系統(tǒng)中。
技術(shù)實現(xiàn)要素:
有鑒于此,本申請?zhí)峁┮环N數(shù)據(jù)重刪的方法及存儲設(shè)備,用以降低重刪元數(shù)據(jù)的內(nèi)存消耗,提高重刪處理速度。
具體地,本申請是通過如下技術(shù)方案實現(xiàn)的:
根據(jù)本申請的第一方面,提供一種數(shù)據(jù)重刪的方法,所述方法應(yīng)用于存儲設(shè)備,該方法包括:
根據(jù)存儲設(shè)備的條件建立多個指紋映射分區(qū);
為所述每個指紋映射分區(qū)建立分區(qū)索引;
基于所述分區(qū)索引在每個所述指紋映射分區(qū)建立多個指紋映射表,每個所述指紋映射表包括若干條指紋映射記錄,多個所述指紋映射表按照所述指紋映射記錄建立的時間段先后順序排列;
將每個所述指紋映射分區(qū)中的多個所述指紋映射表中時間段位于前面的若干個所述指紋映射表緩存在存儲設(shè)備的內(nèi)存中,其他的所述指紋映射表持久的保存在存儲設(shè)備中。
可選的,在所述為所述每個指紋映射分區(qū)建立分區(qū)索引之后,還包括:
基于所述分區(qū)索引在每個所述指紋映射分區(qū)建立當前映射日志,所述當前映射日志包括位于前面的時間段的若干條指紋映射記錄;
將所述當前映射日志持久保存在存儲設(shè)備中,且緩存在所述存儲設(shè)備的內(nèi)存中。
可選的,所述當前映射日志中的若干條指紋映射記錄按照所述指紋映射分區(qū)接收到待寫入數(shù)據(jù)的指紋的時間先后順序排列。
可選的,每個所述指紋映射表還包括:所述指紋映射表所在時間段的截止時間點、所述指紋映射記錄中的起始指紋、所述指紋映射記錄中的結(jié)束指紋和/或所述指紋映射記錄的數(shù)量。
可選的,若干條所述指紋映射記錄按照所述指紋映射記錄中的指紋的數(shù)值的大小順序排列。
可選的,在所述根據(jù)存儲設(shè)備的條件建立多個指紋映射分區(qū)之后,還包括:
根據(jù)所述指紋映射分區(qū)的數(shù)量,提取寫入數(shù)據(jù)的指紋長度中的若干位;
所述為所述每個指紋映射分區(qū)建立分區(qū)索引,具體包括:
根據(jù)所述若干位為指紋映射分區(qū)建立分區(qū)索引,其中,每個分區(qū)索引的索引值為所述若干位,不同分區(qū)索引的索引值不相同。
可選的,所述指紋映射記錄包括寫入數(shù)據(jù)的指紋的部分長度與重刪副本的物理地址之間的映射關(guān)系,所述部分長度為所述寫入數(shù)據(jù)的指紋長度除了提取的若干位以外的指紋長度;
每個所述指紋映射分區(qū)中寫入數(shù)據(jù)的指紋長度被提取相同的若干位。
可選的,所述基于所述分區(qū)索引在每個所述指紋映射分區(qū)建立多個指紋映射表之后,還包括:
當所述指紋映射分區(qū)中位于最前面的時間段之后的時間新增加的指紋映射記錄的數(shù)量達到預設(shè)數(shù)量時,生成最新時間段的指紋映射表,并將緩存在存儲設(shè)備內(nèi)存中的多個所述指紋映射表中位于最后面的時間段的所述指紋映射表從緩存中釋放,且將其持久的保存在存儲設(shè)備中;
將所述新增加的指紋映射記錄添加到所述指紋映射分區(qū)的當前映射日志中,并將緩存在存儲設(shè)備內(nèi)存中的當前映射日志中的位于最后面的時間段的指紋映射記錄從緩存中釋放且將其從存儲設(shè)備中刪除。
可選的,所述將基于所述分區(qū)索引在每個所述指紋映射分區(qū)建立多個指紋映射表之后,還包括:
當所述指紋映射分區(qū)中的指紋映射表的數(shù)量超過預設(shè)數(shù)量時,將相鄰時間段的指紋映射表合并成一個指紋映射表。
可選的,所述基于所述分區(qū)索引在每個所述指紋映射分區(qū)建立多個指紋映射表之后,還包括:
獲取存儲設(shè)備中沒有引用的重刪副本對應(yīng)的指紋映射記錄;
刪除所述沒有引用的重刪副本對應(yīng)的指紋映射記錄;
當沒有引用的重刪副本的指紋映射記錄所在的指紋映射表中剩余的指紋映射記錄的數(shù)量小于預設(shè)數(shù)量時,將刪除的指紋映射記錄所在的指紋映射表中剩余的指紋映射記錄合并至與其相鄰的時間段的指紋映射表中,并刪除所述沒有引用的重刪副本對應(yīng)的指紋映射記錄所在的指紋映射表。
可選的,在所述將所述當前映射日志持久保存在存儲設(shè)備中,且緩存在所述存儲設(shè)備的內(nèi)存中之后,還包括:
當存儲設(shè)備重啟時,根據(jù)所述當前映射日志構(gòu)建所述當前映射日志所在時間段的指紋映射表。
根據(jù)本申請的第二方面,提供一種數(shù)據(jù)重刪的方法,所述方法應(yīng)用于存儲設(shè)備,該方法包括:
根據(jù)io請求獲取目標指紋;
查找所述目標指紋所在的指紋映射分區(qū);
從所述所在的指紋映射分區(qū)中的按照時間段先后順序排列的指紋映射表中依次查找是否存在所述目標指紋,并返回查找消息。
可選的,所述從所述所在的指紋映射分區(qū)中的按照時間段先后順序排列的指紋映射表中依次查找是否存在所述目標指紋,并返回查找消息,具體包括:
步驟s1、從所述所在的指紋映射分區(qū)中的,位于最前面的時間段指紋映射表中查找所述目標指紋;
步驟s2、判斷是否存在所述目標指紋,若是則返回查找成功的查找消息,若否則執(zhí)行下述步驟s3;
步驟s3、按照時間段的先后順序依次獲取下一個指紋映射表,并判斷是否能獲取到下一個指紋映射表,若是,則執(zhí)行下述步驟s4,若否,則返回查找失敗的查找消息;
步驟s4、判斷所述下一個指紋映射表是否緩存在存儲設(shè)備的內(nèi)存中,若是,則執(zhí)行下述步驟s5,若否,則執(zhí)行下述步驟s6;
步驟s5、在所述下一個指紋映射表中查找所述目標指紋,接著執(zhí)行上述所述步驟s2;
步驟s6、將所述下一個指紋映射表加載到存儲設(shè)備的內(nèi)存中,然后接著執(zhí)行上述所述步驟s5,再接著執(zhí)行上述所述步驟s2。
根據(jù)本申請的第三方面,提供一種數(shù)據(jù)重刪的方法,所述方法應(yīng)用于存儲設(shè)備,該方法包括:
獲取io請求中的待寫入數(shù)據(jù),且計算所述待寫入數(shù)據(jù)的指紋;
在按照時間段先后順序排列的指紋映射表中依次查找是否存在所述待寫入數(shù)據(jù)的指紋;
當不存在時,根據(jù)所述待寫入數(shù)據(jù)的指紋找到對應(yīng)的指紋映射分區(qū);
建立所述待寫入數(shù)據(jù)的指紋與新分配的重刪副本的物理地址之間的映射關(guān)系,并將所述映射關(guān)系添加到所述對應(yīng)的指紋映射分區(qū)的當前映射日志中;
將所述映射關(guān)系添加到對應(yīng)的指紋映射分區(qū)中位于最前面的時間段的指紋映射表中。
可選的,所述當不存在時,根據(jù)所述待寫入數(shù)據(jù)的指紋找到對應(yīng)的指紋映射分區(qū),具體包括:
當不存在時,提取待寫入數(shù)據(jù)的指紋長度中的若干位;
查找與所述若干位相同的分區(qū)索引值,根據(jù)所述分區(qū)索引值查找對應(yīng)的指紋映射分區(qū)。
根據(jù)本申請的第四方面,提供一種存儲設(shè)備,所述存儲設(shè)備包括存儲器和處理器,其特征在于,所述存儲器中存儲有多條指令,所述指令適于由處理器加載并執(zhí)行上述所述的方法。
根據(jù)上述技術(shù)方案,本發(fā)明提供的數(shù)據(jù)重刪的方法,對于重刪元數(shù)據(jù)中的指紋映射記錄進行了分區(qū)保存,通過建立多個指紋映射分區(qū),可將體量龐大的指紋映射記錄劃分成體量適中的多個片段,每個片段保存在對應(yīng)的指紋映射分區(qū)中,這樣對于每個分區(qū)中的指紋映射記錄可獨立組織,提高對指紋映射記錄的查詢效率。并且根據(jù)時間的先后順序,將每個指紋映射分區(qū)中的指紋映射記錄分段組織,建立多個指紋映射表,時間最靠前的指紋映射記錄保存在內(nèi)存中,而之前的一些指紋映射記錄持久的保存,這樣可以降低內(nèi)存的消耗,進而提高數(shù)據(jù)的重刪處理的速度,并且,根據(jù)讀寫io的時間局部性特點,用戶在最新時間寫入或者讀取的數(shù)據(jù),在將來一段時間內(nèi)可能會再次讀取對應(yīng)的數(shù)據(jù)或者寫入相同的數(shù)據(jù),因此,按照時間的先后順序組織指紋映射記錄,還可以提高對指紋映射記錄內(nèi)存中查詢的命中率,且指紋映射記錄不需要占用大量的內(nèi)存容量,不受存儲設(shè)備的容量限制,可應(yīng)用在大容量的存儲設(shè)備中。
附圖說明
圖1是本申請?zhí)峁┑囊环N實施方式中的數(shù)據(jù)重刪的方法的流程圖;
圖2是本申請?zhí)峁┑囊环N實施方式中的指紋映射分區(qū)的結(jié)構(gòu)示意圖;
圖3是本申請?zhí)峁┑牧硪环N實施方式中的指紋映射分區(qū)的結(jié)構(gòu)示意圖;
圖4是本申請?zhí)峁┑挠忠环N實施方式中的數(shù)據(jù)重刪的方法的流程圖;
圖5是本申請?zhí)峁┑囊环N實施方式中的當前映射日志的數(shù)據(jù)結(jié)構(gòu)示意圖;
圖6是本申請?zhí)峁┑囊环N實施方式中的指紋映射表的數(shù)據(jù)結(jié)構(gòu)示意圖;
圖7是本申請?zhí)峁┑牧硪环N實施方式中的數(shù)據(jù)重刪的方法的流程圖;
圖8是本申請?zhí)峁┑挠忠环N實施方式的數(shù)據(jù)重刪的方法的流程圖;
圖9是本申請?zhí)峁┑挠忠环N實施方式的數(shù)據(jù)重刪的方法的流程圖;
圖10是本申請?zhí)峁┑挠忠环N實施方式的數(shù)據(jù)重刪的方法的流程圖;
圖11是本申請?zhí)峁┑挠忠环N實施方式的數(shù)據(jù)重刪的方法的流程圖;
圖12是本申請一種實施方式提供的存儲設(shè)備的框圖。
具體實施方式
這里將詳細地對示例性實施例進行說明,其示例表示在附圖中。下面的描述涉及附圖時,除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實施例中所描述的實施方式并不代表與本申請相一致的所有實施方式。相反,它們僅是與如所附權(quán)利要求書中所詳述的、本申請的一些方面相一致的裝置和方法的例子。
在本申請使用的術(shù)語是僅僅出于描述特定實施例的目的,而非旨在限制本申請。在本申請和所附權(quán)利要求書中所使用的單數(shù)形式的“一種”、“所述”和“該”也旨在包括多數(shù)形式,除非上下文清楚地表示其他含義。還應(yīng)當理解,本文中使用的術(shù)語“和/或”是指并包含一個或多個相關(guān)聯(lián)的列出項目的任何或所有可能組合。在此所使用的詞語“如果”可以被解釋成為“在……時”或“當……時”或“響應(yīng)于確定”。
目前的重刪技術(shù)中,當存儲設(shè)備的lun接收寫io請求中的待寫入數(shù)據(jù)時,計算待寫入數(shù)據(jù)的指紋,然后通過到指紋映射表中查詢是否存在有相同指紋,來初步判斷是否存在與待寫入數(shù)據(jù)相同的重刪副本,避免重復寫入數(shù)據(jù)。
本發(fā)明中指紋,指在重刪技術(shù)中,通過重刪算法(例如,hash算法或其他算法),對數(shù)據(jù)進行計算生成的結(jié)果,是用來標識數(shù)據(jù)的唯一標識。
指紋具有散列特性,沒有規(guī)則可尋,數(shù)據(jù)的指紋與數(shù)據(jù)寫入的位置和寫入的時間均無關(guān),只與數(shù)據(jù)內(nèi)容相關(guān),相同內(nèi)容的數(shù)據(jù)具有唯一的指紋,但是,數(shù)據(jù)內(nèi)容只要相差一點點,數(shù)據(jù)的指紋可能千差萬別。因此,不能根據(jù)本次查詢的指紋預期即將查詢的指紋,不能通過存儲系統(tǒng)的空間局部性來組織緩存的指紋映射表中的指紋映射記錄。
但是,指紋查詢來自用戶發(fā)送的讀寫io請求,根據(jù)時間局部性特點,用戶現(xiàn)在讀取的數(shù)據(jù),在將來一段時間內(nèi)可能會再次讀取對應(yīng)的數(shù)據(jù)或者寫入相同的數(shù)據(jù),例如,基于vdi(英文全稱virtualdesktopinfrastructure,即虛擬桌面基礎(chǔ)架構(gòu))的io請求具備上述特點。
基于上述的分析,本發(fā)明實施例提供一種數(shù)據(jù)重刪的方法,如圖1所示,該方法包括:
步驟10、根據(jù)存儲設(shè)備的條件建立多個指紋映射分區(qū)。
如圖2所示,根據(jù)存儲設(shè)備的實際條件,例如,內(nèi)存大小和cpu處理能力等確定建立合適的指紋映射分區(qū)數(shù)量,包括分區(qū)1-分區(qū)n多個指紋映射分區(qū),例如,對于內(nèi)存小于1g、雙核cpu的存儲設(shè)備,可建立256個指紋映射分區(qū),對于具有更大內(nèi)存容量和更強cpu的存儲設(shè)備可以建立更多的指紋映射分區(qū),具體指紋映射分區(qū)數(shù)量本實施例并不限定。
步驟20、為每個指紋映射分區(qū)建立分區(qū)索引。
建立多個指紋映射分區(qū)以后,為每個指紋映射分區(qū)建立分區(qū)索引,分區(qū)索引為指向指紋映射分區(qū)的中數(shù)據(jù)(例如,下述的指紋映射表中的數(shù)據(jù))的指針,每個分區(qū)索引具有索引值,可根據(jù)該索引值快速定位到對應(yīng)的指紋映射分區(qū)。
步驟30、基于分區(qū)索引在每個指紋映射分區(qū)建立多個指紋映射表,每個指紋映射表包括若干條指紋映射記錄,多個指紋映射表按照指紋映射記錄建立的時間段先后順序排列。
如圖2所示,每個指紋映射分區(qū)建立多個指紋映射表,例如,指紋映射表tn、指紋映射表tn-1,……,指紋映射表t1等,指紋映射表中包括指紋映射記錄,指紋映射記錄為數(shù)據(jù)的指紋與對數(shù)據(jù)進行重刪處理的重刪副本的物理地址之間的映射關(guān)系。
時間段是根據(jù)指紋映射記錄的建立時間先后順序劃分的,具體劃分方法可根據(jù)實際需要劃分,例如,每個時間段包括若干個小時,則每隔若干個小時為一個時間段,按照時間的先后將對應(yīng)時間段建立的指紋映射記錄保存在對應(yīng)的時間段中,該時間段中的多個指紋映射記錄構(gòu)成了指紋映射表。
這些指紋映射表按照建立時間的先后順序排列,位于最前面的時間段(最近時間段)的指紋映射表tn排在最前面,以此類推,位于最后面的時間段(最早時間段)的指紋映射表t1排在最后面,例如,時間段的時間間隔為一個小時,當前時間為中午12點,則12點至之前的11點的時間段為位于最前面的時間段,如果指紋映射分區(qū)中當前時間之前最早的指紋映射記錄的建立時間是8點,則8點至9點這個時間段為最后面的時間段。
步驟40、將每個指紋映射分區(qū)中的多個指紋映射表中時間段位于前面的若干個指紋映射表緩存在存儲設(shè)備的內(nèi)存中,其他的指紋映射表持久的保存在存儲設(shè)備中。
每個指紋映射分區(qū)的指紋映射表中時間段位于前面的,也就是近期時間段的指紋映射表緩存在內(nèi)存中,其他的指紋映射表并不在內(nèi)存中,而是持久的保存在存儲設(shè)備中,持久的保存指保存在存儲設(shè)備的持久化存儲介質(zhì)上,例如,磁盤、ssd(solidstatedrives,固態(tài)硬盤)和nvram(non-volatilerandomaccessmemory,非易失性隨機訪問存儲器)等。
可根據(jù)存儲設(shè)備內(nèi)存容量大小確定緩存在內(nèi)存中的指紋映射表,可只將位于最前面的時間段的指紋映射表緩存在內(nèi)存中,或者,當內(nèi)存較為充足時,可將時間段靠前的幾個指紋映射表緩存在內(nèi)容中。
本實施例中,對于重刪元數(shù)據(jù)中的指紋映射記錄進行了分區(qū)保存,通過建立多個指紋映射分區(qū),可將體量龐大的指紋映射記錄劃分成體量適中的多個片段,每個片段保存在對應(yīng)的指紋映射分區(qū)中,這樣對于每個分區(qū)中的指紋映射記錄可獨立組織,提高對指紋映射記錄的查詢效率。
并且根據(jù)時間的先后順序,將每個指紋映射分區(qū)中的指紋映射記錄分段組織,建立多個指紋映射表,時間最靠前的指紋映射記錄保存在內(nèi)存中,而之前的一些指紋映射記錄持久的保存,這樣可以降低內(nèi)存的消耗,進而提高數(shù)據(jù)的重刪處理的速度,并且,根據(jù)讀寫io的時間局部性特點,用戶在最新時間寫入或者讀取的數(shù)據(jù),在將來一段時間內(nèi)可能會再次讀取對應(yīng)的數(shù)據(jù)或者寫入相同的數(shù)據(jù),因此,按照時間的先后順序組織指紋映射記錄,還可以提高對指紋映射記錄內(nèi)存中查詢的命中率,且本實施例中的指紋映射記錄不需要占用大量的內(nèi)存容量,不受存儲設(shè)備的容量限制,可應(yīng)用在大容量的存儲設(shè)備中。
在一個可選的實施例方式中,如圖3和圖4所示,在上述的步驟20之后,還可以包括以下步驟:
步驟21、基于分區(qū)索引在每個指紋映射分區(qū)建立當前映射日志,當前映射日志包括位于前面的時間段的若干條指紋映射記錄;
步驟22、將當前映射日志持久保存在存儲設(shè)備中,且緩存在存儲設(shè)備的內(nèi)存中。
當前映射日志用來持久化位于前面的時間段的指紋映射記錄,其他時間段的指紋映射記錄不需要保存在當前映射日志中,這樣當有新增加的指紋映射記錄時,可首先將指紋映射記錄添加到當前映射日志中,然后在添加到對應(yīng)的指紋映射表中,這樣可減少持久化指紋映射記錄的數(shù)量。
在一個可選的實施方式中,上述步驟21中的當前映射日志中的若干條指紋映射記錄按照指紋映射分區(qū)接收到待寫入數(shù)據(jù)的指紋的時間先后順序排列。
本實施例中,當前映射日志中的指紋映射記錄為數(shù)據(jù)(即將待寫入數(shù)據(jù)寫入存儲設(shè)備后的數(shù)據(jù))的指紋與重刪副本的物理地址之間的映射關(guān)系,當有待寫入數(shù)據(jù)需要寫入存儲設(shè)備中并需要為該待寫入數(shù)據(jù)建立一條新的指紋映射記錄時,首先根據(jù)待寫入數(shù)據(jù)的指紋查找所在的指紋映射分區(qū),然后在該指紋映射分區(qū)建立指紋映射記錄,以將指紋映射記錄保存該指紋映射分區(qū)的當前映射日志。
按照指紋映射分區(qū)接收到待寫入數(shù)據(jù)的指紋的時間先后順序組織當前映射日志,也就是按照待寫入數(shù)據(jù)的指紋到達對應(yīng)指紋映射分區(qū)的時間先后順序組織當前映射日志,這樣最早被接收到的待寫入數(shù)據(jù)的指紋最先建立對應(yīng)的指紋映射記錄并添加到當前映射日志中,之后接收到的待寫入數(shù)據(jù)的指紋并建立的指紋映射記錄依次追加添加到之前的指紋映射記錄后面并保存,如圖5所示,當前映射日志包括多條指紋映射記錄,例如,指紋1(待寫入數(shù)據(jù)1的指紋)與物理地址1之間的映射關(guān)系、指紋2(待寫入數(shù)據(jù)2的指紋)與物理地址2之間的映射關(guān)系、指紋3(待寫入數(shù)據(jù)3的指紋)與物理地址3之間的映射關(guān)系等,待寫入數(shù)據(jù)1的指紋最先到達指紋映射分區(qū),將指紋映射記錄1(即指紋1與物理地址1之間的映射關(guān)系)最先添加到當前映射日志中,然后待寫入數(shù)據(jù)2的指紋到達指紋映射分區(qū),將指紋映射記錄2(即指紋2與物理地址2之間的映射關(guān)系)追加到指紋映射記錄1的后面,之后到達的待寫入數(shù)據(jù)3的指紋的指紋映射記錄3(即指紋3與物理地址3之間的映射關(guān)系),追加到指紋映射記錄2的后面,依次類推,這樣,每添加一條指紋映射記錄,只需要持久化新增的指紋映射記錄,不需要改動之前的指紋映射記錄,因此持久化的數(shù)據(jù)量最小,最大程度減少持久化的數(shù)據(jù)量。
在一個可選的實施方式中,如圖6所示,每個指紋映射表還包括:指紋映射表所在時間段的截止時間點、指紋映射記錄中的起始指紋、指紋映射記錄中的結(jié)束指紋和/或指紋映射記錄的數(shù)量。
本實施中,指紋映射表還可以包括指紋映射表所在時間段的截止時間點,該截止時間點是該時間段中最后一條指紋映射記錄的建立時間,該截止時間也是位于該時間段前面的時間段的起始時間,這樣保持指紋映射表中的指紋映射記錄的基于時間段的連續(xù)性。多條指紋映射記錄可以按照多種順序排列,例如,可以按照指紋映射記錄到達指紋映射分區(qū)的時間先后順序排列,或者可以按照指紋映射記錄中指紋的大小順序排列,或者按照任意順序排列,起始指紋可以是排在最前面的指紋映射記錄中的指紋,結(jié)束指紋可以是排在最后面的指紋映射記錄中的指紋。指紋映射記錄的數(shù)量每個指映射記錄表包含的指紋映射記錄的條數(shù),通過該數(shù)量可以初步判斷指紋映射記錄的大小。
在一個可選的實施例方式中,如圖6所示,多條指紋映射記錄按照指紋映射記錄中的指紋的數(shù)值的大小順序排列。
指紋是對寫入數(shù)據(jù)根據(jù)算法進行運算得到的,指紋可以用二進制表示的數(shù)值,多條指紋映射記錄可以按照指紋的數(shù)值從大到小或者從小到大的順序進行排序,這樣順序排列后,在指紋映射記錄中通過指紋進行查找時,可以利用快速查找算法(例如,折半查找法,也叫二分查找法),據(jù)此,可以提高查找效率,降低內(nèi)存消耗,提高重刪處理速度。
在一個可選的實施例方式中,如圖4所示,上述的步驟10之后還可以包括以下步驟:
步驟11、根據(jù)指紋映射分區(qū)的數(shù)量,提取寫入數(shù)據(jù)的指紋長度中的若干位;
上述的步驟20具體可以包括:
步驟20′、根據(jù)若干位為指紋映射分區(qū)建立分區(qū)索引,其中,每個分區(qū)索引的索引值為若干位,不同分區(qū)索引的索引值不相同。
本實施例中,在確定指紋映射分區(qū)的數(shù)量后,可以從寫入數(shù)據(jù)的指紋長度中提取若干位,指紋長度指用二進制表示的包含多個字節(jié)的數(shù)值,該若干位可以是指紋長度中的連續(xù)的一個或者多個字節(jié),也可以是從指紋長度中提取的不連續(xù)的若干位,進一步的根據(jù)提取的若干位建立分區(qū)索引,提取的若干位代表一個數(shù)值,分區(qū)索引的索引值為上述若干位代表的數(shù)值,不同分區(qū)索引的索引值不同,這樣根據(jù)提取的若干位建立多個指紋映射分區(qū)。例如,如果有256個指紋映射分區(qū),可以從指紋長度中截取1個字節(jié)(8個bit),1個字節(jié)可以得到256個不同數(shù)值的整數(shù),每個整數(shù)可代表一個分區(qū)索引值,據(jù)此,通過不同的分區(qū)索引值可為組成256個指紋映射分區(qū)的分區(qū)索引。
在一個可選的實施例方式中,上述的指紋映射記錄包括寫入數(shù)據(jù)的部分指紋長度與重刪副本的物理地址之間的映射關(guān)系,部分指紋長度為寫入數(shù)據(jù)的指紋長度除了提取的若干位以外的指紋長度;每個指紋映射分區(qū)中寫入數(shù)據(jù)的指紋長度被提取相同的若干位。
本實施例中,對于寫入數(shù)據(jù)的指紋,可從指紋長度中提取若干位,根據(jù)剩下的指紋長度建立指紋映射記錄,由于每個指紋分區(qū)的指紋被提取了相同的若干位,具有相同若干位的指紋在同一個指紋映射分區(qū)中,這些相同的若干位不需要保存在指紋映射記錄中或者當前映射日志中,只需要根據(jù)剩下的指紋長度建立指紋映射記錄,進而保存在指紋映射表中,可減少指紋映射記錄中數(shù)據(jù)的容量。當然,提取的若干位進一步的可作為公共字段位,作為每個指紋映射分區(qū)中的分區(qū)索引值。
在一個可選的實施方式中,如圖7所示,上述步驟30之后,還可以包括:
步驟50、當指紋映射分區(qū)中位于最前面的時間段之后的時間新增加的指紋映射記錄的數(shù)量達到預設(shè)數(shù)量時,生成最新時間段的指紋映射表,并將緩存在存儲設(shè)備內(nèi)存中的多個指紋映射表中位于最后面的時間段的指紋映射表從緩存中釋放,持久的保存在存儲設(shè)備中;
步驟60、將新增加的指紋映射記錄添加到指紋映射分區(qū)的當前映射日志中,并將緩存在存儲設(shè)備內(nèi)存中的當前映射日志中的位于最后面的時間段的指紋映射記錄從緩存中釋放且將其從存儲設(shè)備中刪除。
本實施例中,當新增的指紋映射記錄達到預設(shè)數(shù)量時,就生成一個新的時間段,將該時間段的指紋映射記錄保存在新的時間段中,作為一個新的指紋映射表,而之前緩存在內(nèi)存中的指紋映射表中位于最后面的時間段(緩存的指紋映射表中最早的時間段)的指紋映射表從內(nèi)存中釋放并持久化。
并且,將新增加的指紋映射記錄添加到當前映射日志,對于當前映射日志中的位于最后面時間段的指紋映射記錄從內(nèi)存中釋放,并從存儲設(shè)備的持久化存儲介質(zhì)中刪除。
本實施例,可以使存儲在內(nèi)存中的指紋映射表始終保持一個合理的大小,避免導致內(nèi)存中緩存數(shù)據(jù)量超過內(nèi)存的容量;同時,使內(nèi)存中的當前映射日志保持在一個合理的大小,當在存儲重啟后加載基于當前映射日志重構(gòu)指紋映射表時,可以在一個可以預期的短時間內(nèi)加載完成。
在一個可選的實施方式中,如圖8所示,上述步驟30之后還可以包括:
步驟70、當指紋映射分區(qū)中的指紋映射表的數(shù)量超過預設(shè)數(shù)量時,將相鄰時間段的指紋映射表合并成一個指紋映射表。
相鄰時間段指時間段最接近的兩個或多個時間段,可將兩個或多個時間段對應(yīng)的指紋映射表合并成一個指紋映射表。
本實施例中,對于每一個指紋映射分區(qū),為了使指紋映射表的數(shù)量保持在一個合理數(shù)目,可將相鄰時間段的指紋映射表進行合并,即,將相鄰時間段的時間點進行合并,并將合并時間段中的指紋映射記錄合并成一個指紋映射表,這樣避免指紋映射表數(shù)量太多而影響查找效率。
在一個可選的實施方式中,如圖8所示,上述步驟30之后還可以包括:
步驟80、獲取存儲設(shè)備中沒有引用的重刪副本對應(yīng)的指紋映射記錄;
步驟90、刪除沒有引用的重刪副本對應(yīng)的指紋映射記錄;
步驟100、當沒有引用的重刪副本的指紋映射記錄所在的指紋映射表中剩余的指紋映射記錄的數(shù)量小于預設(shè)數(shù)量時,將刪除的指紋映射記錄所在的指紋映射表中剩余的指紋映射記錄合并至與其相鄰的時間段的指紋映射表中,并刪除沒有引用的重刪副本對應(yīng)的指紋映射記錄所在的指紋映射表。
本實施例中,當用戶對存儲設(shè)備中的數(shù)據(jù)進行刪除和改寫時,時間一長,會產(chǎn)生很多沒有引用的重刪副本,這時需要回收這些沒用引用的重刪副本,此時,重刪副本對應(yīng)的指紋映射記錄也需要從指紋映射表中刪除,在刪除指紋映射記錄的同時,可以進行指紋映射表也進行合并,這樣可減少指紋映射記錄和指紋映射記錄表的數(shù)據(jù),進一步的提高內(nèi)存利用率,減小內(nèi)存消耗,提高查詢效率。
在進行上述對指紋映射記錄刪除、合并和對指紋映射表進行合并等操作步驟時,可將需要操作的指紋映射表加載到內(nèi)存中,然后進行上述各步驟的操作。
需要說明的是,上述用戶對存儲設(shè)備中數(shù)據(jù)進行刪除和改寫指的是,用于對存儲設(shè)備中為用戶提供的數(shù)據(jù)訪問的存儲單元中的數(shù)據(jù)進行的刪除和改寫。
在一個可選的實施方式中,上述步驟22之后還可以包括:
步驟110、當存儲設(shè)備重啟時,根據(jù)當前映射日志構(gòu)建當前映射日志所在時間段的指紋映射表。
當前映射日志所在時間段指由當前映射日志中的多條指紋映射記錄的建立時間點組成的時間段,當前映射日志中保存的是指紋映射表中位于前面的時間段的指紋映射記錄,因此,該時間段與緩存在存儲設(shè)備內(nèi)存中的位于前面的時間段的指紋映射表的時間段通常是相同。
本實施例中,當存儲設(shè)備由于掉電、存儲設(shè)備故障、或者用戶主觀重啟等原因?qū)Υ鎯υO(shè)備進行重啟時,緩存在存儲設(shè)備內(nèi)存中的指紋映射記錄表和當前指紋映射日志會丟失,由于當前映射日志持久保存在存儲設(shè)備的存儲介質(zhì)中,因此,可通過回放調(diào)用持久存儲介質(zhì)中的當前映射日志,重新構(gòu)建對應(yīng)時間段的指紋映射表,不會造成因存儲設(shè)備存儲無法加載指紋映射表的情況。
本發(fā)明實施例還提供了一種數(shù)據(jù)重刪的方法,該方法應(yīng)用于存儲設(shè)備,如圖9所示,包括以下步驟:
步驟200、根據(jù)io請求獲取目標指紋。
io請求可以包括讀io請求或者寫io請求,在讀io請求會直接攜帶指紋,寫io請求中會攜帶待寫入數(shù)據(jù),進而可根據(jù)重刪算法計算數(shù)據(jù)的指紋,本實施例中將讀io請求中攜帶的指紋或者寫io請求中根據(jù)待寫入數(shù)據(jù)計算的指紋稱為目標指紋。
步驟210、查找目標指紋所在的指紋映射分區(qū)。
首先根據(jù)目標指紋查找所在的指紋映射分區(qū),可根據(jù)指紋分區(qū)索引查找對應(yīng)的指紋映射分區(qū),例如,可提取指紋中的相關(guān)字節(jié),根據(jù)該相關(guān)字節(jié)判斷所在的分區(qū)索引,進而查找對應(yīng)的指紋映射分區(qū)?;蛘吒鶕?jù)上述實施例中描述的,當從指紋長度中提取若干位作為分區(qū)索引值時,在計算出目標指紋后,可從指紋長度中提取該若干位,比較那個分區(qū)索引的索引值與該若干位代表的數(shù)值相同,與提取的若干位代表的數(shù)值相同的分區(qū)索引值所在的指紋映射分區(qū)即為目標指紋所在的指紋映射分區(qū)。
步驟220、從所述所在的指紋映射分區(qū)中的按照時間段先后順序排列的指紋映射表中依次查找是否存在目標指紋,并返回查找消息。
查找到指紋所在的指紋映射分區(qū)后,按照其中指紋映射表的順序,按照時間由近及遠,依次從指紋映射表中進行查找是否存在與目標指紋相同的指紋,如果存在可返回查找成功的查找消息,如果不存在可返回查找失敗的查找消息。
下面舉例具體說明,如果io請求為讀io請求,若查找到與目標指紋相同的指紋,說明查找成功,則存儲設(shè)備可根據(jù)目標指紋可以獲得對應(yīng)的指紋映射記錄,根據(jù)指紋映射記錄可以獲取目標指紋對應(yīng)的重刪副本的物理地址,根據(jù)物理地址將獲取的重刪副本返回,即返回目標指紋對應(yīng)的數(shù)據(jù),此時返回的查找消息可為該數(shù)據(jù);若沒有查到到與目標指紋相同的指紋,說明查找失敗,存儲設(shè)備中不存在與目標指紋對應(yīng)的重刪副本,此時返回查找失敗的查找消息。
如果io請求為寫io請求,若查找到與目標指紋相同的指紋,說明查找成功,存儲設(shè)備可根據(jù)該目標指紋獲取對應(yīng)的指紋映射記錄,進一步的進行重刪處理,該重刪處理例如可以為,根據(jù)指紋映射記錄獲取對應(yīng)的重刪副本的物理地址,根據(jù)物理地址將獲取的重刪副本與待寫入數(shù)據(jù)進行內(nèi)容比較,如果內(nèi)容不一致,說明出現(xiàn)的指紋沖突,此時還需要為待寫入數(shù)據(jù)分配存儲空間并保存待寫入數(shù)據(jù),此時返回的查找消息可為存在指紋沖突的查找消息,如果重刪副本和待寫入數(shù)據(jù)的內(nèi)容一致,說明不存在指紋沖突,待寫入數(shù)據(jù)已經(jīng)存在重刪副本,不需要進行保存,此時返回的查找消息可為重刪副本存在的查找消息;若沒有查找到與目標指紋相同的指紋,說明查找失敗,該指紋映射表中不存在與目標指紋對應(yīng)的指紋映射記錄,即不存在待寫入數(shù)據(jù)的重刪副本,進行重刪處理,該重刪處理例如可以為,建立待寫入數(shù)據(jù)的重刪副本,在指紋映射表中增加指紋映射記錄等,此時返回的查找消息為該目標指紋。
本實施例中,重點不在于如何進行重刪處理,而在于如何進指紋查找獲取目標指紋后,首先查找目標指紋所在的指紋映射分區(qū),進而在對應(yīng)的指紋映射分區(qū)的指紋映射表中查找目標指紋,而不需要在所有指紋映射表的指紋映射記錄中進行查找,可以減小指紋查找的數(shù)據(jù)量,降低內(nèi)存消耗,提高查詢效率。
在一個可選的實施方式中,如圖10所示,上述步驟220具體可以包括:
步驟s1、從所述所在的指紋映射分區(qū)中的,位于最前面的時間段指紋映射表中查找所述目標指紋;
步驟s2、判斷是否存在目標指紋,若是則返回查找成功的查找消息,若否則執(zhí)行下述步驟s3;
步驟s3、按照時間段的先后順序依次獲取下一個指紋映射表,并判斷是否能獲取到下一個指紋映射表,若是,則執(zhí)行下述步驟s4,若否,則返回查找失敗的查找消息;
步驟s4、判斷所述下一個指紋映射表是否緩存在存儲設(shè)備的內(nèi)存中,若是,則執(zhí)行下述步驟s5,若否,則執(zhí)行下述步驟s6;
步驟s5、在所述下一個指紋映射表中查找目標指紋,接著執(zhí)行上述所述步驟s2;
步驟s6、將所述下一個指紋映射表加載到存儲設(shè)備的內(nèi)存中,然后接著執(zhí)行上述所述步驟s5,再接著執(zhí)行上述所述步驟s2。
本實施例中,在對指紋進行查找時,首先從位于最前面的時間段指紋映射表中查找是否存與目標指紋相同的指紋映射記錄,當沒有查找到時,判斷是否存在下一個時間段的指紋映射表,如果存在,進一步的判斷該下一個時間段的指紋映射表是否在內(nèi)存中,若不在內(nèi)存中,說明該指紋映射表保存在存儲設(shè)備的持久存儲介質(zhì)中,此時,將該指紋映射表加載在內(nèi)存中,然后在該指紋映射表中再次查找是否存與目標指紋相同的指紋映射記錄,直到遍歷所在指紋映射分區(qū)中的所有指紋映射表。
本實施例中,根據(jù)io請求訪問的時間局部性,目標指紋很大概率上會在最近時間段的指紋映射表中,而最近時間段的指紋映射表緩存在內(nèi)存中,同時指紋映射表有排序,所以查找速度快。
本發(fā)明實施例還提供了一種重刪數(shù)據(jù)的方法,該方法應(yīng)用于存儲設(shè)備,如圖11所示,該方法包括以下步驟:
步驟300、獲取io請求中的待寫入數(shù)據(jù),且計算待寫入數(shù)據(jù)的指紋;
步驟310、在按照時間段先后順序排列的指紋映射表中依次查找是否存在待寫入數(shù)據(jù)的指紋;
步驟320、當不存在時,根據(jù)所述待寫入數(shù)據(jù)的指紋找到對應(yīng)的指紋映射分區(qū);
步驟330、建立待寫入數(shù)據(jù)的指紋與新分配的重刪副本的物理地址之間的映射關(guān)系,即建立新的指紋映射記錄,并將映射關(guān)系添加到對應(yīng)的指紋映射分區(qū)的當前映射日志中;
步驟340、將映射關(guān)系添加到對應(yīng)的指紋映射分區(qū)中位于最前面的時間段的指紋映射表中。
本實施例中,可按照上述實施例中的對指紋進行查找的查找方法在存儲設(shè)備的所有指紋映射表中查找是否存在待寫入數(shù)據(jù)的指紋,如果不存在,也就是查找失敗,需要新增加指紋映射記錄,此時,首先根據(jù)指紋查找對應(yīng)的指紋映射分區(qū),在對應(yīng)的指紋映射分區(qū)中將新建立的指紋映射記錄添加到當前映射日志中,并且,將指紋映射記錄添加到緩存在內(nèi)存中的位于最前面的時間段的指紋映射表中。
在一個可選的實施方式中,上述步驟320具體可以包括以下步驟:
步驟3201、當不存在時,提取待寫入數(shù)據(jù)的指紋長度中的若干位;
步驟3202、查找與若干位相同的分區(qū)索引值,根據(jù)分區(qū)索引值查找對應(yīng)的指紋映射分區(qū)。
本實施方式中,參照上述實施例中的描述,指紋映射分區(qū)中的分區(qū)索引值是從之前已經(jīng)完成重刪處理的數(shù)據(jù)的指紋中提取的若干位,根據(jù)該若干位建立的分區(qū)索引值,因此,當需要建立新的指紋映射記錄時,根據(jù)從待寫入數(shù)據(jù)的指紋長度中提取的相同位置的若干位判斷在哪個指紋映射分區(qū)建立指紋映射記錄,當查找到與待寫入數(shù)據(jù)的指紋相同的分區(qū)索引值,將新的指紋映射記錄保存在查找到的分區(qū)索引值對應(yīng)指紋映射分區(qū)的指紋映射表中,這樣,在后續(xù)進行數(shù)據(jù)重刪時,有利于降低內(nèi)存消耗,提高查詢效率。
本發(fā)明實施例還提供一種存儲設(shè)備,包括存儲器和處理器,存儲器中存儲有多條指令,該指令適于由處理器加載并執(zhí)行上述實施例中的方法。
如圖12所示,上述的存儲設(shè)備可以是個人計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等,存儲設(shè)備可以包括處理器和存儲器,存儲器可以為非易失性存儲器(比如硬盤或者磁盤),還可以包括內(nèi)存和內(nèi)部總線等,存儲器中存儲多條指令,處理器可以將相應(yīng)指令存儲器讀入內(nèi)存中然后運行以執(zhí)行上述的方法。
本領(lǐng)域技術(shù)人員可以理解附圖只是一個優(yōu)選實施例的示意圖,附圖中的模塊或流程并不一定是實施本發(fā)明所必須的。以上所述僅為本發(fā)明的具體實施方式,但本發(fā)明的保護范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到變化或替換,都應(yīng)涵蓋在本發(fā)明的保護范圍之內(nèi)。因此,本發(fā)明的保護范圍應(yīng)以所述權(quán)利要求的保護范圍為準。