一種基于磁盤讀錯誤類別讀取磁盤數(shù)據(jù)的方法和裝置制造方法
【專利摘要】本發(fā)明提供的基于磁盤讀錯誤類別讀取磁盤數(shù)據(jù)的方法在陣列執(zhí)行讀業(yè)務(wù)過程中、陣列同步過程中、陣列重建過程中產(chǎn)生的讀錯誤類型進行區(qū)分,然后在進行后續(xù)業(yè)務(wù)的讀IO時,根據(jù)不同的讀錯誤類型讀取或者不讀取對應(yīng)的數(shù)據(jù),以最大限度地保證讀取數(shù)據(jù)的完整性與正確性,最大范圍的減小對陣列的影響。
【專利說明】一種基于磁盤讀錯誤類別讀取磁盤數(shù)據(jù)的方法和裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及RAID陣列【技術(shù)領(lǐng)域】,尤其涉及一種基于磁盤讀錯誤類別讀取磁盤數(shù)據(jù)的方法和裝置。
【背景技術(shù)】
[0002]在數(shù)據(jù)存儲的過程中,當(dāng)丟失一塊或多塊磁盤時,冗余陣列將根據(jù)不同的陣列類型提供完整的數(shù)據(jù)。對于RAID5,可以允許丟失一塊磁盤;對于RAID6,可以允許丟失兩塊磁盤;對于RAID10,每個鏡像對可以允許丟失一塊磁盤等。對于RAID5,在丟失一塊磁盤的情況下,其它磁盤上又記錄了讀錯誤,或者在磁盤個數(shù)完整的情況下,一個條帶上記錄多個讀錯誤,在這種情況下很難讀取完整的數(shù)據(jù)。對于錄像監(jiān)控數(shù)據(jù),如果錄像索引沒有落在這些出問題的條帶上,影響的范圍很有限;但是如果錄像索引落在了這些出問題的條帶上,并且沒有對錄像索引進行備份,那么影響的范圍就比較大。對于文件系統(tǒng),如果文件系統(tǒng)需要的數(shù)據(jù)無法讀取成功,那么會影響整個文件系統(tǒng)的運行,甚至對文件系統(tǒng)會造成嚴(yán)重的破壞。在碰到上述存在的讀錯誤的情況下,如何最大范圍的減小對陣列的影響是當(dāng)前需要解決的問題。
【發(fā)明內(nèi)容】
[0003]有鑒于此,本發(fā)明提供一種基于磁盤讀錯誤類別讀取磁盤數(shù)據(jù)的方法和裝置。
[0004]該方法應(yīng)用于RAID陣列,包括:在業(yè)務(wù)讀過程中,如果產(chǎn)生的讀錯誤,將對應(yīng)磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作。
[0005]或者,在陣列同步過程中,如果在預(yù)讀階段產(chǎn)生兩個或者兩個以上讀錯誤時,將其中一個讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤,將剩余的讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊分別標(biāo)記第一類別讀錯誤,或者將所有讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊分別標(biāo)記第一類別讀錯誤,且將校驗盤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊時,則不讀取該磁盤數(shù)據(jù)塊的數(shù)據(jù)。
[0006]或者,在陣列同步過程中,如果在預(yù)讀階段產(chǎn)生一個讀錯誤時,將該讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤,如果轉(zhuǎn)讀校驗盤數(shù)據(jù)塊進行修復(fù)時對該校驗盤數(shù)據(jù)塊讀取錯誤,則將該校驗盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤。
[0007]或者,在陣列重建過程中,如果讀磁盤數(shù)據(jù)塊時產(chǎn)生讀錯誤,則將所述讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤,將重建盤上對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊時,則不讀取該磁盤數(shù)據(jù)塊的數(shù)據(jù)。
[0008]優(yōu)選地,對于標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊,如果滿數(shù)據(jù)塊讀取成功,則清除第一類別讀錯誤標(biāo)識;對于標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊,如果有新的數(shù)據(jù)寫入該磁盤數(shù)據(jù)塊且滿數(shù)據(jù)塊寫成功時,則清除該第二類別讀錯誤標(biāo)識。
[0009]一種基于磁盤讀錯誤類別讀取磁盤數(shù)據(jù)的裝置,該裝置應(yīng)用于RAID陣列,該裝置包括:讀錯誤標(biāo)識模塊,用于在業(yè)務(wù)讀過程中,如果產(chǎn)生的讀錯誤,將對應(yīng)磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤;讀1執(zhí)行模塊,用于當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作。
[0010]或者,讀錯誤標(biāo)識模塊,用于在陣列同步過程中,如果在預(yù)讀階段產(chǎn)生兩個或者兩個以上讀錯誤時,將其中一個讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤,將剩余的讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊分別標(biāo)記第一類別讀錯誤,或者將所有讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊分別標(biāo)記第一類別讀錯誤,且將校驗盤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤;讀1執(zhí)行模塊,用于當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊時,則不讀取該磁盤數(shù)據(jù)塊的數(shù)據(jù)。
[0011]或者,所述讀錯誤標(biāo)識模塊,還用于在陣列同步過程中,如果在預(yù)讀階段產(chǎn)生一個讀錯誤時,將該讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤,如果轉(zhuǎn)讀校驗盤數(shù)據(jù)塊進行修復(fù)時對該校驗盤數(shù)據(jù)塊讀取錯誤,則將該校驗盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤。
[0012]或者,讀錯誤標(biāo)識模塊,用于在陣列重建過程中,如果讀磁盤數(shù)據(jù)塊時產(chǎn)生讀錯誤,則將所述讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤,將重建盤上對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤;讀1執(zhí)行模塊,用于當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊時,則不讀取該磁盤數(shù)據(jù)塊的數(shù)據(jù)。
[0013]優(yōu)選地,所述裝置還包括讀錯誤標(biāo)記清除模塊;對于標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊,如果滿數(shù)據(jù)塊讀取成功,則讀錯誤標(biāo)記清除模塊清除第一類別讀錯誤標(biāo)識;對于標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊,如果有新的數(shù)據(jù)寫入該磁盤數(shù)據(jù)塊且滿數(shù)據(jù)塊寫成功時,則讀錯誤標(biāo)記清除模塊清除該第二類別讀錯誤標(biāo)識。
[0014]相較于現(xiàn)有技術(shù),本發(fā)明技術(shù)方案最大限度地保證讀取數(shù)據(jù)的完整性與正確性,最大范圍的減小對陣列的影響。
【專利附圖】
【附圖說明】
[0015]圖1是現(xiàn)有的一個RAID陣列示意圖。
[0016]圖2是本發(fā)明實施例一種涉及讀錯誤處理方式的陣列同步流程。
[0017]圖3a、圖3b是本發(fā)明實施例具有不同類別讀錯誤的RAID陣列示意圖。
[0018]圖4是本發(fā)明實施例一種涉及讀錯誤處理方式的陣列重建流程。
[0019]圖5是本發(fā)明實施例重建后的具有不同類別讀錯誤的RAID陣列示意圖。
[0020]圖6是本發(fā)明實施例缺盤且具有讀錯誤標(biāo)識的RAID陣列示意圖。
[0021 ]圖7是本發(fā)明實施例裝置邏輯結(jié)構(gòu)圖。
【具體實施方式】
[0022]本發(fā)明方案針對陣列執(zhí)行讀業(yè)務(wù)過程中、陣列同步過程中、陣列重建過程中產(chǎn)生的讀錯誤類型進行區(qū)分,然后在進行后續(xù)業(yè)務(wù)的讀1時,根據(jù)不同的讀錯誤類型讀取或者不讀取對應(yīng)的數(shù)據(jù),以最大限度地保證讀取數(shù)據(jù)的完整性與正確性,最大范圍的減小對陣列的影響。以下通過具體實施例詳細說明。
[0023]一、讀業(yè)務(wù)過程
[0024]在業(yè)務(wù)讀過程中,如果產(chǎn)生的讀錯誤,將對應(yīng)磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作。
[0025]下面舉個例子進行說明。請參圖1給出的一個RAID陣列,該RAID陣列包括Dl?D5五個數(shù)據(jù)盤和一個校驗盤P盤。該陣列存儲了視頻監(jiān)控數(shù)據(jù);如果用戶想要回放一段監(jiān)控錄像,則上層會下發(fā)讀1到對應(yīng)的磁盤,在這個業(yè)務(wù)讀過程中,如果讀到數(shù)據(jù)盤Dl上的某一個磁盤數(shù)據(jù)塊出現(xiàn)錯誤時,則對該磁盤數(shù)據(jù)塊標(biāo)記read_error,如果Dl、D2等磁盤上的數(shù)據(jù)塊均發(fā)生讀錯誤,則對這些磁盤數(shù)據(jù)塊均標(biāo)記read_error。當(dāng)一個數(shù)據(jù)盤讀失敗促使利用P盤進行修復(fù)時,如果讀P盤時也出現(xiàn)讀錯誤,則對P盤對應(yīng)數(shù)據(jù)塊標(biāo)記read_error。
[0026]后續(xù),用戶又一次回放這段監(jiān)控錄像,在這次的業(yè)務(wù)讀過程中,當(dāng)待讀取的磁盤數(shù)據(jù)塊是標(biāo)記有reacLerror的數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀取。因為前一次讀取發(fā)生錯誤,很有可能并不是真正的介質(zhì)問題,比如說是因為鏈路問題導(dǎo)致的讀錯誤等,再一次讀取的時候就有可能讀取成功,所以可以繼續(xù)對標(biāo)記有reacLeiror的磁盤數(shù)據(jù)塊進行數(shù)據(jù)的讀取。如果本次對標(biāo)記有read_error的磁盤數(shù)據(jù)塊滿數(shù)據(jù)讀取成功的話,則清除read_error標(biāo)記。
[0027]二、陣列同步過程
[0028]在陣列同步過程中,如果在預(yù)讀階段產(chǎn)生兩個或者兩個以上讀錯誤時,可以采用以下兩種方式中的任一種方式進行讀錯誤類別標(biāo)記:1)將其中一個讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤,將剩余的讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊分別標(biāo)記第一類別讀錯誤;2)將所有讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊分別標(biāo)記第一類別讀錯誤,且將校驗盤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤。
[0029]如果在預(yù)讀階段產(chǎn)生一個讀錯誤時,將該讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤,如果轉(zhuǎn)讀校驗盤數(shù)據(jù)塊進行修復(fù)時對該校驗盤數(shù)據(jù)塊讀取錯誤,則將該校驗盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤。當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊時,則不讀取該磁盤數(shù)據(jù)塊的數(shù)據(jù)。
[0030]陣列創(chuàng)建后,一般情況下需要進行同步。同步的原理,簡言之:讀數(shù)據(jù)盤條塊數(shù)據(jù)進行異或后寫P盤。請參圖2所示的陣列同步流程,該流程涉及了讀錯誤時的處理方式。
[0031]S201、判斷是否同步完所有條帶或者是否出現(xiàn)同步異常而導(dǎo)致的中止,如果是,執(zhí)行步驟S202,否則執(zhí)行步驟S203。
[0032]S202、同步結(jié)束。
[0033]S203、獲取下一個(組)條帶進行同步。
[0034]S204、判斷預(yù)讀是否成功,如果是,則執(zhí)行步驟S207,否則執(zhí)行步驟S205。
[0035]S205、判斷預(yù)讀階段是否存在兩個或者兩個以上讀錯誤,如果是,則執(zhí)行步驟S206,否則執(zhí)行步驟S208。
[0036]S206、將其中一個讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記failed_read_error,將其余讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊分別標(biāo)記reacLerror ;或者將所有讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記為read_error,且將校驗盤對應(yīng)的數(shù)據(jù)塊標(biāo)記為failed_read_error。
[0037]S207、對預(yù)讀成功的所有數(shù)據(jù)盤數(shù)據(jù)執(zhí)行異或計算后寫校驗盤P盤;返回步驟S201。
[0038]S208、將該讀錯誤的磁盤數(shù)據(jù)塊標(biāo)記read_error ;且讀取P盤數(shù)據(jù)。
[0039]S209、判斷P盤數(shù)據(jù)是否讀取成功,如果是,執(zhí)行步驟S211,否則執(zhí)行步驟S210。
[0040]S210、將P盤數(shù)據(jù)塊標(biāo)記為failed_read_error,返回步驟201。
[0041]S211、將讀取成功的所有數(shù)據(jù)盤數(shù)據(jù)和P盤數(shù)據(jù)進行異或后寫讀錯誤的磁盤數(shù)據(jù)塊,寫成功后清除該磁盤數(shù)據(jù)塊的read_error標(biāo)記;返回S201。
[0042]以下通過一個例子來說明同步過程中如何進行讀錯誤類別的標(biāo)記。以圖3a為例,假設(shè)對圖3a中的一個條帶η進行同步時,在預(yù)讀階段,即讀取數(shù)據(jù)盤上條塊數(shù)據(jù)的時候,D1、D2和D4相應(yīng)條塊Dln、D2n和D4n的數(shù)據(jù)均出現(xiàn)了讀錯誤的情況,此時有兩種方式進行讀錯誤類別的標(biāo)記:一種方式為將Din、D2n和D4n中的任一數(shù)據(jù)塊標(biāo)記為failed_read_error,其余兩個數(shù)據(jù)塊標(biāo)記為read_error ;另一種方式為將Dln、D2n、D4n均標(biāo)記為read_error,將P盤的數(shù)據(jù)塊Pn標(biāo)記為failed_read_error。
[0043]在同步過程中,有的讀錯誤標(biāo)記為read_error,有的讀錯誤標(biāo)記為faild_read_error ;這是為了指導(dǎo)后續(xù)業(yè)務(wù)的讀1是否執(zhí)行讀取操作。如果讀1所需讀取的磁盤數(shù)據(jù)塊是標(biāo)記有reacLerror的,則可以執(zhí)行讀取操作,如果讀1所需讀取的磁盤數(shù)據(jù)塊是標(biāo)記有faild_read_error的,則該磁盤數(shù)據(jù)塊上的數(shù)據(jù)不能被讀取。標(biāo)記read_error的磁盤數(shù)據(jù)塊上的數(shù)據(jù)是有效的數(shù)據(jù),而標(biāo)記faild_read_eiT0r的磁盤數(shù)據(jù)塊上的數(shù)據(jù)是無效的數(shù)據(jù),無法保證其正確性。
[0044]以下通過一個具體的例子來說明后續(xù)業(yè)務(wù)的讀1針對不同類型的讀錯誤所執(zhí)行的操作。需要說明的是,本發(fā)明中的后續(xù)業(yè)務(wù)的讀1不限于應(yīng)用層下發(fā)讀業(yè)務(wù)請求涉及的讀10,其他如寫業(yè)務(wù)過程中涉及的讀1等也屬于該范疇。請參圖3b,圖3b是完成同步的陣列。如圖所示,該陣列在同步的過程中,D2的數(shù)據(jù)塊D2m標(biāo)記有read_error ;同條帶的P盤數(shù)據(jù)塊Pm標(biāo)記有faild_read_erro;r。在執(zhí)行隨機寫業(yè)務(wù)(非滿條帶寫)時,如果寫命令需要將數(shù)據(jù)寫入D2的數(shù)據(jù)塊D2m時,按照現(xiàn)有的寫方式將采用讀修改寫RMW算法執(zhí)行,即需要讀取D2的數(shù)據(jù)塊D2m和P盤數(shù)據(jù)塊Pm上的數(shù)據(jù),且將讀出的這兩個數(shù)據(jù)塊上的數(shù)據(jù)與待寫的數(shù)據(jù)進行異或后寫P盤數(shù)據(jù)塊,再將待寫的數(shù)據(jù)寫入D2m。對于D2數(shù)據(jù)塊D2m上的數(shù)據(jù),由于其標(biāo)記有read_error,則可以進行讀取,如果讀取成功,則清除read_error標(biāo)記,當(dāng)然這里的讀取成功是指滿數(shù)據(jù)塊讀取成功;而對于P盤數(shù)據(jù)塊Pm上的數(shù)據(jù),由于其標(biāo)記有faild_read_error,則禁止讀??;此時可以進一步讀取Dl、D3、D4、D5上對應(yīng)條塊的數(shù)據(jù),并對Dl?D5這五個條塊數(shù)據(jù)進行異或后寫P盤對應(yīng)條塊,如果寫成功,則清除P盤數(shù)據(jù)塊Pm上的faild_read_error標(biāo)記,當(dāng)然這里的寫成功也是指滿數(shù)據(jù)塊寫成功。對于待寫的數(shù)據(jù),寫入D2的數(shù)據(jù)塊D2m,寫成功后向上層返回成功。此時條帶上的數(shù)據(jù)具有一致性,清除的讀錯誤標(biāo)記不影響數(shù)據(jù)的準(zhǔn)確性。
[0045]三、陣列重建過程
[0046]在陣列重建過程中,如果讀磁盤數(shù)據(jù)塊時產(chǎn)生讀錯誤,則將所述讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤,將重建盤上對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊時,則不讀取該磁盤數(shù)據(jù)塊的數(shù)據(jù)。
[0047]業(yè)務(wù)寫冗余陣列條帶后,條帶具有數(shù)據(jù)一致性,此時當(dāng)丟失任意一塊磁盤時,都可以通過其它磁盤計算出丟失磁盤上的數(shù)據(jù)。圖4給出了重建流程,并且給出重建過程中出現(xiàn)讀錯誤時的處理方式。
[0048]請參圖4,RAID中的一塊磁盤離線被踢,觸發(fā)申請熱備進行重建,執(zhí)行下述步驟:
[0049]S401、判斷所有條帶是否都重建完成,如果是,執(zhí)行步驟S402,否則執(zhí)行步驟S403。
[0050]S402、將重建盤交換為數(shù)據(jù)盤加入陣列中,重建完成。
[0051]S403、判斷磁盤是否離線,如果是,執(zhí)行步驟404,否則執(zhí)行步驟405。
[0052]S404、重建中止,根據(jù)設(shè)定的處理決定何時再開始重建。
[0053]S405、獲取下一個(組)條帶進行重建。
[0054]S406、判斷所有數(shù)據(jù)盤和校驗盤的數(shù)據(jù)塊是否預(yù)讀成功,如果是,執(zhí)行步驟S407,否則執(zhí)行步驟S408。
[0055]S407、對所有讀取成功的數(shù)據(jù)塊執(zhí)行異或計算后寫重建盤,返回步驟S401。
[0056]S408、對沒有讀取成功的數(shù)據(jù)盤和校驗盤上的數(shù)據(jù)塊標(biāo)記read_error ;對重建盤上的數(shù)據(jù)塊標(biāo)記failed_read_error ;返回步驟S401。
[0057]由于重建完成后,重建盤會變?yōu)閿?shù)據(jù)盤加入陣列中,此時重建盤上標(biāo)記有failed_read_error的數(shù)據(jù)塊用來提示對應(yīng)的數(shù)據(jù)是無效的;而其他標(biāo)記有read_error的數(shù)據(jù)塊則僅表示數(shù)據(jù)讀的時候出現(xiàn)了錯誤,而數(shù)據(jù)則是有效的。所以后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是標(biāo)記有reacLerror的,則執(zhí)行對該數(shù)據(jù)塊的讀操作;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是標(biāo)記有failed_read_error標(biāo)識的,則禁止讀取該磁盤數(shù)據(jù)塊的數(shù)據(jù)。
[0058]以下通過一個具體的例子來說明后續(xù)業(yè)務(wù)的讀1針對不同類型的讀錯誤所執(zhí)行的操作。請參圖5,RAID陣列中的數(shù)據(jù)盤D5離線被踢,在重建完成后,D5’加入到了陣列中。但是其中的一個條帶上有兩個數(shù)據(jù)塊分別記錄了 read_error標(biāo)識和failed_read_error:磁盤Dl的一個條塊記錄了 read_error ;重建盤D5’的一個條塊記錄了 failed_reacLeiror,見圖5。若應(yīng)用層下發(fā)了讀業(yè)務(wù)的請求,且該讀業(yè)務(wù)所需讀取的數(shù)據(jù)恰好包括圖5中所標(biāo)示的那個條帶(stripe)。由于Dl上的數(shù)據(jù)塊記錄有read_error標(biāo)識,所以可以直接讀取,如果滿數(shù)據(jù)塊讀取成功,可以將該read_error標(biāo)識清除;而D5’上的數(shù)據(jù)塊記錄有failed_read_error,所以不可以直接讀取。要想獲得D5’上的準(zhǔn)確的數(shù)據(jù),此時可以將本條帶上讀出的Dl、D2、D3、D4進行異或計算得到D5’的數(shù)據(jù)。這樣讀業(yè)務(wù)涉及該條帶的操作就成功完成了。另外,異或計算得到的D5’的數(shù)據(jù)寫到D5’上,如果寫成功,即滿數(shù)據(jù)塊寫成功,則清除其上的failed_read_error標(biāo)識,此時該條帶上的數(shù)據(jù)具有一致性。
[0059]請結(jié)合圖6,在缺一個數(shù)據(jù)盤的情況下,且其他數(shù)據(jù)盤記錄有read_error讀錯誤時,存在業(yè)務(wù)寫需求的處理方式。
[0060]數(shù)據(jù)盤Dl的一個數(shù)據(jù)塊上具有reacLerror讀錯誤標(biāo)識,數(shù)據(jù)盤D5已被陣列踢出或者處于離線狀態(tài);此時如果有數(shù)據(jù)d5’需要寫到和標(biāo)識有reacLeiror數(shù)據(jù)塊同條帶的D5盤上,則讀取Dl (在Dl滿數(shù)據(jù)塊讀取成功后,清除對應(yīng)數(shù)據(jù)塊上標(biāo)記的讀錯誤reacLeiror標(biāo)識)、D2、D3、D4對應(yīng)數(shù)據(jù)塊上的數(shù)據(jù),然后與d5’進行異或得出的數(shù)據(jù)寫P盤對應(yīng)的數(shù)據(jù)塊。由于磁盤D5離線(或者已被陣列踢出,或者處于下線狀態(tài)),若磁盤D5已被踢出陣列,則寫完P(guān)盤后,整個命令完成;若磁盤D5屬于臨時下線,則需要記錄局部重建記錄,然后待磁盤在有效時間內(nèi)上線后,完成局部重建。
[0061]如果此時有數(shù)據(jù)dl’寫磁盤Dl標(biāo)識有read_error的數(shù)據(jù)塊,那么采用RMW算法,先讀取Dl (Dl滿數(shù)據(jù)塊讀取成功后,清除對應(yīng)數(shù)據(jù)塊上標(biāo)記的讀錯誤read_error)、P對應(yīng)數(shù)據(jù)塊上的數(shù)據(jù),然后通過Dl與P進行異或,再與dl’進行異或,得出的結(jié)果寫P盤,dl’寫Dl盤。由于D5離線(或者已被陣列踢出,或者處于下線狀態(tài)),若磁盤D5已被踢出陣列,則寫完P(guān)盤和Dl盤后,整個命令完成;若磁盤D5屬于臨時下線,則需要記錄局部重建記錄,然后待磁盤在有效時間內(nèi)上線后,完成局部重建。
[0062]另外,對于寫一個標(biāo)記有兩個read_error讀錯誤的條帶的具體方法類似前文的處理方式,這里不再贅述。
[0063]以上通過詳細的流程以及具體的例子描述了具體在什么情況下標(biāo)注什么類別的讀錯誤;以及在讀錯誤進行區(qū)分標(biāo)識后,后續(xù)業(yè)務(wù)的讀1針對不同類別的讀錯誤如何處理的問題;對于標(biāo)識有read_error的讀錯誤,可以通過后續(xù)再次讀取進行修復(fù);對于fail_read_error則不能直接讀取,而要通過寫的方式進行修復(fù)。這樣就能最大限度地保證讀取數(shù)據(jù)的完整性與正確性,最大范圍的減小對陣列的影響。
[0064]基于同樣的構(gòu)思,本發(fā)明還提供了一種基于磁盤讀錯誤類別讀取磁盤數(shù)據(jù)的裝置。請參圖7所示的本發(fā)明實施例裝置邏輯結(jié)構(gòu)圖。該裝置包括:讀錯誤標(biāo)識模塊、讀1執(zhí)行模塊和讀錯誤標(biāo)記清除模塊。
[0065]讀錯誤標(biāo)識模塊,用于在業(yè)務(wù)讀過程中,如果產(chǎn)生的讀錯誤,將對應(yīng)磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤;讀1執(zhí)行模塊,用于當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作。
[0066]讀錯誤標(biāo)識模塊,用于在陣列同步過程中,如果在預(yù)讀階段產(chǎn)生兩個或者兩個以上讀錯誤時,將其中一個讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤,將剩余的讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊分別標(biāo)記第一類別讀錯誤,或者將所有讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊分別標(biāo)記第一類別讀錯誤,且將校驗盤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤;讀1執(zhí)行模塊,用于當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊時,則不讀取該磁盤數(shù)據(jù)塊的數(shù)據(jù)。所述讀錯誤標(biāo)識模塊,還用于在陣列同步過程中,如果在預(yù)讀階段產(chǎn)生一個讀錯誤時,將該讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤,如果轉(zhuǎn)讀校驗盤數(shù)據(jù)塊進行修復(fù)時對該校驗盤數(shù)據(jù)塊讀取錯誤,則將該校驗盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤。
[0067]讀錯誤標(biāo)識模塊,用于在陣列重建過程中,如果讀磁盤數(shù)據(jù)塊時產(chǎn)生讀錯誤,則將所述讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤,將重建盤上對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤;讀1執(zhí)行模塊,用于當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊時,則不讀取該磁盤數(shù)據(jù)塊的數(shù)據(jù)。
[0068]對于標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊,如果滿數(shù)據(jù)塊讀取成功,讀錯誤標(biāo)記清除模塊清除第一類別讀錯誤標(biāo)識;對于標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊,如果有新的數(shù)據(jù)寫入該磁盤數(shù)據(jù)塊且滿數(shù)據(jù)塊寫成功時,讀錯誤標(biāo)記清除模塊清除該第二類別讀錯誤標(biāo)識。
[0069]以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進等,均應(yīng)包含在本發(fā)明保護的范圍之內(nèi)。
【權(quán)利要求】
1.一種基于磁盤讀錯誤類別讀取磁盤數(shù)據(jù)的方法,該方法應(yīng)用于RAID陣列,其特征在于,該方法包括: 在業(yè)務(wù)讀過程中,如果產(chǎn)生的讀錯誤,將對應(yīng)磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤; 當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作。
2.一種基于磁盤讀錯誤類別讀取磁盤數(shù)據(jù)的方法,該方法應(yīng)用于RAID陣列,其特征在于,該方法包括: 在陣列同步過程中,如果在預(yù)讀階段產(chǎn)生兩個或者兩個以上讀錯誤時,將其中一個讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤,將剩余的讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊分別標(biāo)記第一類別讀錯誤,或者將所有讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊分別標(biāo)記第一類別讀錯誤,且將校驗盤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤; 當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊時,則不讀取該磁盤數(shù)據(jù)塊的數(shù)據(jù)。
3.如權(quán)利要求2所述的方法,其特征在于,在陣列同步過程中,如果在預(yù)讀階段產(chǎn)生一個讀錯誤時,將該讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤,如果轉(zhuǎn)讀校驗盤數(shù)據(jù)塊進行修復(fù)時對該校驗盤數(shù)據(jù)塊讀取錯誤,則將該校驗盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤。
4.一種基于磁盤讀錯誤類別讀取磁盤數(shù)據(jù)的方法,該方法應(yīng)用于RAID陣列,其特征在于,該方法包括: 在陣列重建過程中,如果讀磁盤數(shù)據(jù)塊時產(chǎn)生讀錯誤,則將所述讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤,將重建盤上對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤; 當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊時,則不讀取該磁盤數(shù)據(jù)塊的數(shù)據(jù)。
5.如權(quán)利要求1?4任一項所述的方法,其特征在于,對于標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊,如果滿數(shù)據(jù)塊讀取成功,則清除第一類別讀錯誤標(biāo)識;對于標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊,如果有新的數(shù)據(jù)寫入該磁盤數(shù)據(jù)塊且滿數(shù)據(jù)塊寫成功時,則清除該第二類別讀錯誤標(biāo)識。
6.一種基于磁盤讀錯誤類別讀取磁盤數(shù)據(jù)的裝置,該裝置應(yīng)用于RAID陣列,其特征在于,該裝置包括: 讀錯誤標(biāo)識模塊,用于在業(yè)務(wù)讀過程中,如果產(chǎn)生的讀錯誤,將對應(yīng)磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤; 讀1執(zhí)行模塊,用于當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作。
7.一種基于磁盤讀錯誤類別讀取磁盤數(shù)據(jù)的裝置,該裝置應(yīng)用于RAID陣列,其特征在于,該裝置包括: 讀錯誤標(biāo)識模塊,用于在陣列同步過程中,如果在預(yù)讀階段產(chǎn)生兩個或者兩個以上讀錯誤時,將其中一個讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤,將剩余的讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊分別標(biāo)記第一類別讀錯誤,或者將所有讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊分別標(biāo)記第一類別讀錯誤,且將校驗盤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤; 讀1執(zhí)行模塊,用于當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊時,則不讀取該磁盤數(shù)據(jù)塊的數(shù)據(jù)。
8.如權(quán)利要求7所述的裝置,其特征在于,所述讀錯誤標(biāo)識模塊,還用于在陣列同步過程中,如果在預(yù)讀階段產(chǎn)生一個讀錯誤時,將該讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤,如果轉(zhuǎn)讀校驗盤數(shù)據(jù)塊進行修復(fù)時對該校驗盤數(shù)據(jù)塊讀取錯誤,則將該校驗盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤。
9.一種基于磁盤讀錯誤類別讀取磁盤數(shù)據(jù)的裝置,該裝置應(yīng)用于RAID陣列,其特征在于,該裝置包括: 讀錯誤標(biāo)識模塊,用于在陣列重建過程中,如果讀磁盤數(shù)據(jù)塊時產(chǎn)生讀錯誤,則將所述讀錯誤對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第一類別讀錯誤,將重建盤上對應(yīng)的磁盤數(shù)據(jù)塊標(biāo)記第二類別讀錯誤; 讀1執(zhí)行模塊,用于當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊時,執(zhí)行對該磁盤數(shù)據(jù)塊的讀操作;當(dāng)后續(xù)業(yè)務(wù)的讀1所需讀取的數(shù)據(jù)塊是所述標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊時,則不讀取該磁盤數(shù)據(jù)塊的數(shù)據(jù)。
10.如權(quán)利要求6?9任一項所述的裝置,其特征在于,所述裝置還包括讀錯誤標(biāo)記清除模塊;對于標(biāo)記有第一類別讀錯誤的磁盤數(shù)據(jù)塊,如果滿數(shù)據(jù)塊讀取成功,則讀錯誤標(biāo)記清除模塊清除第一類別讀錯誤標(biāo)識;對于標(biāo)記有第二類別讀錯誤的磁盤數(shù)據(jù)塊,如果有新的數(shù)據(jù)寫入該磁盤數(shù)據(jù)塊且滿數(shù)據(jù)塊寫成功時,則讀錯誤標(biāo)記清除模塊清除該第二類別讀錯誤標(biāo)識。
【文檔編號】G06F11/07GK104268028SQ201410488434
【公開日】2015年1月7日 申請日期:2014年9月22日 優(yōu)先權(quán)日:2014年9月22日
【發(fā)明者】郭永強, 王麗紅, 羅亞山 申請人:浙江宇視科技有限公司