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