丁建立,李 慧,曹衛(wèi)東
(中國民航大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,天津 300300)
近年來,隨著民航業(yè)的迅速發(fā)展,機(jī)場在中小城市的普及和機(jī)票價(jià)格的降低使得越來越多的人會(huì)選擇乘機(jī)出行[1]。這就導(dǎo)致機(jī)場和航空公司的數(shù)據(jù)庫中記錄乘客乘機(jī)信息的數(shù)據(jù)量越來越龐大。某民航單位提供的數(shù)據(jù)顯示,部分?jǐn)?shù)據(jù)庫僅2015—2016年就產(chǎn)生了7.32 GB 數(shù)據(jù),其中重復(fù)數(shù)據(jù)占40%~52%。大量重復(fù)數(shù)據(jù)使民航數(shù)據(jù)庫在容災(zāi)備份時(shí)數(shù)據(jù)的復(fù)制、傳輸和恢復(fù)時(shí)間過長[2],占用了過多的網(wǎng)絡(luò)帶寬。由于需要更大的存儲(chǔ)空間來存儲(chǔ)數(shù)據(jù),系統(tǒng)在擴(kuò)展時(shí)需要更多復(fù)雜的操作,增加維護(hù)難度,且數(shù)據(jù)庫存儲(chǔ)數(shù)據(jù)的成本也會(huì)增加。在民航數(shù)據(jù)庫容災(zāi)備份時(shí),需要?jiǎng)h除大量的重復(fù)數(shù)據(jù)來提高容災(zāi)備份的效率。因此,針對重復(fù)數(shù)據(jù)刪除技術(shù)的研究是非常有意義的。
關(guān)于如何處理重復(fù)數(shù)據(jù)帶來的數(shù)據(jù)冗余問題,早期的解決方法主要有字節(jié)壓縮[3]和差量壓縮[4],但由于方法的編碼、計(jì)算及I/O 開銷較大,壓縮率十分有限。ALACC 方法[5]能夠動(dòng)態(tài)分配一定內(nèi)存給塊緩存,提高了重復(fù)數(shù)據(jù)刪除過程中的數(shù)據(jù)吞吐量,但這種方法只適配于具有固定內(nèi)存大小的重刪系統(tǒng),靈活性不高。廖海生[6]提出的數(shù)據(jù)容災(zāi)系統(tǒng),能從文件夾的子層級(jí)查找出冗余數(shù)據(jù),存儲(chǔ)數(shù)據(jù)所需空間隨之減少,但這種方法首先需要對文件進(jìn)行分級(jí),而民航備份系統(tǒng)中的數(shù)據(jù)文件包含關(guān)系十分復(fù)雜,在文件分級(jí)時(shí)會(huì)占用很多內(nèi)存和CPU 空間,降低了重刪效率。張甲燃[7]和韓英杰[8]在數(shù)據(jù)索引層面進(jìn)行一定改進(jìn),前者將新文件當(dāng)作滑動(dòng)校驗(yàn)碼值去匹配多個(gè)索引,節(jié)省了網(wǎng)絡(luò)數(shù)據(jù)流量;后者增加取樣過程,不斷計(jì)算滑動(dòng)窗口的哈希值,再從中篩選出最小值作為樣本,重刪速度更快,占用內(nèi)存空間也更少,但民航備份系統(tǒng)中的數(shù)據(jù)數(shù)量多且單條數(shù)據(jù)很短,這兩種方法產(chǎn)生的大量滑動(dòng)校驗(yàn)碼值或哈希樣本值的計(jì)算和存儲(chǔ)會(huì)浪費(fèi)較多的系統(tǒng)資源。閻芳[9]提出一種面向分塊的交叉分組數(shù)據(jù)組織方法,調(diào)整磁盤水平分組和垂直分組的大小,使I/O 請求集中在某個(gè)磁盤水平分組,其他分組的磁盤進(jìn)入待機(jī)模式,降低了存儲(chǔ)能耗,但這種方法只對連續(xù)數(shù)據(jù)訪問模式有效,在民航備份系統(tǒng)中,數(shù)據(jù)的大量不連續(xù)訪問會(huì)增加校驗(yàn)磁盤切換次數(shù),增加了時(shí)間開銷和硬件損耗。
綜上所述,針對上述幾種方法應(yīng)用于民航備份系統(tǒng)中存在的問題,提出了一種基于民航數(shù)據(jù)特性的重刪固定長度分塊方法,該方法在分塊邏輯上進(jìn)行了改進(jìn),能夠在一定程度上縮短分塊時(shí)間,提高重刪效率。
重復(fù)數(shù)據(jù)刪除技術(shù)的基本原理[10]是將備份數(shù)據(jù)流按照算法切割成數(shù)據(jù)塊,將切割好的數(shù)據(jù)塊內(nèi)容與數(shù)據(jù)庫中的數(shù)據(jù)內(nèi)容進(jìn)行匹配,如果匹配成功,則說明數(shù)據(jù)塊中的內(nèi)容與數(shù)據(jù)庫中的內(nèi)容相同,則該部分內(nèi)容為重復(fù)數(shù)據(jù)。
重復(fù)數(shù)據(jù)刪除的過程[11]分為4 個(gè)階段:輸入備份數(shù)據(jù)流、生成塊序列、計(jì)算指紋序列、輸出單一副本序列。在容災(zāi)備份時(shí),重復(fù)數(shù)據(jù)刪除系統(tǒng)首先會(huì)接收來自用戶的備份數(shù)據(jù)流,將需要備份的數(shù)據(jù)流按照一定規(guī)則處理成備份數(shù)據(jù)塊,再使用適合的算法計(jì)算其指紋值,生成一個(gè)指紋序列,通過比較這個(gè)指紋序列來判斷這些數(shù)據(jù)是否為重復(fù)數(shù)據(jù)。若在比較過程中,重復(fù)數(shù)據(jù)刪除系統(tǒng)確定了這些數(shù)據(jù)是重復(fù)數(shù)據(jù),則只保留單一的副本序列,重復(fù)的數(shù)據(jù)序列將會(huì)被系統(tǒng)刪除。
1.2.1 固定長度分塊方法
重復(fù)數(shù)據(jù)刪除技術(shù)研究中最早提出的分塊方法是固定長度分塊方法[12]。固定長度分塊方法主要步驟如下:
(1)將需要備份的數(shù)據(jù)流文件輸入備份系統(tǒng),備份系統(tǒng)將數(shù)據(jù)流分為等長的塊,稱為“數(shù)據(jù)塊”,再采用指紋計(jì)算方法計(jì)算每個(gè)塊的指紋,如SHA-1 算法;
(2)計(jì)算出來的數(shù)據(jù)塊指紋值與索引表中已存的指紋值進(jìn)行比較,若比較結(jié)果一致,則匹配成功,該數(shù)據(jù)塊即為重復(fù)數(shù)據(jù)塊,丟棄或刪除即可;否則說明為新數(shù)據(jù),需要將其備份到數(shù)據(jù)庫中,同時(shí)該數(shù)據(jù)塊的指紋值需要存儲(chǔ)到索引表中,以供下次比較指紋值時(shí)使用。
固定長度的分塊方法操作簡單、易實(shí)現(xiàn),同時(shí)對設(shè)備要求不高,但對數(shù)據(jù)的修改位置十分敏感[13]。當(dāng)修改的數(shù)據(jù)在備份文件的頭部時(shí),固定長度分塊方法會(huì)將文件分割成與原文件基本不同的數(shù)據(jù)塊。新的指紋值與原始數(shù)據(jù)指紋值基本不會(huì)相同,備份系統(tǒng)會(huì)把只發(fā)生了很少字節(jié)變化的文件當(dāng)成全新文件進(jìn)行存儲(chǔ),備份系統(tǒng)的效率大幅降低。
1.2.2 可變長度分塊方法
可變長度分塊方法,又稱為基于內(nèi)容可變長度分塊(CDC,content-defined chunking)。這種方法的實(shí)現(xiàn)依賴于Rabin 指紋算法[14]。Rabin 指紋算法能夠根據(jù)前一個(gè)數(shù)據(jù)塊的指紋快速得到滑動(dòng)窗口后下一個(gè)數(shù)據(jù)塊的指紋。
在Rabin 指紋算法中,設(shè)定了一個(gè)固定窗口在文件上滑動(dòng),另外有2 個(gè)預(yù)設(shè)值D 和r,這兩個(gè)值均為整數(shù)且r <D。將固定窗口滑動(dòng)到某一位置k 時(shí),用哈希算法計(jì)算出固定窗口內(nèi)數(shù)據(jù)內(nèi)容的指紋值f,只有滿足f mod D=r 時(shí),當(dāng)前的位置k 才可以界定為數(shù)據(jù)塊的邊界,窗口滑動(dòng)距離就是數(shù)據(jù)塊的大小。然后繼續(xù)將窗口向右滑動(dòng),重復(fù)計(jì)算指紋和匹配的過程,直到找到所有的數(shù)據(jù)塊邊界。如圖1 所示。
圖1 Rabin 指紋算法示意圖Fig.1 Schematic diagram of Rabin fingerprint algorithm
可變長度分塊方法的主要步驟如下:
(1)輸入需要備份的數(shù)據(jù)流文件后,首先從文件頭部開始生成一個(gè)長度固定的滑動(dòng)窗口,計(jì)算該窗口的指紋值,如果這個(gè)指紋值滿足Rabin 指紋算法的條件,那么窗口當(dāng)前的位置就是數(shù)據(jù)塊的一個(gè)邊界;否則,向右滑動(dòng)一個(gè)字節(jié)的長度;
(2)一直重復(fù)步驟(1),直到整個(gè)文件都被分成數(shù)據(jù)塊;
(3)這些數(shù)據(jù)塊的長度可能不同,為每一個(gè)數(shù)據(jù)塊計(jì)算哈希指紋值,將這些指紋值與數(shù)據(jù)庫中已經(jīng)存在的哈希值進(jìn)行對比,如果對比結(jié)果相同,則表示數(shù)據(jù)塊重復(fù),需要?jiǎng)h除該指紋值代表的數(shù)據(jù)塊;否則是不重復(fù)的新數(shù)據(jù)塊,需要進(jìn)行存儲(chǔ)。
在可變長度分塊方法中,分塊方法更加靈活,即使文件數(shù)據(jù)中的變化發(fā)生在文件頭部或中部也能快速找出重復(fù)數(shù)據(jù)。但在可變長度分塊方法實(shí)現(xiàn)過程中:一方面,不管窗口滑動(dòng)到哪個(gè)位置都需要計(jì)算窗口的哈希值,大量的計(jì)算會(huì)增加系統(tǒng)負(fù)擔(dān)[15];另一方面,滑動(dòng)窗口的大小與D 和r 的選值有關(guān)[14]。當(dāng)滑動(dòng)窗口過小時(shí),則在分塊過程中很容易滿足f mod D=r 的條件,導(dǎo)致備份文件分塊過多,計(jì)算出的指紋量也隨之增加,增加了系統(tǒng)在計(jì)算、存儲(chǔ)指紋值過程中的開銷;當(dāng)滑動(dòng)窗口過大時(shí),則系統(tǒng)分出來的每一個(gè)數(shù)據(jù)塊都很大,取一個(gè)極端情況,當(dāng)滑動(dòng)窗口的大小與備份文件的大小相同時(shí),這種分塊方法將毫無意義[16]。
在民航數(shù)據(jù)庫中,存在許多不同值,但數(shù)據(jù)類型相同的數(shù)據(jù)。通過對大量的民航數(shù)據(jù)分析發(fā)現(xiàn),一個(gè)民航數(shù)據(jù)文件流數(shù)據(jù)頭的幾個(gè)固定長度字段能夠表示這個(gè)文件流接下來一段數(shù)據(jù)的類型,因此,稱這種特性為民航數(shù)據(jù)的類型一致性。下面將舉例來說明類型一致性,如圖2 所示。
圖2 民航數(shù)據(jù)的類型一致性Fig.2 Type consistency of civil aviation data
圖2 中,備份的文件流進(jìn)入備份系統(tǒng)后,首先會(huì)將文件流頭部的幾個(gè)字節(jié)提取出來,識(shí)別數(shù)據(jù)類型后將這個(gè)數(shù)據(jù)文件歸類,再根據(jù)數(shù)據(jù)類型計(jì)算出對應(yīng)的文件類型ID 值,最后在分塊策略索引表中索引ID 值對應(yīng)的偏移量值完成分塊。
基于民航數(shù)據(jù)特性的重刪固定長度分塊方法中的“固定”一詞,與固定長度分塊方法中的“固定”一詞,并不是同一種含義。在后者中,“固定”指的是數(shù)據(jù)塊大小固定,系統(tǒng)只要按照預(yù)設(shè)好的數(shù)據(jù)塊大小分塊即可。而前者中,“固定”指的是一種相對固定的分塊,系統(tǒng)在數(shù)據(jù)分塊時(shí)按照分塊策略索引表中的偏移量對備份文件進(jìn)行分塊,這些偏移量是根據(jù)民航數(shù)據(jù)特性預(yù)先計(jì)算出來的,雖然數(shù)值不同,但是固定不變的,故稱這種分塊方法為“基于民航數(shù)據(jù)特性的重刪固定長度分塊方法”,以下簡稱為“民航特性分塊方法”。
根據(jù)民航數(shù)據(jù)類型一致性的特點(diǎn),在民航特性分塊方法中為這幾個(gè)字段單獨(dú)設(shè)置一個(gè)分塊策略索引表。分塊策略索引表中記錄著每個(gè)數(shù)據(jù)分塊的身份ID及對應(yīng)的其在文件中的偏移量。分塊策略索引表的數(shù)據(jù)結(jié)構(gòu)如表1 所示。
表1 分塊策略索引表的數(shù)據(jù)結(jié)構(gòu)Tab.1 Data structure of the block strategy index table
只需要在某類數(shù)據(jù)首次出現(xiàn)時(shí)進(jìn)行滑動(dòng)分塊,并將滑動(dòng)過程中產(chǎn)生的偏移量記錄在分塊策略索引表中,當(dāng)這類數(shù)據(jù)再次出現(xiàn)時(shí),只需要按照第一次的偏移量記錄進(jìn)行分割,而不必再浪費(fèi)CPU 資源進(jìn)行分塊。另外,由于相同類型的不同數(shù)據(jù)會(huì)使用同一個(gè)數(shù)據(jù)塊身份ID,故分塊策略索引表不會(huì)記錄每一個(gè)數(shù)據(jù),分塊策略索引表也不會(huì)過分龐大,索引數(shù)據(jù)塊身份ID 的時(shí)間不會(huì)過長。
圖3 是民航特性分塊方法的重復(fù)數(shù)據(jù)刪除流程圖。流程圖可分為以下5 個(gè)步驟。
步驟1在圖3 中,輸入需要備份的民航數(shù)據(jù)流文件。首先備份系統(tǒng)會(huì)按照一個(gè)預(yù)設(shè)的值在文件流的頭部分割出一個(gè)固定大小的數(shù)據(jù)塊,計(jì)算這個(gè)數(shù)據(jù)塊的指紋值,根據(jù)指紋值生成該數(shù)據(jù)塊的身份ID。
圖3 民航特性分塊方法的重復(fù)數(shù)據(jù)刪除流程圖Fig.3 Flow chart of deduplication of fixed-length block method based on characteristics of civil aviation data
步驟2得到數(shù)據(jù)塊的身份ID 后,在分塊策略索引表中索引數(shù)據(jù)塊身份ID。若能查找到這個(gè)身份ID,則按照分塊策略索引表中的策略對該數(shù)據(jù)流的剩余部分進(jìn)行切割分塊,一直切割到數(shù)據(jù)塊的尾部,轉(zhuǎn)步驟4;如果在分塊策略索引表中查找不到這個(gè)身份ID,則需要為其建立一個(gè)新的策略,轉(zhuǎn)步驟3。
步驟3在建立新策略的過程中,首先生成一個(gè)滑動(dòng)窗口,再計(jì)算這個(gè)窗口的指紋值。若當(dāng)前位置不滿足Rabin 指紋算法的條件,則說明當(dāng)前位置不是數(shù)據(jù)塊的邊界,需要繼續(xù)向后滑動(dòng)窗口來尋找數(shù)據(jù)塊的邊界位置。當(dāng)窗口所在位置滿足Rabin 指紋算法的條件時(shí)才到達(dá)了數(shù)據(jù)塊的尾部邊界,記錄滑動(dòng)窗口此時(shí)的偏移量,方便數(shù)據(jù)下次出現(xiàn)時(shí)能夠在分塊策略索引表中找到分塊策略,快速完成分塊操作。
步驟4重復(fù)步驟1~3 的過程直到整個(gè)備份文件流都完成分塊。
步驟5整個(gè)備份文件流都完成分塊后,開始進(jìn)行重復(fù)數(shù)據(jù)刪除操作。首先為每個(gè)數(shù)據(jù)塊計(jì)算哈希指紋值,將這些指紋值與數(shù)據(jù)庫中已經(jīng)存在的哈希值進(jìn)行對比。如果對比結(jié)果相同,則表示數(shù)據(jù)塊重復(fù),需要?jiǎng)h除該指紋值代表的數(shù)據(jù)塊;否則為不重復(fù)的新數(shù)據(jù)塊,需要進(jìn)行存儲(chǔ),不存在的數(shù)據(jù)塊需要在索引表中留下其指紋值,方便后續(xù)的數(shù)據(jù)塊進(jìn)行比較。
實(shí)驗(yàn)平臺(tái)的基本配置如表2 所示。
表2 實(shí)驗(yàn)平臺(tái)配置情況Tab.2 Configuration of lab platform
實(shí)驗(yàn)中所用數(shù)據(jù)集為2015年12月至2016年12月某民航單位提供的離港數(shù)據(jù)庫、旅客訂座記錄(PNR)數(shù)據(jù)庫、客票(ET)數(shù)據(jù)庫、客座率數(shù)據(jù)庫中的部分?jǐn)?shù)據(jù)。這4 個(gè)數(shù)據(jù)庫中的數(shù)據(jù)大小分別為382MB、2.74 GB、3.96 GB、236 MB,合計(jì)數(shù)據(jù)量為7.32 GB,包含的數(shù)據(jù)條目約為23 203 萬條。
在實(shí)驗(yàn)時(shí),將2015年12月至2016年5月的數(shù)據(jù)作為數(shù)據(jù)庫中的原有數(shù)據(jù),此后2016年6月至12月每月分別使用固定長度分塊方法、可變長度分塊方法、民航特性分塊方法為數(shù)據(jù)庫做一次全量備份,共7 次。
在本節(jié)實(shí)驗(yàn)中,對使用了3 種方法備份所用的時(shí)間進(jìn)行對比分析。備份時(shí)所用時(shí)間情況如圖4 所示,縱軸的單位為厘秒(10-2s)。
圖4月備份所需時(shí)間Fig.4 The time required for monthly backups
從圖4 中看出:在備份時(shí),固定長度分塊方法所用時(shí)長最短,可變長度分塊方法與民航特性分塊方法所需時(shí)間差別不大,但后者所用時(shí)間基本少于前者;相對于固定長度分塊方法,可變長度分塊方法備份所需時(shí)間是其1.5 ~2.0 倍,民航特性分塊方法備份所需時(shí)間是其1.2 ~1.8 倍。
在可變長度分塊方法中,滑動(dòng)窗口需要不斷滑動(dòng),每次滑動(dòng)后都要計(jì)算滑動(dòng)窗口的指紋值,這一過程消耗的CPU 資源和時(shí)間要比另外兩種方法都多。在民航特性分塊方法中,備份文件被輸入系統(tǒng)后,若文件流直接按照策略進(jìn)行分塊,則節(jié)省了尋找數(shù)據(jù)塊邊界的時(shí)間;若文件流需要尋找數(shù)據(jù)塊的邊界來進(jìn)行分塊,則該過程消耗了更多時(shí)間進(jìn)行計(jì)算操作,因此,這種方法所需的時(shí)間要長于固定長度分塊方法,但總體比可變長度分塊方法用時(shí)要短。而在固定長度分塊方法中,只需要將每個(gè)數(shù)據(jù)文件按照要求切割成固定大小的數(shù)據(jù)塊即可,而無需其他操作,因此這種分塊方法所需的時(shí)間遠(yuǎn)小于另外兩種。
雖然固定長度分塊方法所需時(shí)間最短,但備份所需時(shí)間并不是檢驗(yàn)一種分塊方法好壞的唯一標(biāo)準(zhǔn),仍需進(jìn)一步實(shí)驗(yàn)來比較這3 種分塊方法。
實(shí)驗(yàn)的側(cè)重點(diǎn)在于重復(fù)數(shù)據(jù)刪除技術(shù)研究中對備份數(shù)據(jù)流進(jìn)行分塊這一步驟,而不在于最終重復(fù)數(shù)據(jù)刪除的具體百分比,所以本節(jié)實(shí)驗(yàn)將會(huì)根據(jù)民航數(shù)據(jù)的特性采用模擬的重刪率,而不是真正的重刪率,以節(jié)約系統(tǒng)資源,減少實(shí)驗(yàn)時(shí)長而不影響最終效果的呈現(xiàn)。
實(shí)驗(yàn)將2016年6月至12月每個(gè)月分塊后的數(shù)據(jù)塊與原有數(shù)據(jù)(即2015年12月至2016年5月的數(shù)據(jù))分塊后的數(shù)據(jù)塊做對比,用每個(gè)月的數(shù)據(jù)塊變化的多少來模擬重刪率的高低。實(shí)驗(yàn)中采用分塊后數(shù)據(jù)塊變化數(shù)目的對數(shù)(以2 為底)再取其倒數(shù)來計(jì)算模擬重刪率。
若某月分塊后的數(shù)據(jù)塊變化較多,則說明分塊過程中產(chǎn)生的變化較多,表示備份系統(tǒng)效果不佳,模擬重刪率越低,即重刪率低;若某月分塊后的數(shù)據(jù)塊變化較少,則說明分塊過程中產(chǎn)生的變化也較少,模擬重刪率越高,即重刪率高。實(shí)驗(yàn)結(jié)果如圖5 所示。
圖5 模擬重刪率實(shí)驗(yàn)結(jié)果Fig.5 Simulation results of deduplication rate experiment
由圖5 可知,可變長度分塊方法與民航特性分塊方法在備份系統(tǒng)備份過程中的效果都很好,固定長度分塊方法模擬重刪率稍低,但民航特性分塊方法始終有著高于另外兩種方法的模擬重刪率。民航特性分塊方法的模擬重刪率能達(dá)到97.8%~99.3%,比固定長度分塊方法高11.8%~12.5%,比可變長度分塊方法高2.5%~3.0%。
基于民航數(shù)據(jù)特性的重刪固定長度分塊方法數(shù)據(jù)塊的身份ID 能夠在分塊策略索引表中被找到時(shí),按照策略直接進(jìn)行分塊,這些新的分塊相較之前的分塊基本不會(huì)發(fā)生變化,只有當(dāng)數(shù)據(jù)塊首次出現(xiàn),為這個(gè)數(shù)據(jù)塊添加新的策略時(shí),新的分塊相較之前的分塊才會(huì)發(fā)生變化。在固定長度分塊方法中,因?yàn)檫@種方法對數(shù)據(jù)變化的位置十分敏感,文件中的數(shù)據(jù)發(fā)生變化后,從當(dāng)前數(shù)據(jù)所在位置向后的所有數(shù)據(jù)分塊都會(huì)發(fā)生變化[17]??勺冮L度分塊是對內(nèi)容進(jìn)行校驗(yàn)來判斷分塊邊界,會(huì)將同一類型的不同數(shù)據(jù)都當(dāng)作新的數(shù)據(jù)分塊,所以固定長度分塊方法的模擬重刪率最低。
通過分析民航數(shù)據(jù)的特性,改進(jìn)了固定長度分塊方法和可變長度分塊方法,提出了一種基于民航數(shù)據(jù)特性的重刪固定長度分塊方法。在分塊方法中,設(shè)置了一個(gè)分塊策略索引表,來存放某一類型數(shù)據(jù)對應(yīng)的分塊切割策略。實(shí)驗(yàn)表明,該方法雖然備份時(shí)間略長,但模擬重刪率比另外兩種方法都要高,提高了重復(fù)數(shù)據(jù)刪除過程中的分塊效果,總體在重刪過程中有著較好的表現(xiàn)。