專利名稱:一種Raid5陣列讀IO失敗的修復(fù)方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及存儲陣列技術(shù),尤其涉及Raid 5陣列讀IO失敗的修復(fù)方法和裝置。
技術(shù)背景
傳統(tǒng)的RAID5陣列在降級模式(陣列的單個磁盤損壞)下,由于條帶不再具有數(shù)據(jù)冗余保護的能力,磁盤讀錯誤的容錯機制較弱,因而會出現(xiàn)如下問題如果在陣列重建過程中,重建流程對某個磁盤發(fā)生讀錯誤、或者外部獲取存儲數(shù)據(jù)的業(yè)務(wù)對磁盤發(fā)生讀錯誤,會造成磁盤從陣列中踢出、重建中止、陣列不可用等問題;如果處于降級狀態(tài)的陣列因為系統(tǒng)缺乏熱備盤等客觀原因而尚未進(jìn)入重建狀態(tài),此時外部業(yè)務(wù)對某個磁盤發(fā)生讀錯誤,也將造成該磁盤從陣列中踢出、陣列不可用的問題。
RAID5陣列在監(jiān)控存儲的實際應(yīng)用中,如果出現(xiàn)上述問題,大量的數(shù)據(jù)存儲業(yè)務(wù)將會終端,對用戶來說是難以接受的。發(fā)明內(nèi)容
有鑒于此,本發(fā)明的目的是提供一種Raid5陣列讀IO失敗的修復(fù)方法和裝置。
為實現(xiàn)上述目的,本發(fā)明提供技術(shù)方案如下
一種Raid5陣列讀IO失敗的修復(fù)方法,該方法應(yīng)用于降級的Raid5陣列,該方法包括:A、將失敗的讀IO置于失敗修復(fù)線程隊列;B、針對失敗修復(fù)線程隊列中所述失敗的讀 10,構(gòu)造內(nèi)容為無效數(shù)據(jù)的寫IO并執(zhí)行該寫IO操作,該寫IO的起始位置、大小與所述失敗的讀IO相同;C、該寫IO成功后在所述失敗的讀IO的數(shù)據(jù)緩存中寫入所述無效數(shù)據(jù),返回該讀IO成功。
優(yōu)選地,在步驟B之前進(jìn)一步包括步驟D1、判斷失敗的讀IO讀取的是否為索引區(qū),如果是,則返回讀IO失敗,如果否,則執(zhí)行步驟B。
優(yōu)選地,步驟C進(jìn)一步包括如果所述寫IO失敗,則返回所述讀IO失敗。
優(yōu)選地,在步驟Dl之前進(jìn)一步包括步驟D2、給所述失敗的讀IO設(shè)置標(biāo)志,用以表示該讀IO經(jīng)過失敗修復(fù)處理;在步驟A之前進(jìn)一步包括步驟D3、判斷所述失敗的讀IO 是否設(shè)置有經(jīng)過失敗修復(fù)處理的標(biāo)志,如果沒有,執(zhí)行步驟A ;如果有,則進(jìn)入Raid 5陣列正常處理流程。
優(yōu)選地,該步驟D3進(jìn)一步包括在所述失敗的讀IO沒有設(shè)置經(jīng)過失敗修復(fù)處理標(biāo)志的情況下判斷所述讀IO失敗是否由扇區(qū)損壞導(dǎo)致,如果是,執(zhí)行步驟A ;如果否,進(jìn)入 Raid 5陣列正常處理流程。
基于相同的構(gòu)思,本發(fā)明還提供了一種Raid5陣列讀IO失敗的修復(fù)裝置,該裝置應(yīng)用于降級的Raid5陣列,該裝置包括修復(fù)準(zhǔn)備模塊和修復(fù)模塊。
修復(fù)準(zhǔn)備模塊,用于將失敗的讀IO置于失敗修復(fù)線程隊列;
修復(fù)模塊,用于針對失敗修復(fù)線程隊列中所述失敗的讀10,構(gòu)造內(nèi)容為無效數(shù)據(jù)的寫IO并執(zhí)行該寫IO操作,該寫IO的起始位置、大小與所述失敗的讀IO相同;該寫IO成功后在所述失敗的讀IO的數(shù)據(jù)緩存中寫入所述無效數(shù)據(jù),返回該讀IO成功。
該修復(fù)準(zhǔn)備模塊進(jìn)一步用于對失敗修復(fù)線程隊列中的失敗的讀IO進(jìn)行判斷,判 斷其讀取的是否為索引區(qū),如果是,不執(zhí)行修復(fù)處理,如果否,由修復(fù)模塊執(zhí)行修復(fù)處理。
該修復(fù)模塊在所述寫IO失敗時返回所述讀IO失敗。
該修復(fù)準(zhǔn)備模塊還用于對失敗修復(fù)線程隊列中的失敗的讀IO設(shè)置標(biāo)志,用以表 示該讀IO經(jīng)過失敗修復(fù)處理;
該修復(fù)準(zhǔn)備模塊在將失敗的讀IO置于失敗修復(fù)線程隊列前,判斷所述失敗的讀 IO是否設(shè)置有經(jīng)過失敗修復(fù)處理的標(biāo)志,如果沒有,將該失敗的讀IO置于失敗修復(fù)線程隊 列;如果有,則進(jìn)入Raid 5陣列正常處理流程。
該修復(fù)準(zhǔn)備模塊進(jìn)一步用于在所述失敗的讀IO沒有設(shè)置經(jīng)過失敗修復(fù)處理標(biāo)志 的情況下判斷所述讀IO失敗是否由扇區(qū)損壞導(dǎo)致,如果是,將該失敗的讀IO置于失敗修復(fù) 線程隊列;如果否,進(jìn)入Raid 5陣列正常處理流程。
與現(xiàn)有技術(shù)相比,本發(fā)明實現(xiàn)了對降級模式RAID5陣列的錄像數(shù)據(jù)區(qū)讀錯誤的即 時修復(fù)機制。
圖I是本發(fā)明實施例的流程圖。
圖2是本發(fā)明實施例的另一流程圖。
圖3是本發(fā)明實施例的第三流程圖。
圖4是本發(fā)明裝置的邏輯結(jié)構(gòu)圖。
具體實施方式
仔細(xì)研究監(jiān)控業(yè)務(wù)的特點可以發(fā)現(xiàn)對于監(jiān)控的存儲業(yè)務(wù)來說,磁盤出現(xiàn)少量壞扇 區(qū)的情況下,丟失一部分老的視頻錄像數(shù)據(jù)是可以接受的,因為視頻監(jiān)控數(shù)據(jù)雖然是海量 的,但有很多視頻信息其實是重復(fù)無用的,比如某個攝像頭采集到的畫面可能數(shù)個小時沒 有變化,或者變化很少。磁盤出現(xiàn)少量壞扇區(qū)但是在磁盤仍舊可以正常使用的情況下,需要 采用即時有效的錯誤處理機制,避免這種情況下的磁盤從陣列中踢出、重建中止、陣列不可 用等問題,保證新的錄像數(shù)據(jù)可以正常存儲到陣列中。為此,本發(fā)明提出了一種用于降級 Raid5陣列的讀IO失敗修復(fù)方法,該方法包括以下步驟
步驟A、將失敗的讀IO置于錯誤修復(fù)線程隊列;
步驟B、針對錯誤修復(fù)線程隊列中所述失敗的讀10,構(gòu)造內(nèi)容為無效數(shù)據(jù)的寫IO 并執(zhí)行該寫10,該寫IO的起始位置、大小與所述失敗的讀IO相同;
步驟C、在所述失敗的讀IO的數(shù)據(jù)緩存中寫入所述無效數(shù)據(jù),返回該讀IO成功的信息。
處于降級狀態(tài)的Raid陣列,當(dāng)發(fā)生讀IO失敗時,將不立即反饋讀失敗信息,而是 針對讀IO所指向的邏輯地址構(gòu)造新的寫IO命令,該新的寫IO命令利用磁盤配備的壞扇區(qū) 重分配機制/磁盤壞塊重映射機制,將無效數(shù)據(jù)寫入到邏輯地址和上述讀IO對應(yīng)的邏輯地 址一致,但物理空間和上述讀IO對應(yīng)的物理空間不一致的扇區(qū)上。并且構(gòu)造的該無效數(shù)據(jù) 作為實際讀到的數(shù)據(jù)寫入讀緩存中。這樣從處理流程上來看,本次讀IO操作是成功的,雖然讀到的數(shù)據(jù)本身和真實的數(shù)據(jù)不一致的(扇區(qū)的損壞導(dǎo)致真實數(shù)據(jù)丟失了)。但是讀IO 操作的成功解決使得壞扇區(qū)所在磁盤不會被從陣列中踢出、陣列不會不可用,如果在重建 的話,重建也不會中止。
以下進(jìn)一步結(jié)合附圖詳細(xì)描述實施例。
參圖1,降級模式的RAID5陣列出現(xiàn)讀失敗10,將該讀失敗IO掛入錯誤修復(fù)線程 的IO隊列。
S11、判斷該讀IO失敗是否是扇區(qū)損壞導(dǎo)致;且該讀失敗IO沒有經(jīng)過失敗修復(fù)處理。
S12、如果是,則將該失敗的讀IO掛入錯誤修復(fù)線程的IO隊列,以進(jìn)行失敗修復(fù)。
S13、如果否,按照RAID5現(xiàn)有的處理流程進(jìn)行后續(xù)處理。
參見圖2,錯誤修復(fù)線程對讀失敗IO的修復(fù)流程。
S21、取出所述錯誤修復(fù)線程IO隊列中的讀失敗10。
S22、給該讀失敗IO置上失敗修復(fù)處理的標(biāo)志位。
S23、判斷該讀失敗IO讀取的條帶是否為索引區(qū)。
S24、如果是索引區(qū),返回讀失敗10,結(jié)束對該讀失敗IO的失敗修復(fù)。
S25、如果不是索引區(qū),構(gòu)造寫10,該寫IO的起始地址、長度與該讀失敗IO相同,該 寫IO的內(nèi)容為全O。
參見圖3,圖3為修復(fù)寫IO的響應(yīng)流程
S31、判斷修復(fù)寫IO是否寫成功。
S32、如果寫成功,將上述讀失敗IO的數(shù)據(jù)緩存進(jìn)行清0,返回讀成功信息。
S33、如果沒有寫成功,以讀失敗的方式進(jìn)行返回。
圖I 圖3的處理流程展示了對一個讀失敗IO的修復(fù)流程。針對一個降級的 RAID5陣列,當(dāng)出現(xiàn)讀IO失敗的時候,不立即反饋讀IO失敗使得磁盤被踢出、重建被中止, 而是針對該失敗的讀IO進(jìn)行修復(fù)處理。讀IO失敗有多種原因,其中磁盤的扇區(qū)損壞是一 種讀IO失敗的原因。本發(fā)明主要是針對該原因?qū)е碌淖xIO失敗進(jìn)行修復(fù)處理。當(dāng)由于壞 扇區(qū)導(dǎo)致讀IO失敗時,會反饋扇區(qū)損壞的錯誤碼,據(jù)此就可以判斷是由于扇區(qū)損壞導(dǎo)致讀 IO失敗的。在這種情況下,就可以對該讀失敗IO進(jìn)行修復(fù)了。先將該讀失敗IO掛入失敗 修復(fù)線程隊列中,喚醒對該讀IO的修復(fù)處理。由于在修復(fù)處理的過程中會存在修復(fù)不成功 的情況,在修復(fù)不成功時仍然返回讀IO失敗,但是該失敗的讀IO已經(jīng)經(jīng)過修復(fù)處理了,所 以無需再一次進(jìn)行修復(fù)處理,否則就進(jìn)入死循環(huán)了。所以在將讀失敗IO掛入失敗修復(fù)線程 隊列中之前還需判斷該讀IO失敗是否已經(jīng)經(jīng)過失敗修復(fù)處理,如果沒有再將其置入失敗 修復(fù)線程隊列中,如果已經(jīng)經(jīng)過失敗修復(fù)了,那么就只能按照現(xiàn)有Raid陣列的處理流程進(jìn) 行處理了,如進(jìn)行踢盤、中止重建等。
對于失敗修復(fù)線程隊列中的讀失敗10,在對其執(zhí)行進(jìn)一步修復(fù)處理前,給它置上 經(jīng)過失敗修復(fù)處理的標(biāo)志位,因為后續(xù)的進(jìn)一步修復(fù)處理可能會發(fā)生修復(fù)失敗的狀況。設(shè) 置上述標(biāo)志位后,對該失敗讀IO讀取的存儲區(qū)域進(jìn)行判斷是數(shù)據(jù)區(qū)還是索引區(qū),如果是 索引區(qū)將不再執(zhí)行進(jìn)一步的修復(fù)處理,認(rèn)為修復(fù)失敗,直接返回上述讀IO為失敗的響應(yīng)。 如果是數(shù)據(jù)區(qū)的話,繼續(xù)執(zhí)行修復(fù)流程構(gòu)造寫IO (可以稱為修復(fù)寫10),起始地址、長度與 該讀失敗IO相同,數(shù)據(jù)內(nèi)容為全O。之所以判斷讀取的是索引區(qū)還是數(shù)據(jù)區(qū),主要原因在于索引區(qū)損壞將導(dǎo)致單個或者多個磁盤的所有監(jiān)控錄像無法使用。如果采用將寫入無效 數(shù)據(jù)到索引區(qū)的修復(fù)方案,還是會導(dǎo)致上述問題。由于磁盤具有壞扇區(qū)重分配機制,有的存 儲設(shè)備還支持自身的磁盤壞塊重映射機制,所以在執(zhí)行對某一邏輯地址的寫IO時,在該邏 輯地址當(dāng)前對應(yīng)的扇區(qū)損壞時會自動分配新的扇區(qū)與該邏輯地址對應(yīng),該寫IO實際將對 新分配的扇區(qū)執(zhí)行寫操作。寫入的內(nèi)容屬于無效數(shù)據(jù),可以是全O的數(shù)據(jù),也可以是其它數(shù) 據(jù)。上述構(gòu)造的寫IO在執(zhí)行的時候,一般情況下都會成功,但是不排除一些其它導(dǎo)致失敗 的情況。如果沒有寫成功,說明針對上述讀IO的修復(fù)就失敗了,返回讀IO失敗。如果寫成 功了,表明針對上述讀IO的修復(fù)成功了,返回讀IO成功。壞的扇區(qū)就自動被從存儲業(yè)務(wù)中 隔離了,并且是即時的隔離(后續(xù)針對原先壞扇區(qū)的讀IO或者寫IO就變成了對上述新分配 扇區(qū)的讀寫操作)。修復(fù)成功后,還需要在該讀IO的數(shù)據(jù)緩存中寫入構(gòu)造的無效數(shù)據(jù),比如 全O。執(zhí)行上述寫IO的目的并不是要真正寫入數(shù)據(jù),只是為了隔離壞扇區(qū),使得原本失敗的 讀IO能成功而不至于產(chǎn)生踢盤等后果,達(dá)到所謂的修復(fù)目的。雖然損壞扇區(qū)中的數(shù)據(jù)確實 已經(jīng)丟失了,但是少量存儲數(shù)據(jù)的丟失有的時候并不會對實際的業(yè)務(wù)產(chǎn)生影響,比如視頻 存儲業(yè)務(wù)。
執(zhí)行了無效數(shù)據(jù)寫IO的條帶,需要通過后續(xù)機制更新條帶校驗和與數(shù)據(jù)的一致 性如果該讀IO是外部業(yè)務(wù)所引發(fā)的,并且該讀IO所針對的條帶已經(jīng)完成了重建,則需要 重新計算條帶校驗和,并將新校驗和寫入磁盤。如果讀IO是外部業(yè)務(wù)引發(fā)的,并且該讀IO 所針對的條帶還沒有開始重建,則在后續(xù)的重建過程中自然會恢復(fù)條帶校驗和與數(shù)據(jù)的一 致性。如果該讀IO是重建所引發(fā)的,則直接利用該無效數(shù)據(jù)和其它條帶的數(shù)據(jù)計算校驗和 寫入磁盤,保證檢驗和與數(shù)據(jù)的一致性。
基于相同的構(gòu)思,本發(fā)明還提供了一種Raid5陣列讀IO失敗的修復(fù)裝置,該裝置 應(yīng)用于降級的Raid5陣列,該裝置包括修復(fù)準(zhǔn)備模塊和修復(fù)模塊。
修復(fù)準(zhǔn)備模塊,用于將失敗的讀IO置于失敗修復(fù)線程隊列;
修復(fù)模塊,用于針對失敗修復(fù)線程隊列中所述失敗的讀10,構(gòu)造內(nèi)容為無效數(shù)據(jù) 的寫IO并執(zhí)行該寫IO操作,該寫IO的起始位置、大小與所述失敗的讀IO相同;該寫IO成 功后在所述失敗的讀IO的數(shù)據(jù)緩存中寫入所述無效數(shù)據(jù),返回該讀IO成功。
該修復(fù)準(zhǔn)備模塊進(jìn)一步用于對失敗修復(fù)線程隊列中的失敗的讀IO進(jìn)行判斷,判 斷其讀取的是否為索引區(qū),如果是,不執(zhí)行修復(fù)處理,如果否,由修復(fù)模塊執(zhí)行修復(fù)處理。
該修復(fù)模塊在所述寫IO失敗時返回所述讀IO失敗。
該修復(fù)準(zhǔn)備模塊還用于對失敗修復(fù)線程隊列中的失敗的讀IO設(shè)置標(biāo)志,用以表 示該讀IO經(jīng)過失敗修復(fù)處理;
該修復(fù)準(zhǔn)備模塊在將失敗的讀IO置于失敗修復(fù)線程隊列前,判斷所述失敗的讀 IO是否設(shè)置有經(jīng)過失敗修復(fù)處理的標(biāo)志,如果沒有,將該失敗的讀IO置于失敗修復(fù)線程隊 列;如果有,則進(jìn)入Raid 5陣列正常處理流程。
該修復(fù)準(zhǔn)備模塊進(jìn)一步用于在所述失敗的讀IO沒有設(shè)置經(jīng)過失敗修復(fù)處理標(biāo)志 的情況下判斷所述讀IO失敗是否由扇區(qū)損壞導(dǎo)致,如果是,將該失敗的讀IO置于失敗修復(fù) 線程隊列;如果否,進(jìn)入Raid 5陣列正常處理流程。
以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精 神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明保護的范圍之內(nèi)。
權(quán)利要求
1.一種Raid5陣列讀IO失敗的修復(fù)方法,該方法應(yīng)用于降級的Raid5陣列,其特征在于,該方法包括 A、將失敗的讀IO置于失敗修復(fù)線程隊列; B、針對失敗修復(fù)線程隊列中所述失敗的讀10,構(gòu)造內(nèi)容為無效數(shù)據(jù)的寫IO并執(zhí)行該寫IO操作,該寫IO的起始位置、大小與所述失敗的讀IO相同; C、該寫IO成功后在所述失敗的讀IO的數(shù)據(jù)緩存中寫入所述無效數(shù)據(jù),返回該讀IO成功。
2.如權(quán)利要求I所述的方法,其特征在于,在步驟B之前進(jìn)一步包括步驟D1、判斷失敗的讀IO讀取的是否為索引區(qū),如果是,則返回讀IO失敗,如果否,則執(zhí)行步驟B。
3.如權(quán)利要求2所述的方法,其特征在于,步驟C進(jìn)一步包括如果所述寫IO失敗,則返回所述讀IO失敗。
4.如權(quán)利要求3所述的方法,其特征在于,在步驟Dl之前進(jìn)一步包括 步驟D2、給所述失敗的讀IO設(shè)置標(biāo)志,用以表示該讀IO經(jīng)過失敗修復(fù)處理; 在步驟A之前進(jìn)一步包括 步驟D3、判斷所述失敗的讀IO是否設(shè)置有經(jīng)過失敗修復(fù)處理的標(biāo)志,如果沒有,執(zhí)行步驟A ;如果有,則進(jìn)入Raid 5陣列正常處理流程。
5.如權(quán)利要求4所述的方法,其特征在于,所述步驟D3進(jìn)一步包括在所述失敗的讀IO沒有設(shè)置經(jīng)過失敗修復(fù)處理標(biāo)志的情況下判斷所述讀IO失敗是否由扇區(qū)損壞導(dǎo)致,如果是,執(zhí)行步驟A ;如果否,進(jìn)入Raid 5陣列正常處理流程。
6.一種Raid5陣列讀IO失敗的修復(fù)裝置,該裝置應(yīng)用于降級的Raid5陣列,其特征在于,該裝置包括 修復(fù)準(zhǔn)備模塊,用于將失敗的讀IO置于失敗修復(fù)線程隊列; 修復(fù)模塊,用于針對失敗修復(fù)線程隊列中所述失敗的讀10,構(gòu)造內(nèi)容為無效數(shù)據(jù)的寫IO并執(zhí)行該寫IO操作,該寫IO的起始位置、大小與所述失敗的讀IO相同;該寫IO成功后在所述失敗的讀IO的數(shù)據(jù)緩存中寫入所述無效數(shù)據(jù),返回該讀IO成功。
7.如權(quán)利要求6所述的裝置,其特征在于,所述修復(fù)準(zhǔn)備模塊進(jìn)一步用于對失敗修復(fù)線程隊列中的失敗的讀IO進(jìn)行判斷,判斷其讀取的是否為索引區(qū),如果是,不執(zhí)行修復(fù)處理,如果否,由修復(fù)模塊執(zhí)行修復(fù)處理。
8.如權(quán)利要求7所述的裝置,其特征在于,修復(fù)模塊在所述寫IO失敗時返回所述讀IO失敗。
9.如權(quán)利要求8所述的裝置,其特征在于,修復(fù)準(zhǔn)備模塊還用于對失敗修復(fù)線程隊列中的失敗的讀IO設(shè)置標(biāo)志,用以表示該讀IO經(jīng)過失敗修復(fù)處理; 該修復(fù)準(zhǔn)備模塊在將失敗的讀IO置于失敗修復(fù)線程隊列前,判斷所述失敗的讀IO是否設(shè)置有經(jīng)過失敗修復(fù)處理的標(biāo)志,如果沒有,將該失敗的讀IO置于失敗修復(fù)線程隊列;如果有,則進(jìn)入Raid 5陣列正常處理流程。
10.如權(quán)利要求9所述的裝置,其特征在于,所述修復(fù)準(zhǔn)備模塊進(jìn)一步用于在所述失敗的讀IO沒有設(shè)置經(jīng)過失敗修復(fù)處理標(biāo)志的情況下判斷所述讀IO失敗是否由扇區(qū)損壞導(dǎo)致,如果是,將該失敗的讀IO置于失敗修復(fù)線程隊列;如果否,進(jìn)入Raid 5陣列正常處理流程。
全文摘要
本發(fā)明提供一種Raid5陣列讀IO失敗的修復(fù)方法,該方法應(yīng)用于降級的Raid5陣列,包括A、將失敗的讀IO置于失敗修復(fù)線程隊列;B、針對失敗修復(fù)線程隊列中所述失敗的讀IO,構(gòu)造內(nèi)容為無效數(shù)據(jù)的寫IO并執(zhí)行該寫IO操作,該寫IO的起始位置、大小與所述失敗的讀IO相同;C、該寫IO成功后在所述失敗的讀IO的數(shù)據(jù)緩存中寫入所述無效數(shù)據(jù),返回該讀IO成功。本發(fā)明實現(xiàn)了對降級模式RAID5陣列的錄像數(shù)據(jù)區(qū)讀錯誤的即時修復(fù)機制。
文檔編號G06F11/07GK102981921SQ201210550368
公開日2013年3月20日 申請日期2012年12月17日 優(yōu)先權(quán)日2012年12月17日
發(fā)明者成浩, 丁強 申請人:浙江宇視科技有限公司