所屬的技術(shù)人員能夠理解,本發(fā)明提供的raid陣列掉電io數(shù)據(jù)恢復(fù)方法各個方面可以實現(xiàn)為系統(tǒng)、方法或程序產(chǎn)品。因此,本公開的各個方面可以具體實現(xiàn)為以下形式,即:完全的硬件實施方式、完全的軟件實施方式(包括固件、微代碼等),或硬件和軟件方面結(jié)合的實施方式,這里可以統(tǒng)稱為“電路”、“模塊”或“系統(tǒng)”。在儲存raid陣列掉電io數(shù)據(jù)恢復(fù)方法的非暫態(tài)計算機可讀存儲介質(zhì)中,可以為但不限于電、磁、光、電磁、紅外線、或半導(dǎo)體的系統(tǒng)、裝置或器件,或者任意以上的組合??勺x存儲介質(zhì)的更具體的例子(非窮舉的列表)包括:具有一個或多個導(dǎo)線的電連接、便攜式盤、硬盤、隨機存取存儲器(ram)、只讀存儲器(rom)、可擦式可編程只讀存儲器(eprom或閃存)、光纖、便攜式緊湊盤只讀存儲器(cd-rom)、光存儲器件、磁存儲器件、或者上述的任意合適的組合。盡管通過參考附圖并結(jié)合優(yōu)選實施例的方式對本發(fā)明進(jìn)行了詳細(xì)描述,但本發(fā)明并不限于此。在不脫離本發(fā)明的精神和實質(zhì)的前提下,本領(lǐng)域普通技術(shù)人員可以對本發(fā)明的實施例進(jìn)行各種等效的修改或替換,而這些修改或替換都應(yīng)在本發(fā)明的涵蓋范圍內(nèi)/任何熟悉本的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。
背景技術(shù):
1、raid,是redundant?array?of?independent?disks的簡稱,獨立磁盤組成的具有冗余性的陣列。raid是將多個硬盤驅(qū)動器組合成一個邏輯單元的數(shù)據(jù)存儲虛擬化技術(shù),通過raid可提高數(shù)據(jù)的可靠性、性能和容量。在raid陣列中,數(shù)據(jù)的讀寫操作可以并行進(jìn)行,以提升性能。在某些raid配置中,為了減少主機的等待時間,減低io延遲,當(dāng)主機向raid陣列發(fā)出寫請求時,raid控制器會采取寫回模式的io策略,在數(shù)據(jù)實際寫入硬盤之前就向主機發(fā)送一個響應(yīng),此種方式的優(yōu)點是可以減少主機等待時間,提高整體性能,但此種方式的缺點是若發(fā)生系統(tǒng)突然掉電,那些只存在于緩存中而未寫入存儲的數(shù)據(jù)將會丟失。另一種寫通模式的io策略可以保證數(shù)據(jù)一致性,當(dāng)cpu進(jìn)行寫操作時,數(shù)據(jù)不僅會被寫入緩存,同時也會寫入到后端存儲,進(jìn)而實現(xiàn)數(shù)據(jù)一致性,但是此種方式的缺點是每次寫操作都需要訪問緩存和存儲,增加寫操作的延遲,影響存儲性能。
2、目前raid陣列不論是寫通模式和寫回模式,在io寫盤過程中若發(fā)生掉電,都可能會發(fā)生數(shù)據(jù)丟失或損壞的風(fēng)險,如正在寫盤時,raid控制器異常掉電,導(dǎo)致某些磁盤寫盤失敗,就會出現(xiàn)條帶內(nèi)數(shù)據(jù)不一致,發(fā)生數(shù)據(jù)損壞。尤其是在寫回模式下,在已經(jīng)給主機返回響應(yīng)后,但io數(shù)據(jù)還沒有來得及寫盤前,若發(fā)生raid控制器異常掉電,將會導(dǎo)致數(shù)據(jù)丟失。
3、此為現(xiàn)有技術(shù)的不足,因此,針對現(xiàn)有技術(shù)中的上述缺陷,提供一種raid陣列掉電io數(shù)據(jù)恢復(fù)方法、系統(tǒng)、設(shè)備及介質(zhì),是非常有必要的。
技術(shù)實現(xiàn)思路
1、針對目前raid陣列在raid控制器異常掉電時,會發(fā)生數(shù)據(jù)丟失的缺陷,本發(fā)明提供一種raid陣列掉電io數(shù)據(jù)恢復(fù)方法、系統(tǒng)、設(shè)備及介質(zhì),以解決上述技術(shù)問題。
2、第一方面,本發(fā)明提供一種raid陣列掉電io數(shù)據(jù)恢復(fù)方法,包括如下步驟:s1.預(yù)先將raid陣列的io數(shù)據(jù)處理過程劃分階段,并定義每個階段對應(yīng)的io狀態(tài);
3、s2.在io數(shù)據(jù)處理過程中記錄所處階段,并將每個階段的io狀態(tài)及主機io數(shù)據(jù)的上下文信息保存到非易失性存儲中;
4、s3.當(dāng)raid陣列異常掉電恢復(fù)后,根據(jù)實時io狀態(tài)確定掉點前io數(shù)據(jù)處理過程所處階段,根據(jù)所處階段進(jìn)行io數(shù)據(jù)恢復(fù)。
5、進(jìn)一步地,步驟s1具體步驟如下:
6、s11.預(yù)先將raid陣列的寫回模式依次劃分為收到寫io階段、搬移數(shù)據(jù)階段、回復(fù)主機響應(yīng)階段以及寫盤階段的四個階段;
7、s12.將寫回模式的收到寫io階段的起始狀態(tài)定義為空閑狀態(tài),將收到寫io的末尾狀態(tài)定義為回應(yīng)前狀態(tài),將回復(fù)主機響應(yīng)階段的末尾狀態(tài)定義為寫前狀態(tài),將寫盤階段的起始狀態(tài)定義為寫狀態(tài),將寫盤狀態(tài)的末尾狀態(tài)定義為空閑狀態(tài);s13.預(yù)先將raid陣列的寫通模式依次劃分為收到寫io階段、搬移數(shù)據(jù)階段、寫盤階段的三個階段;
8、s14.將寫通模式的收到寫io階段的起始狀態(tài)定義為空閑狀態(tài),將手段寫io的末尾狀態(tài)定義為回應(yīng)前狀態(tài),將寫盤階段的起始狀態(tài)定義為寫狀態(tài),將寫盤階段的末尾狀態(tài)定義為空閑狀態(tài)。通過詳細(xì)定義raid陣列在寫回和寫通兩種模式下的io處理階段及狀態(tài)轉(zhuǎn)換,使得io數(shù)據(jù)在處理過程中的每一步都有明確的狀態(tài)標(biāo)識。此種精細(xì)化的階段劃分和狀態(tài)管理,不僅有助于理解io數(shù)據(jù)的處理流程,也為后續(xù)的異常處理和數(shù)據(jù)恢復(fù)提供的基礎(chǔ),尤其是在復(fù)雜的raid配置中,能夠準(zhǔn)確追蹤到每個io操作的具體狀態(tài),對于保障數(shù)據(jù)安全和提升系統(tǒng)性能具有重要意義。
9、進(jìn)一步地,步驟s2具體步驟如下:
10、s21.預(yù)先定義io上下文結(jié)構(gòu),并在獲取到io請求后,從非易失性存儲獲取空閑的io上下文結(jié)構(gòu);
11、s22.向非易失性存儲申請io數(shù)據(jù)存儲空間,將io數(shù)據(jù)寫入緩存以及寫入各個磁盤,并按照raid陣列的模式對io數(shù)據(jù)處理過程中各個階段的io狀態(tài)及主機io數(shù)據(jù)的上下文信息保存到io上下文結(jié)構(gòu)中。通過定義io上下文結(jié)構(gòu)并實時記錄io數(shù)據(jù)的處理狀態(tài)和上下文信息,實現(xiàn)了對io操作過程的全面監(jiān)控和記錄。本發(fā)明使得在raid陣列掉電后,能夠迅速恢復(fù)到掉電前的處理狀態(tài),并繼續(xù)完成未完成的io操作;同時,通過向非易失性存儲申請io數(shù)據(jù)存儲空間,保證了數(shù)據(jù)的持久性和可靠性,避免了因掉電而導(dǎo)致的數(shù)據(jù)丟失風(fēng)險。
12、進(jìn)一步地,步驟s21具體步驟如下:
13、s211.預(yù)先定義io上下文結(jié)構(gòu)包括io起始邏輯地址、io長度、條帶號、數(shù)據(jù)地址、io狀態(tài)以及若干個寫盤信息的字段;
14、s212.預(yù)先定義每個寫盤信息字段包括盤id、盤起始邏輯地址、寫盤長度、寫入數(shù)據(jù)地址偏移以及寫盤狀態(tài)的子字段;
15、s213.獲取到io請求后,獲取一個空閑的io上下文結(jié)構(gòu),在io上下文結(jié)構(gòu)中填寫io起始邏輯地址、io長度信息,并將io狀態(tài)記錄為回應(yīng)前階段;
16、s214.向非易失性存儲申請io數(shù)據(jù)緩存空間,將申請的地址寫入到io上下文結(jié)構(gòu)的數(shù)據(jù)地址字段。本發(fā)明通過詳細(xì)定義io上下文結(jié)構(gòu)的字段,為io數(shù)據(jù)的恢復(fù)提供信息支持,這些字段的充分考慮了io操作的復(fù)雜性和多樣性,能夠準(zhǔn)確地記錄每個io操作的關(guān)鍵信息;同時,通過獲取空閑的io上下文結(jié)構(gòu)并填寫相關(guān)信息,為后續(xù)的io數(shù)據(jù)處理和記錄做好準(zhǔn)備。
17、進(jìn)一步地,步驟s22具體步驟如下:
18、s221.使用主機直接訪問內(nèi)存單元將待寫入的數(shù)據(jù)搬移到申請的io數(shù)據(jù)緩存空間;
19、s222.判斷raid陣列的模式;
20、當(dāng)為寫回模式,進(jìn)入步驟s223;
21、當(dāng)為寫通模式,進(jìn)入步驟s224;
22、s223.在主機直接訪問內(nèi)存單元在數(shù)據(jù)搬移完成后,向主機恢復(fù)寫入成功的響應(yīng),同時將io狀態(tài)記錄為寫前狀態(tài);
23、s224.計算io數(shù)據(jù)的校驗塊,將io數(shù)據(jù)切分到各個磁盤中,同時將校驗塊寫入磁盤的預(yù)先設(shè)定位置,更新io上下文結(jié)構(gòu)中寫盤信息;
24、s225.在寫盤階段開始寫盤前,將io狀態(tài)記錄為寫狀態(tài),并記錄各磁盤狀態(tài)為寫狀態(tài);
25、s226.接收到磁盤的寫入響應(yīng)后,記錄磁盤狀態(tài)為寫成功狀態(tài),并在所有磁盤完成寫入后,將io狀態(tài)記錄為空閑狀態(tài),并釋放io上下文結(jié)構(gòu)。通過詳細(xì)描述在不同raid模式下io數(shù)據(jù)的處理流程,根據(jù)raid陣列的模式選擇不同的處理路徑,確保了io操作的準(zhǔn)確性和可靠性;在寫盤階段,通過記錄磁盤狀態(tài)和io狀態(tài),為后續(xù)的異常處理和數(shù)據(jù)恢復(fù)提供有力的支持。
26、進(jìn)一步地,步驟s3具體步驟如下:
27、s31.raid控制器上電啟動后判斷是否為異常掉電重啟;
28、若是,啟動io恢復(fù),進(jìn)入步驟s32;
29、若否,返回步驟s22;
30、s32.遍歷所有io上下文結(jié)構(gòu)識別io上下文結(jié)構(gòu)數(shù)量,并定位一個io上下文結(jié)構(gòu);
31、s33.獲取定位的io上下文結(jié)構(gòu)的io狀態(tài);
32、當(dāng)io狀態(tài)為空閑狀態(tài)或回應(yīng)前狀態(tài),進(jìn)入步驟s34;
33、當(dāng)io狀態(tài)為寫狀態(tài),進(jìn)入步驟s35;
34、當(dāng)io狀態(tài)為寫前狀態(tài),進(jìn)入步驟s36;
35、s34.判定未回復(fù)主機響應(yīng)且未開始寫盤,沒有條帶不一致風(fēng)險,無需進(jìn)行io數(shù)據(jù)恢復(fù),進(jìn)入步驟s37;
36、s35.判定io數(shù)據(jù)已經(jīng)完成切分和校驗值計算,但存在條帶不一致風(fēng)險,遍歷io上下文結(jié)構(gòu)中的各寫盤信息字段,將未寫盤成功的磁盤執(zhí)行重新寫盤操作,進(jìn)入步驟s37;
37、s36.判定已經(jīng)回復(fù)主機響應(yīng),但io數(shù)據(jù)存在未進(jìn)行切割和校驗值計算的可能,重新計算校驗值并進(jìn)行io數(shù)據(jù)切分,并進(jìn)行寫盤操作,進(jìn)入步驟s37;
38、s37.判斷io上下文結(jié)構(gòu)是否定位完畢;
39、若是,進(jìn)入步驟s38;
40、若否,定位下一個io上下文結(jié)構(gòu),返回步驟s33;
41、s38.初始化io上下文結(jié)構(gòu),并將所有io上下文結(jié)構(gòu)標(biāo)記為空閑狀態(tài)。通過判斷raid控制器是否為異常掉電重啟,并據(jù)此啟動io恢復(fù)流程,有效地保障了raid陣列在掉電后的數(shù)據(jù)恢復(fù)能力。并在在恢復(fù)過程中,通過遍歷io上下文結(jié)構(gòu)并識別io狀態(tài),根據(jù)不同的狀態(tài)采取相應(yīng)的恢復(fù)措施。本發(fā)明的恢復(fù)策略能夠應(yīng)對多種異常情況,確保數(shù)據(jù)的完整性和一致性,同時,通過初始化io上下文結(jié)構(gòu)并將其標(biāo)記為空閑狀態(tài),為后續(xù)的io操作做好了準(zhǔn)備。
42、進(jìn)一步地,步驟s35具體步驟如下:
43、s351.獲取切分的io數(shù)據(jù)和計算的校驗值;
44、s352.遍歷io上下文結(jié)構(gòu)中的寫盤信息字段,識別寫盤信息字段數(shù)量,并定位一個寫盤信息字段;
45、s353.將定位的寫盤信息字段對應(yīng)的磁盤作為定位磁盤;
46、s354.將切分的io數(shù)據(jù)按照寫盤信息字段對應(yīng)的盤id、盤起始邏輯地址、寫盤長度、寫入數(shù)據(jù)地址偏移以及寫盤狀態(tài)的子字段執(zhí)行數(shù)據(jù)寫入。通過詳細(xì)描述在io狀態(tài)為寫狀態(tài)時進(jìn)行數(shù)據(jù)恢復(fù)的具體步驟,通過獲取切分的io數(shù)據(jù)和計算的校驗值,并遍歷寫盤信息字段進(jìn)行數(shù)據(jù)的重新寫入,確保了未成功寫盤的磁盤能夠得到及時的恢復(fù)。本發(fā)明針對性的恢復(fù)措施能夠有效地解決條帶不一致的風(fēng)險,保障raid陣列的數(shù)據(jù)安全,同時,通過精確的數(shù)據(jù)寫入操作,確保了恢復(fù)后的數(shù)據(jù)與原始數(shù)據(jù)的一致性。
47、第二方面,本發(fā)明提供一種raid陣列掉電io數(shù)據(jù)恢復(fù)系統(tǒng),包括:io數(shù)據(jù)處理階段劃分模塊,用于預(yù)先將raid陣列的io數(shù)據(jù)處理過程劃分階段,并定義每個階段對應(yīng)的io狀態(tài);
48、io狀態(tài)及io數(shù)據(jù)上下文信息記錄模塊,用于在io數(shù)據(jù)處理過程中記錄所處階段,并將每個階段的io狀態(tài)及主機io數(shù)據(jù)的上下文信息保存到非易失性存儲中;
49、io數(shù)據(jù)恢復(fù)模塊,用于當(dāng)raid陣列異常掉電恢復(fù)后,根據(jù)實時io狀態(tài)確定掉點前io數(shù)據(jù)處理過程所處階段,根據(jù)所處階段進(jìn)行io數(shù)據(jù)恢復(fù)。
50、進(jìn)一步地,io數(shù)據(jù)處理階段劃分模塊包括:
51、寫回模式階段劃分單元,用于預(yù)先將raid陣列的寫回模式依次劃分為收到寫io階段、搬移數(shù)據(jù)階段、回復(fù)主機響應(yīng)階段以及寫盤階段的四個階段;
52、寫回模式io狀態(tài)記錄單元,用于將寫回模式的收到寫io階段的起始狀態(tài)定義為空閑狀態(tài),將收到寫io的末尾狀態(tài)定義為回應(yīng)前狀態(tài),將回復(fù)主機響應(yīng)階段的末尾狀態(tài)定義為寫前狀態(tài),將寫盤階段的起始狀態(tài)定義為寫狀態(tài),將寫盤狀態(tài)的末尾狀態(tài)定義為空閑狀態(tài);
53、寫通模式階段劃分單元,用于預(yù)先將raid陣列的寫通模式依次劃分為收到寫io階段、搬移數(shù)據(jù)階段、寫盤階段的三個階段;
54、寫通模式io狀態(tài)記錄單元,用于將寫通模式的收到寫io階段的起始狀態(tài)定義為空閑狀態(tài),將手段寫io的末尾狀態(tài)定義為回應(yīng)前狀態(tài),將寫盤階段的起始狀態(tài)定義為寫狀態(tài),將寫盤階段的末尾狀態(tài)定義為空閑狀態(tài)。
55、進(jìn)一步地,io狀態(tài)及io數(shù)據(jù)上下文信息記錄模塊包括:
56、io上下文結(jié)構(gòu)定義及申請單元,用于預(yù)先定義io上下文結(jié)構(gòu),并在獲取到io請求后,從非易失性存儲獲取空閑的io上下文結(jié)構(gòu);
57、io狀態(tài)及上下文信息記錄單元,用于向非易失性存儲申請io數(shù)據(jù)存儲空間,將io數(shù)據(jù)寫入緩存以及寫入各個磁盤,并按照raid陣列的模式對io數(shù)據(jù)處理過程中各個階段的io狀態(tài)及主機io數(shù)據(jù)的上下文信息保存到io上下文結(jié)構(gòu)中。
58、進(jìn)一步地,io上下文結(jié)構(gòu)定義及申請單元包括:
59、io上下文結(jié)構(gòu)定義子單元,用于預(yù)先定義io上下文結(jié)構(gòu)包括io起始邏輯地址、io長度、條帶號、數(shù)據(jù)地址、io狀態(tài)以及若干個寫盤信息的字段;
60、寫盤信息定義子單元,用于預(yù)先定義每個寫盤信息字段包括盤id、盤起始邏輯地址、寫盤長度、寫入數(shù)據(jù)地址偏移以及寫盤狀態(tài)的子字段;
61、io狀態(tài)記錄子單元,用于獲取到io請求后,獲取一個空閑的io上下文結(jié)構(gòu),在io上下文結(jié)構(gòu)中填寫io起始邏輯地址、io長度信息,并將io狀態(tài)記錄為回應(yīng)前階段;
62、緩存數(shù)據(jù)地址寫入子單元,用于向非易失性存儲申請io數(shù)據(jù)緩存空間,將申請的地址寫入到io上下文結(jié)構(gòu)的數(shù)據(jù)地址字段。
63、進(jìn)一步地,io狀態(tài)及上下文信息記錄單元包括:
64、數(shù)據(jù)搬移子單元,用于使用主機直接訪問內(nèi)存單元將待寫入的數(shù)據(jù)搬移到申請的io數(shù)據(jù)緩存空間;
65、raid陣列模式判斷子單元,用于判斷raid陣列的模式;
66、寫前狀態(tài)記錄子單元,用于在寫回模式,在主機直接訪問內(nèi)存單元在數(shù)據(jù)搬移完成后,向主機恢復(fù)寫入成功的響應(yīng),同時將io狀態(tài)記錄為寫前狀態(tài);
67、寫盤信息記錄子單元,用于在寫回模式完成數(shù)據(jù)搬移后及寫通模式,計算io數(shù)據(jù)的校驗塊,將io數(shù)據(jù)切分到各個磁盤中,同時將校驗塊寫入磁盤的預(yù)先設(shè)定位置,更新io上下文結(jié)構(gòu)中寫盤信息;
68、寫狀態(tài)記錄子單元,用于在寫盤階段開始寫盤前,將io狀態(tài)記錄為寫狀態(tài),并記錄各磁盤狀態(tài)為寫狀態(tài);
69、空閑狀態(tài)記錄子單元,用于接收到磁盤的寫入響應(yīng)后,記錄磁盤狀態(tài)為寫成功狀態(tài),并在所有磁盤完成寫入后,將io狀態(tài)記錄為空閑狀態(tài),并釋放io上下文結(jié)構(gòu)。
70、進(jìn)一步地,io數(shù)據(jù)恢復(fù)模塊包括:
71、異常掉電重啟判斷單元,用于通過raid控制器上電啟動后判斷是否為異常掉電重啟;
72、io上下文定位單元,用于異常掉電重啟后,啟動io恢復(fù),遍歷所有io上下文結(jié)構(gòu)識別io上下文結(jié)構(gòu)數(shù)量,并定位一個io上下文結(jié)構(gòu);
73、io狀態(tài)獲取單元,用于獲取定位的io上下文結(jié)構(gòu)的io狀態(tài);
74、無需io數(shù)據(jù)恢復(fù)單元,用于當(dāng)io狀態(tài)為空閑狀態(tài)或回應(yīng)前狀態(tài)時,判定未回復(fù)主機響應(yīng)且未開始寫盤,沒有條帶不一致風(fēng)險,無需進(jìn)行io數(shù)據(jù)恢復(fù);
75、重新寫盤單元,用于當(dāng)io狀態(tài)為寫狀態(tài)時,判定io數(shù)據(jù)已經(jīng)完成切分和校驗值計算,但存在條帶不一致風(fēng)險,遍歷io上下文結(jié)構(gòu)中的各寫盤信息字段,將未寫盤成功的磁盤執(zhí)行重新寫盤操作;
76、重新數(shù)據(jù)切分及寫盤單元,用于當(dāng)io狀態(tài)為寫前狀態(tài)時,判定已經(jīng)回復(fù)主機響應(yīng),但io數(shù)據(jù)存在未進(jìn)行切割和校驗值計算的可能,重新計算校驗值并進(jìn)行io數(shù)據(jù)切分,并進(jìn)行寫盤操作;
77、io上下文結(jié)構(gòu)定位判斷單元,用于判斷io上下文結(jié)構(gòu)是否定位完畢;
78、下一io上下文結(jié)構(gòu)定位單元,用于io上下文結(jié)構(gòu)未定位完畢時,定位下一個io上下文結(jié)構(gòu);
79、io上下文結(jié)構(gòu)釋放單元,用于初始化io上下文結(jié)構(gòu),并將所有io上下文結(jié)構(gòu)標(biāo)記為空閑狀態(tài)。
80、第三方面,本發(fā)明提供一種電子設(shè)備,包括處理器和存儲器;
81、其中,該存儲器用于存儲計算機程序,該處理器用于從存儲器中調(diào)用并運行該計算機程序,使得電子設(shè)備執(zhí)行上述第一方面所述的方法。
82、第四方面,本發(fā)明提供了一種存儲介質(zhì),
83、所述存儲介質(zhì)中存儲有指令,當(dāng)其在計算機上運行時,使得計算機執(zhí)行上述第一方面所述的方法。
84、本發(fā)明的有益效果在于:
85、本發(fā)明提供的raid陣列掉電io數(shù)據(jù)恢復(fù)方法、系統(tǒng)、設(shè)備及介質(zhì),通過io上下文結(jié)構(gòu)中記錄磁盤寫盤狀態(tài)的方式精確選擇io數(shù)據(jù)恢復(fù)方式,使得在io數(shù)據(jù)恢復(fù)過程中避開已寫盤成功的磁盤,優(yōu)化恢復(fù)速度,并且在io掉電恢復(fù)過程中再次發(fā)生掉電時依然可以保證數(shù)據(jù)完整性。
86、此外,本發(fā)明設(shè)計原理可靠,結(jié)構(gòu)簡單,具有非常廣泛的應(yīng)用前景。
87、由此可見,本發(fā)明與現(xiàn)有技術(shù)相比,具有突出的實質(zhì)性特點和顯著的進(jìn)步,其實施的有益效果也是顯而易見的。