李蕭言,安 陽
(山西工程技術(shù)學(xué)院 山西 陽泉 045000)
目前,數(shù)字經(jīng)濟和網(wǎng)絡(luò)社會的蓬勃發(fā)展為存儲系統(tǒng)在存儲容量、數(shù)據(jù)安全等方面帶來了新的發(fā)展機遇和挑戰(zhàn)。磁盤陣列(redundant arrays of independent disks,RAID)將多個獨立磁盤在邏輯上組成具有冗余能力的單一磁盤,提高了數(shù)據(jù)的集成度和處理量[1],其中RAID6 具有雙冗余校驗,與糾刪碼技術(shù)[2]結(jié)合使存儲系統(tǒng)具有更高的可靠性。
在現(xiàn)實應(yīng)用中,磁盤陣列根據(jù)容量要求提前部署,然而基于歷史數(shù)據(jù)的預(yù)測無法應(yīng)對當前發(fā)展迅速的互聯(lián)網(wǎng)應(yīng)用需求。 因此,當面對資源耗盡的風(fēng)險時通常采用擴容技術(shù)[3]來滿足容量和帶寬增長的需要。 劉靖宇等[4]提出一種高效的擴容方案Cross?Scale,該方案定義了擴容閾值,根據(jù)閾值與磁盤陣列剩余空間的關(guān)系分別提出不同的擴容方法,有效提高了擴容效率。 但是,在磁盤陣列擴容的過程中,由于讀寫操作增加,更容易出現(xiàn)磁盤故障,因此擴容方法需要具備一定的容錯能力,以應(yīng)對隨時出現(xiàn)的磁盤故障。
針對以上問題,為了保證磁盤陣列中數(shù)據(jù)的完整性和安全性,本文探討了在擴容過程中的磁盤故障情況及恢復(fù)[5-6]方法。
增加了閾值條件的擴容方案Cross?Scale 基于N?Code[7]編碼而設(shè)計,該編碼是一種優(yōu)化的縱式RAID6 陣列碼,每個條帶即為一個編碼陣列,形成了(p+1)×(p-1)的數(shù)據(jù)布局,其中p為大于2 的質(zhì)數(shù)。 若用Ci,j表示位于第i行,第j列的塊,那么該編碼的校驗鏈構(gòu)造規(guī)則如下。
水平校驗鏈的構(gòu)造規(guī)則如公式(1)所示:
對角校驗鏈的構(gòu)造規(guī)則如公式(2)所示。
p=7 時N?Code 編碼陣列的校驗鏈分布方式如圖1 所示,相同字母標記的塊屬于同一校驗鏈。 可見N?Code 的數(shù)據(jù)塊分散在所有邏輯磁盤中,校驗塊分為水平和對角兩種類型,其中水平校驗塊分散存儲在中間的p-1 個磁盤中,對角校驗塊分布在兩側(cè)磁盤。
圖1 N?Code 編碼陣列的校驗鏈分布
由于N?Code 具有兩條校驗鏈,可容兩塊磁盤同時失效,所以為了不影響陣列的安全性,擴容過程中也應(yīng)及時更新校驗鏈。 Cross?Scale 擴容過程由遷移窗口Wm引導(dǎo),遷移窗口的大小由擴容前后的編碼陣列大小決定,只有處于遷移窗口中的區(qū)域才進行數(shù)據(jù)的重組。 該方案中提出了擴容閾值(capacity threshold,CT),根據(jù)CT與磁盤陣列最小剩余空間Tmin、單個磁盤的分塊數(shù)D的關(guān)系選擇不同的數(shù)據(jù)重組方案。 當0≤Tmin<CT和CT≤Tmin≤D時,分別在遷移窗口內(nèi)通過拼接寫有數(shù)據(jù)的數(shù)據(jù)行和空白數(shù)據(jù)行組成新編碼陣列,然后再進行數(shù)據(jù)遷移和校驗鏈的更新。
根據(jù)上述Cross?Scale 的實現(xiàn)思想可知,在整個磁盤陣列中,編碼陣列可分為處于遷移窗口Wm的前、中、后三種情況,如圖2 所示,其中m為原磁盤陣列中的磁盤數(shù)量,n為增加的擴容磁盤數(shù)量。 根據(jù)遷移窗口的移動方向,Wm左側(cè)為擴容之后的區(qū)域,右側(cè)為未擴容的區(qū)域,Wm中的區(qū)域正在進行數(shù)據(jù)的移動和校驗鏈的更新。
圖2 遷移窗口引導(dǎo)的擴容過程
若在一般使用過程中出現(xiàn)磁盤故障時,可以利用校驗塊和幸存的數(shù)據(jù)塊來恢復(fù)數(shù)據(jù)。 假設(shè)在圖1 中的磁盤2損壞,存儲其中的C0,2、C1,2、C2,2、C3,2、C4,2、C5,2中的數(shù)據(jù)丟失,C0,2中存儲的數(shù)據(jù)可根據(jù)水平校驗鏈重新計算得到,即C0,2=C0,1⊕C0,3⊕C0,4⊕C0,5⊕C0,6⊕C0,7;若磁盤2 和4 同時損壞,則需要同時使用水平和對角校驗鏈來恢復(fù)數(shù)據(jù),即先用對角校驗鏈恢復(fù)C4,2,即C4,2=C2,0⊕C3,1⊕C5,3⊕C0,5⊕C1,6⊕C2,7,再用水平校驗鏈恢復(fù)C4,4,即C4,4=C4,0⊕C4,1⊕C4,2⊕C4,3⊕C4,5⊕C4,6,以此類推。
而對于擴容過程中的磁盤故障處理,遷移窗口之前的編碼陣列已經(jīng)完成了數(shù)據(jù)遷移和校驗鏈的更新,可以按照新的校驗鏈及公式(1)和(2)恢復(fù)數(shù)據(jù);遷移窗口之后的區(qū)域還未遷移數(shù)據(jù),則按照擴容前的校驗鏈恢復(fù)數(shù)據(jù);而對于遷移窗口中的編碼陣列,情況較為復(fù)雜,需要解決的問題可歸納為:單盤故障或是雙盤故障;故障盤為數(shù)據(jù)盤或是校驗盤;故障盤中的數(shù)據(jù)是否需要遷移;需要遷移的數(shù)據(jù)是否已經(jīng)寫入。 下面針對遷移窗口中的磁盤故障情況及恢復(fù)方法分別進行分析。
(1)當0≤Tmin<CT時,由于剩余空間不足,采用了拼接寫有數(shù)據(jù)的相鄰條帶進行擴容,首先考慮磁盤陣列中出現(xiàn)單盤故障的情況,該故障盤的位置存在兩種情況:①故障盤的盤號處于1 ~m+n-2 之間。 在該情況下,根據(jù)N?Code 的數(shù)據(jù)布局規(guī)則可知,故障盤只存儲數(shù)據(jù)塊和水平校驗塊。 而在擴容過程中,雖然進行了數(shù)據(jù)的遷移,但是數(shù)據(jù)的移動限制在同一水平校驗鏈中,水平校驗值可保持不變,所以可以通過水平校驗鏈的降級模式來恢復(fù)數(shù)據(jù)塊;如果丟失的是水平校驗值,則根據(jù)校驗鏈中的數(shù)據(jù)重新計算校驗值即可。 若故障盤包含了在擴容過程中需要遷移的數(shù)據(jù),則將恢復(fù)后的數(shù)據(jù)直接寫入遷移的目標位置,以此減少數(shù)據(jù)塊的讀寫次數(shù)。 ②故障盤的盤號為0 或m+n-1。 在該情況下,故障盤中同時存儲了數(shù)據(jù)塊和對角校驗塊,根據(jù)擴容過程中的數(shù)據(jù)遷移的規(guī)則可知,該故障盤中不包含需要遷移的數(shù)據(jù)。 若遷移窗口中的編碼陣列正在遷移數(shù)據(jù),可等待遷移完成后再進行數(shù)據(jù)重構(gòu),以此來減少校驗值的重復(fù)更新。 重構(gòu)時可根據(jù)水平校驗鏈恢復(fù)故障盤中的數(shù)據(jù)塊,通過對角校驗鏈更新所有對角校驗值。
若遷移窗口中的編碼陣列已經(jīng)完成校驗更新而發(fā)生磁盤故障,則有兩種數(shù)據(jù)重構(gòu)方式:可利用全部對角校驗鏈進行數(shù)據(jù)重構(gòu),也可以采用水平和對角校驗鏈結(jié)合的方式進行數(shù)據(jù)重構(gòu),其中,數(shù)據(jù)塊用水平校驗鏈恢復(fù),校驗塊用對角校驗鏈恢復(fù)。 如圖3 所示為由6 塊擴容至8 塊磁盤的過程,數(shù)據(jù)遷移已完成,其中P 和Q 標記的塊分別表示根據(jù)不同校驗鏈產(chǎn)生的校驗塊,第2、3 數(shù)據(jù)行為拼接的數(shù)據(jù)行,其中磁盤0 失效。 圖3(a)中的編碼陣列僅利用對角校驗鏈恢復(fù)數(shù)據(jù),只需讀出由綠色標記的24 個塊;而在圖3(b)的編碼陣列中,采用水平和對角校驗鏈結(jié)合的方式恢復(fù)數(shù)據(jù),由于一部分需要讀出的數(shù)據(jù)塊為水平校驗鏈和對角校驗鏈的公共塊,已經(jīng)在恢復(fù)數(shù)據(jù)塊時讀出,所以只需讀出18 個塊,可以有效減少數(shù)據(jù)塊的讀寫操作,因此采用水平和對角校驗鏈結(jié)合的方式進行數(shù)據(jù)重構(gòu)為佳。
圖3 磁盤的數(shù)據(jù)重構(gòu)
(2)當CT≤Tmin≤D時,剩余空間充足,兩種數(shù)據(jù)行拼接方式均可行。 若采用相鄰條帶拼接的方式,則與0≤Tmin<CT時故障處理的過程相同。 下面對空白數(shù)據(jù)行拼接時的情況進行分析。 若磁盤陣列中出現(xiàn)單盤故障,該故障盤的位置同樣存在兩種情況:①故障盤的盤號處于1 ~m+n-2 之間。 在該情況下,遷移窗口為一個編碼陣列的大小,若該故障盤已經(jīng)完成遷移或者無需遷移數(shù)據(jù),則不影響遷移窗口內(nèi)后續(xù)的遷移操作。 待本輪數(shù)據(jù)遷移完成后,用新的磁盤陣列編碼進行數(shù)據(jù)重構(gòu)即可。 若該磁盤在遷移窗口內(nèi)包含正在遷入或遷出的數(shù)據(jù),則待數(shù)據(jù)遷移完成后,利用讀入緩存的數(shù)據(jù),結(jié)合水平和對角校驗鏈進行恢復(fù),減少數(shù)據(jù)塊讀取的數(shù)量,提高重構(gòu)速度。 ②故障盤的盤號為0 或m+n-1。 在該情況下,故障盤中的數(shù)據(jù)塊并沒有劃分在遷移區(qū)域中,因此不影響后續(xù)的數(shù)據(jù)遷移過程。 可待窗口內(nèi)遷移區(qū)域中的數(shù)據(jù)移動后,將擴容進程掛起,按照新的編碼陣列進行數(shù)據(jù)重構(gòu)。
(1)當0≤Tmin<CT時,仍然采用了拼接寫有數(shù)據(jù)的相鄰條帶進行擴容。 雖然在擴容過程中數(shù)據(jù)水平移動而保留了原水平校驗值,但是由于拆分了部分條帶,導(dǎo)致部分對角校驗值暫時失效,無法參與數(shù)據(jù)恢復(fù)。 所以在此條件下出現(xiàn)雙盤故障時,以減少遷移窗口內(nèi)的數(shù)據(jù)損失為目標進行,此時故障盤可能出現(xiàn)的位置有以下三種情況:①故障盤的盤號分別為0 和m+n-1。 在該情況下,兩塊故障盤中包含所有的對角校驗值和部分數(shù)據(jù)塊,均不包括需要遷移的數(shù)據(jù)塊,不影響該區(qū)域的數(shù)據(jù)遷移過程。 此時雖然有兩塊故障盤,但是每條水平校驗鏈中只損壞或丟失了一個數(shù)據(jù),因此所有的數(shù)據(jù)塊可以根據(jù)水平校驗鏈進行重構(gòu)。 而對于對角校驗鏈,可以等待遷移區(qū)域內(nèi)的數(shù)據(jù)塊移動后再重新計算,以此減少校驗值的更新次數(shù)。 ②故障盤的盤號均位于1~m+n-2 之間。 在該情況下,故障盤中只包含數(shù)據(jù)塊和水平校驗塊,將已讀入緩存中的數(shù)據(jù)寫入目標位置后,需結(jié)合水平校驗和對角校驗實現(xiàn)重構(gòu)。 由于加入了擴容磁盤和遷移數(shù)據(jù)的緣故,磁盤陣列中存在一些空白塊,若故障盤在損壞前包含空白塊,可減少數(shù)據(jù)損失,通過水平校驗鏈即可重構(gòu)位于同一數(shù)據(jù)行中的數(shù)據(jù)塊或校驗塊。 ③故障盤的盤號一個為0 或m+n-1,另一個位于1~m+n-2 之間。 在該情況下,盤號為0 或m+n-1 的故障盤包含對角校驗塊和數(shù)據(jù)塊,盤號位于1 ~m+n-2 之間的故障盤包含水平校驗塊和數(shù)據(jù)塊。 此時,與損壞對角校驗塊位于同一數(shù)據(jù)行中的數(shù)據(jù)塊是水平校驗鏈中唯一損壞的數(shù)據(jù)塊,因此可以通過水平校驗鏈進行重構(gòu)。 若位于1~m+n-2 之間的故障盤為擴容磁盤或者包含數(shù)據(jù)遷移區(qū)域,則可以重構(gòu)與空白塊位于同一行的數(shù)據(jù)塊或校驗塊。
(2)當CT≤Tmin≤D時,若采用相鄰條帶拼接的方式,則與0≤Tmin<CT時故障處理的過程相同,下面分析空白數(shù)據(jù)行拼接時的情況,此時故障盤出現(xiàn)的位置同樣有以下三種情況:①故障盤的盤號分別為0 和m+n-1。 在該情況下,故障盤在遷移窗口中沒有需要移動的數(shù)據(jù),因此不影響后續(xù)的數(shù)據(jù)遷移。 待窗口中數(shù)據(jù)遷移完成后,根據(jù)擴容后的編碼陣列進行數(shù)據(jù)重構(gòu)。 ②故障盤的盤號均位于1~m+n-2 之間。 在該情況下,若故障盤均已完成數(shù)據(jù)遷移,則待遷移窗口中其他數(shù)據(jù)移動后,再根據(jù)擴容后的編碼陣列重構(gòu)數(shù)據(jù)。 若故障盤均處于數(shù)據(jù)遷移的過程中,且已將需要遷移的數(shù)據(jù)讀出或者故障盤正處于等待數(shù)據(jù)遷入的狀態(tài),則不影響窗口中的遷移過程,待數(shù)據(jù)遷移后,根據(jù)擴容后的編碼陣列重構(gòu)數(shù)據(jù);若未及時將需要遷移的數(shù)據(jù)讀出,則將窗口內(nèi)已經(jīng)遷移的數(shù)據(jù)移回原始位置,回退到擴容前的狀態(tài),按照擴容前的編碼陣列重構(gòu)數(shù)據(jù)。 若故障盤之一處于已完成遷移的狀態(tài),另一故障盤處于遷移進程中,且已經(jīng)將需要遷移的數(shù)據(jù)讀出或故障盤正處于等待數(shù)據(jù)遷入的狀態(tài),則不影響窗口中的遷移進程,待數(shù)據(jù)遷移完成后,根據(jù)擴容后的編碼陣列重構(gòu)數(shù)據(jù);若未將遷移數(shù)據(jù)讀出,且故障盤包含空白塊,則可以通過水平校驗鏈重構(gòu)位于同一數(shù)據(jù)行中的數(shù)據(jù)塊或校驗塊。 ③故障盤的盤號一個為0 或m+n-1,另一個處于1~m+n-2 之間。 在該情況下,故障盤之一位于遷移窗口內(nèi)的區(qū)域不需移動數(shù)據(jù),另一塊故障盤正在遷移數(shù)據(jù),或已經(jīng)完成數(shù)據(jù)遷移。與對角校驗值處于同一數(shù)據(jù)行的數(shù)據(jù)可以由水平校驗鏈重構(gòu),對于其他損壞或丟失的數(shù)據(jù),若該故障盤已經(jīng)完成數(shù)據(jù)遷移,待窗口中其他數(shù)據(jù)移動后,再根據(jù)擴容后的編碼陣列重構(gòu)數(shù)據(jù)。 若該故障盤正在遷移數(shù)據(jù),且已經(jīng)將該盤內(nèi)需要遷移的數(shù)據(jù)讀入緩存或該盤僅在等待數(shù)據(jù)遷入,則待窗口內(nèi)的數(shù)據(jù)遷移完成后,按照擴容后的編碼陣列重構(gòu)數(shù)據(jù);如未將故障盤內(nèi)需要遷移的數(shù)據(jù)讀入緩存,則將窗口內(nèi)已經(jīng)遷移的數(shù)據(jù)移回原始位置,回退到擴容前的狀態(tài),按照擴容前的編碼陣列進行數(shù)據(jù)重構(gòu)。
綜上所述,針對磁盤陣列擴容過程中數(shù)據(jù)讀寫增多,故障概率增大的問題,本文基于設(shè)有擴容閾值的Cross?Scale 擴容方案,分析了不同磁盤陣列條件下的故障情況,并分別針對單盤和雙盤故障,在不同的故障位置,故障盤中存儲不同數(shù)據(jù)類型,及不同擴容階段設(shè)計了數(shù)據(jù)恢復(fù)方法,保障了擴容過程中的數(shù)據(jù)安全性與完整性,且保留了原編碼的容錯能力。 本文方法是擴容技術(shù)的進一步優(yōu)化,未來會在此基礎(chǔ)上結(jié)合新型存儲介質(zhì)繼續(xù)開展研究。