一種存儲(chǔ)數(shù)據(jù)的備份方法和裝置制造方法
【專利摘要】本發(fā)明提出一種存儲(chǔ)數(shù)據(jù)的備份方法,應(yīng)用于RAID陣列,所述方法包括:為目標(biāo)RAID陣列創(chuàng)建寫緩存;其中,所述寫緩存在所述目標(biāo)RAID陣列失效時(shí)啟用;當(dāng)所述目標(biāo)RAID陣列失效時(shí),在執(zhí)行寫IO命令時(shí)將寫入所述目標(biāo)RAID陣列的數(shù)據(jù)寫入所述寫緩存,在執(zhí)行讀IO命令時(shí)從所述寫緩存中讀取數(shù)據(jù);當(dāng)所述目標(biāo)RAID陣列恢復(fù)正常時(shí),自動(dòng)觸發(fā)所述寫緩存將已寫入數(shù)據(jù)回寫至所述目標(biāo)RAID陣列,并在回寫完成時(shí)禁用所述寫緩存。通過本發(fā)明能降低硬件成本以及對(duì)業(yè)務(wù)的性能影響。
【專利說明】一種存儲(chǔ)數(shù)據(jù)的備份方法和裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及存儲(chǔ)領(lǐng)域,尤其涉及一種存儲(chǔ)數(shù)據(jù)的備份方法和裝置。
【背景技術(shù)】
[0002]當(dāng)RAID陣列失效時(shí),該陣列上的所有邏輯資源都不能讀寫,將導(dǎo)致業(yè)務(wù)中斷。例如,在RAID5陣列中有2塊盤不能讀寫,或者在RAIDO陣列中有I塊盤不能讀寫,就會(huì)導(dǎo)致RAID陣列失效。然而,在大多數(shù)情況下,不能讀寫的硬盤,很可能只是硬盤轉(zhuǎn)接板出現(xiàn)問題,或者DEU框SAS連線松動(dòng),而磁盤本身并沒有問題。維護(hù)人員通過更換轉(zhuǎn)接板、或者固定SAS連線對(duì)RAID陣列進(jìn)行恢復(fù)時(shí),通常會(huì)造成RAID陣列暫時(shí)失效,在RAID陣列暫時(shí)失效的情況下,失效期間的業(yè)務(wù)無法提供、數(shù)據(jù)無法保存,從而會(huì)造成嚴(yán)重的數(shù)據(jù)丟失。比如在監(jiān)控應(yīng)用中,RAID陣列失效期間的所有監(jiān)控錄像都會(huì)丟失。
[0003]為解決上述問題,當(dāng)前一般使用鏡像技術(shù)來應(yīng)對(duì)RAID陣列的失效。具體地,可首先對(duì)RAID陣列創(chuàng)建鏡像RAID陣列,也可以對(duì)邏輯資源創(chuàng)建鏡像邏輯資源。在向RAID陣列寫入數(shù)據(jù)時(shí),將數(shù)據(jù)同時(shí)寫入兩份獨(dú)立的RAID陣列(或者邏輯資源)上。若主RAID陣列失效,則將業(yè)務(wù)流轉(zhuǎn)到鏡像RAID陣列上。
[0004]然而上述方案中,由于必須使用相同大小的RAID陣列或邏輯資源創(chuàng)建鏡像,硬盤空間成本翻倍;在業(yè)務(wù)寫數(shù)據(jù)時(shí),需要同時(shí)寫兩份,在系統(tǒng)業(yè)務(wù)繁忙的情況下,會(huì)影響業(yè)務(wù)寫性能,而且會(huì)造成CPU等系統(tǒng)資源負(fù)載翻倍,從而影響其他讀寫業(yè)務(wù)的性能。
【發(fā)明內(nèi)容】
[0005]有鑒于此,本發(fā)明提出一種存儲(chǔ)數(shù)據(jù)的備份方法,應(yīng)用于RAID陣列,所述方法包括:
[0006]為目標(biāo)RAID陣列創(chuàng)建寫緩存;其中,所述寫緩存在所述目標(biāo)RAID陣列失效時(shí)啟用;
[0007]當(dāng)所述目標(biāo)RAID陣列失效時(shí),在執(zhí)行寫1命令時(shí)將寫入所述目標(biāo)RAID陣列的數(shù)據(jù)寫入所述寫緩存,在執(zhí)行讀1命令時(shí)從所述寫緩存中讀取數(shù)據(jù);
[0008]當(dāng)所述目標(biāo)RAID陣列恢復(fù)正常時(shí),自動(dòng)觸發(fā)所述寫緩存將已寫入數(shù)據(jù)回寫至所述目標(biāo)RAID陣列,并在回寫完成時(shí)禁用所述寫緩存。
[0009]優(yōu)選地,所述方法還包括:
[0010]在所述回寫過程中,如果需要執(zhí)行寫1命令,則將該寫1命令對(duì)應(yīng)的數(shù)據(jù)寫入所述目標(biāo)RAID陣列;
[0011]在所述回寫過程中,如果需要執(zhí)行讀1命令,則根據(jù)待讀取的數(shù)據(jù)信息從所述寫緩存中或者從所述目標(biāo)RAID陣列中讀取數(shù)據(jù)。
[0012]優(yōu)選地,所述寫緩存的存儲(chǔ)空間被劃分為全局頭、RAID頭、Block頭以及Block數(shù)據(jù)區(qū);
[0013]所述全局頭,記錄寫緩存存儲(chǔ)空間的大小以及各RAID頭是否已被分配的第一bitmap 位圖;
[0014]所述RAID頭,根據(jù)使用寫緩存進(jìn)行失效備份的目標(biāo)RAID陣列個(gè)數(shù)被劃分為若干子區(qū)域,每個(gè)子區(qū)域分別對(duì)應(yīng)一個(gè)目標(biāo)RAID陣列,并記錄該目標(biāo)RAID陣列信息;所述目標(biāo)RAID陣列信息包括所述目標(biāo)RAID陣列的陣列編號(hào)、Block大小以及可用Block個(gè)數(shù);
[0015]所述Block頭,每個(gè)Block頭分別對(duì)應(yīng)一個(gè)Block數(shù)據(jù)塊,并分別記錄所述Block數(shù)據(jù)塊所屬RAID頭編號(hào)、該Block數(shù)據(jù)塊在目標(biāo)RAID陣列中的Iba地址以及記錄該Block數(shù)據(jù)塊是否已寫入數(shù)據(jù)的第二 bitmap位圖;
[0016]所述Block數(shù)據(jù)區(qū),包括若干個(gè)Block數(shù)據(jù)塊,所述Block數(shù)據(jù)塊的大小為所述RAID頭中記錄的所述Block大小。
[0017]優(yōu)選地,所述為目標(biāo)RAID陣列創(chuàng)建寫緩存包括:
[0018]根據(jù)所述第一 bitmap位圖,為所述目標(biāo)RAID陣列分配一個(gè)未使用的RAID頭;
[0019]將所述目標(biāo)RAID陣列信息以及為所述目標(biāo)RAID陣列分配的可用Block個(gè)數(shù)記錄到對(duì)應(yīng)的RAID頭中。
[0020]優(yōu)選地,所述將寫入所述目標(biāo)RAID陣列的存儲(chǔ)數(shù)據(jù)寫入所述寫緩存包括:
[0021]根據(jù)收到的寫10請(qǐng)求中的目標(biāo)RAID陣列編號(hào)查找對(duì)應(yīng)的RAID頭;
[0022]根據(jù)所述寫10請(qǐng)求中的Iba地址,在該RAID頭對(duì)應(yīng)的Block頭中查找Block頭;
[0023]如果查找到了對(duì)應(yīng)的Block頭,將數(shù)據(jù)寫入該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊中;
[0024]如果未查找到對(duì)應(yīng)的Block頭,則獲取一個(gè)空Block數(shù)據(jù)塊,將數(shù)據(jù)寫入該空Block數(shù)據(jù)塊中,同時(shí)在該空Block數(shù)據(jù)塊對(duì)應(yīng)的Block頭中記錄所屬RAID頭的編號(hào),在所述第二 bitmap位圖中記錄該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊已寫入數(shù)據(jù),并將該數(shù)據(jù)在目標(biāo)RAID陣列中的Iba地址記錄到該Block頭中;
[0025]其中當(dāng)獲取到一個(gè)空數(shù)據(jù)塊時(shí),更新對(duì)應(yīng)的RAID頭中記錄的所述可用Block個(gè)數(shù)。
[0026]優(yōu)選地,所述從所述寫緩存中讀取數(shù)據(jù)包括:
[0027]根據(jù)收到的讀10請(qǐng)求中的目標(biāo)RAID陣列編號(hào)查找對(duì)應(yīng)的RAID頭;
[0028]根據(jù)所述讀10請(qǐng)求中的Iba地址,在該RAID頭對(duì)應(yīng)的Block頭中查找Block頭;
[0029]如果查找到了對(duì)應(yīng)的Block頭,并且該Block頭中的所述第二 bitmap位圖記錄該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊已寫入了數(shù)據(jù),則讀取該數(shù)據(jù);
[0030]如果未查找到對(duì)應(yīng)的Block頭,或者該Block頭中的所述第二 bitmap位圖記錄該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊未寫入數(shù)據(jù),從所述目標(biāo)RAID陣列中讀取數(shù)據(jù),并返回讀取結(jié)果O
[0031]本發(fā)明還提出一種存儲(chǔ)數(shù)據(jù)的備份裝置,應(yīng)用于RAID陣列,所述裝置包括:
[0032]創(chuàng)建模塊,用于為目標(biāo)RAID陣列創(chuàng)建寫緩存;其中,所述寫緩存在所述目標(biāo)RAID陣列失效時(shí)啟用;
[0033]讀寫模塊,用于在所述目標(biāo)RAID陣列失效時(shí),在執(zhí)行寫10命令時(shí)將寫入所述目標(biāo)RAID陣列的數(shù)據(jù)寫入所述寫緩存,在執(zhí)行讀10命令時(shí)從所述寫緩存中讀取數(shù)據(jù);
[0034]回寫模塊,用于在所述目標(biāo)RAID陣列恢復(fù)正常時(shí),自動(dòng)觸發(fā)所述寫緩存將已寫入數(shù)據(jù)回寫至所述目標(biāo)RAID陣列,并在回寫完成時(shí)禁用所述寫緩存。
[0035]優(yōu)選地,所述回寫模塊進(jìn)一步用于:
[0036]在所述回寫過程中,如果需要執(zhí)行寫1命令,則將該寫1命令對(duì)應(yīng)的數(shù)據(jù)寫入所述目標(biāo)RAID陣列;
[0037]所述讀寫模塊進(jìn)一步用于:
[0038]在所述回寫過程中,如果需要執(zhí)行讀1命令,則根據(jù)待讀取的數(shù)據(jù)信息從所述寫緩存中或者從所述目標(biāo)RAID陣列中讀取數(shù)據(jù)。
[0039]優(yōu)選地,所述寫緩存的存儲(chǔ)空間被劃分為全局頭、RAID頭、Block頭以及Block數(shù)據(jù)區(qū);
[0040]所述全局頭,包括寫緩存存儲(chǔ)空間的大小以及記錄各RAID頭是否已被分配的第一 bitmap 位圖;
[0041]所述RAID頭,根據(jù)使用寫緩存進(jìn)行失效備份的目標(biāo)RAID陣列個(gè)數(shù)被劃分為若干子區(qū)域,每個(gè)子區(qū)域分別對(duì)應(yīng)一個(gè)目標(biāo)RAID陣列,并記錄該目標(biāo)RAID陣列信息;所述目標(biāo)RAID陣列信息包括所述目標(biāo)RAID陣列的陣列編號(hào)、Block大小以及可用Block個(gè)數(shù);
[0042]所述Block頭,每個(gè)Block頭分別對(duì)應(yīng)一個(gè)Block數(shù)據(jù)塊,并分別記錄所述Block數(shù)據(jù)塊所屬RAID頭編號(hào)、該Block數(shù)據(jù)塊在目標(biāo)RAID陣列中的Iba地址以及記錄該Block數(shù)據(jù)塊是否已寫入數(shù)據(jù)的第二 bitmap位圖;
[0043]所述Block數(shù)據(jù)區(qū),包括若干個(gè)Block數(shù)據(jù)塊,所述Block數(shù)據(jù)塊的大小為所述RAID頭中記錄的所述Block大小。
[0044]優(yōu)選地,所述創(chuàng)建模塊進(jìn)一步用于:
[0045]根據(jù)所述第一 bitmap位圖,為所述目標(biāo)RAID陣列分配一個(gè)未使用的RAID頭;
[0046]將所述目標(biāo)RAID陣列信息以及為所述目標(biāo)RAID陣列分配的可用Block個(gè)數(shù)記錄到對(duì)應(yīng)的RAID頭中。
[0047]優(yōu)選地,所述讀寫模塊進(jìn)一步用于:
[0048]根據(jù)收到的寫10請(qǐng)求中的目標(biāo)RAID陣列編號(hào)查找對(duì)應(yīng)的RAID頭;
[0049]根據(jù)所述寫10請(qǐng)求中的Iba地址,在該RAID頭對(duì)應(yīng)的Block頭中查找Block頭;
[0050]如果查找到了對(duì)應(yīng)的Block頭,將數(shù)據(jù)寫入該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊中;
[0051]如果未查找到對(duì)應(yīng)的Block頭,則獲取一個(gè)空Block數(shù)據(jù)塊,將數(shù)據(jù)寫入該空Block數(shù)據(jù)塊中,同時(shí)在該空Block數(shù)據(jù)塊對(duì)應(yīng)的Block頭中記錄所屬RAID頭的編號(hào),在所述第二 bitmap位圖中記錄該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊已寫入數(shù)據(jù),并將該數(shù)據(jù)在目標(biāo)RAID陣列中的Iba地址記錄到該Block頭中;
[0052]其中,當(dāng)獲取到一個(gè)空數(shù)據(jù)塊時(shí),更新對(duì)應(yīng)的RAID頭中記錄的所述可用Block個(gè)數(shù)。
[0053]優(yōu)選地,所述讀寫模塊進(jìn)一步用于:
[0054]根據(jù)收到的讀10請(qǐng)求中的目標(biāo)RAID陣列編號(hào)查找對(duì)應(yīng)的RAID頭;
[0055]根據(jù)所述讀10請(qǐng)求中的Iba地址,在該RAID頭對(duì)應(yīng)的Block頭中查找Block頭;
[0056]如果查找到了對(duì)應(yīng)的Block頭,并且該Block頭中的所述第二 bitmap位圖記錄該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊已寫入了數(shù)據(jù),則讀取該數(shù)據(jù);
[0057]如果未查找到對(duì)應(yīng)的Block頭,或者該Block頭中的所述第二 bitmap位圖記錄該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊未寫入數(shù)據(jù),從所述目標(biāo)RAID陣列中讀取數(shù)據(jù),并返回讀取結(jié)果O
[0058]本發(fā)明通過創(chuàng)建寫緩存,使用少量的存儲(chǔ)空間可同時(shí)為多個(gè)RAID陣列提供失效備份,降低了硬件成本;而且,由于所述寫緩存在RAID陣列失效時(shí)才啟用,并且在RAID陣列失效再恢復(fù)時(shí),只回寫失效期間寫入的數(shù)據(jù),從而顯著降低了對(duì)業(yè)務(wù)的性能影響。
【專利附圖】
【附圖說明】
[0059]圖1是現(xiàn)有技術(shù)中RAID存儲(chǔ)陣列對(duì)外部讀寫1的處理示意圖;
[0060]圖2是本發(fā)明一種示例性實(shí)施例示出的一種RAID陣列對(duì)外部讀寫1的處理示意圖;
[0061]圖3是本發(fā)明一種示例性實(shí)施方式示出的一種存儲(chǔ)數(shù)據(jù)的備份方法流程圖;
[0062]圖4是本發(fā)明一種示例性實(shí)施方式示出的一種寫緩存存儲(chǔ)介質(zhì)的存儲(chǔ)空間組織形式;
[0063]圖5是本發(fā)明一種示例性實(shí)施方式示出的一種RAID陣列通過寫緩存進(jìn)行數(shù)據(jù)失效備份以及數(shù)據(jù)恢復(fù)的處理流程;
[0064]圖6是本發(fā)明一種示例性實(shí)施方式示出的一種存儲(chǔ)數(shù)據(jù)的備份裝置框圖。
【具體實(shí)施方式】
[0065]請(qǐng)參見圖1,圖1為現(xiàn)有技術(shù)中RAID陣列對(duì)外部讀寫1的處理示意圖。如圖所示,RAID陣列在進(jìn)行數(shù)據(jù)讀寫時(shí),讀寫1請(qǐng)求通過上層模塊下發(fā)到RAID模塊,Raid request子模塊判斷該1請(qǐng)求所屬RAID陣列的狀態(tài),如果狀態(tài)正常,則將該1請(qǐng)求發(fā)給RAID 1子模塊處理,將數(shù)據(jù)寫入后端硬盤,或者從后端硬盤讀取數(shù)據(jù);如果陣列失效,則向上層模塊返回讀取或者寫入數(shù)據(jù)失敗。
[0066]在發(fā)明中,可以為RAID陣列創(chuàng)建獨(dú)立的寫緩存,并將所述寫緩存作為RAID陣列的RAID模塊中的一個(gè)子模塊,參與RAID陣列對(duì)外部讀寫1的處理。
[0067]具體地,請(qǐng)參見圖2,圖2為本實(shí)施例示出的一種RAID陣列對(duì)外部讀寫1的處理示意圖。如圖所示,引入了寫緩存子模塊后,讀寫1請(qǐng)求通過上層模塊下發(fā)到RAID模塊,Raid request子模塊判斷該1請(qǐng)求所屬RAID陣列的狀態(tài),如果狀態(tài)正常,仍然將該1請(qǐng)求發(fā)給RAID 1子模塊處理,將數(shù)據(jù)寫入后端硬盤,或者從后端硬盤讀取數(shù)據(jù);如果陣列失效,讀寫1請(qǐng)求不再發(fā)給RAID 1子模塊處理,而是由寫緩存子模塊進(jìn)行處理,數(shù)據(jù)的讀寫都在寫緩存中進(jìn)行。當(dāng)陣列恢復(fù)時(shí),自動(dòng)觸發(fā)寫緩存將已寫入數(shù)據(jù)回寫。
[0068]為了使本發(fā)明的技術(shù)方案更加清楚明白,以下結(jié)合附圖并舉實(shí)施例對(duì)本發(fā)明進(jìn)行詳細(xì)描述。
[0069]請(qǐng)參見圖3,本發(fā)明示例性的一種實(shí)施方式中,提出一種存儲(chǔ)數(shù)據(jù)的備份方法,應(yīng)用于RAID陣列,所述方法執(zhí)行如下步驟:
[0070]步驟301、為目標(biāo)RAID陣列創(chuàng)建寫緩存;其中,所述寫緩存在所述目標(biāo)RAID陣列失效時(shí)啟用;
[0071]步驟302、當(dāng)所述目標(biāo)RAID陣列失效時(shí),在執(zhí)行寫1命令時(shí)將寫入所述目標(biāo)RAID陣列的數(shù)據(jù)寫入所述寫緩存,在執(zhí)行讀1命令時(shí)從所述寫緩存中讀取數(shù)據(jù);
[0072]步驟303、當(dāng)所述目標(biāo)RAID陣列恢復(fù)正常時(shí),自動(dòng)觸發(fā)所述寫緩存將已寫入數(shù)據(jù)回寫至所述目標(biāo)RAID陣列,并在回寫完成時(shí)禁用所述寫緩存。
[0073]在本實(shí)施例中,所述寫緩存的存儲(chǔ)介質(zhì)可以是一塊或多塊獨(dú)立的內(nèi)存,一塊或多塊獨(dú)立的硬盤,或者一個(gè)或多個(gè)獨(dú)立的RAID陣列。其中,無論寫緩存采用哪種存儲(chǔ)介質(zhì),均按照如圖4所示的結(jié)構(gòu)組織存儲(chǔ)空間。
[0074]如圖4所示,在本實(shí)施例中,寫緩存的存儲(chǔ)介質(zhì)被劃分為4個(gè)區(qū)域,各區(qū)域分別記載以下信息:一個(gè)全局頭、一個(gè)或多個(gè)RAID頭、多個(gè)Block頭以及多個(gè)Block數(shù)據(jù)區(qū),每個(gè)區(qū)域只記錄斷電必須保存的參數(shù)。
[0075]以下對(duì)以上4個(gè)區(qū)域的功能以記錄的參數(shù)作詳細(xì)的說明。
[0076]全局頭區(qū)域,該區(qū)域記錄寫緩存存儲(chǔ)空間的大小(Size)、用于記錄各RAID頭是否已被分配的第一 bitmap位圖(raid_bitmap)、所屬控制器ID (contol_id)以及該區(qū)域的數(shù)據(jù)校驗(yàn)值(checksum)。其中,所述寫緩存存儲(chǔ)空間的大小,可以在創(chuàng)建寫緩存時(shí)根據(jù)實(shí)際的業(yè)務(wù)以及失效備份的時(shí)間進(jìn)行設(shè)置;例如,假設(shè)RAID陣列上有50路IMbps的錄像,需要提供24h的失效備份,因此需要?jiǎng)?chuàng)建約528G大小的RAID寫緩存。那么一個(gè)4TB大小的硬盤作為寫緩存,可以同時(shí)給7個(gè)這種業(yè)務(wù)的RAID陣列同時(shí)提供24h失效備份。
[0077]所述第一 bitmap位圖,用于記錄各RAID頭是否已被分配,一個(gè)RAID頭在該bitmap位圖中對(duì)應(yīng)位置取值為I時(shí),表示該RAID頭已經(jīng)分配;為O時(shí),表示該RAID頭尚未分配。
[0078]所述所屬控制器ID,用于區(qū)分控制所述寫緩存的控制器。例如,在具體應(yīng)用時(shí),為了提高可靠性,目標(biāo)RAID陣列多通過兩臺(tái)控制器進(jìn)行控制(俗稱雙控),通過所述控制器ID可以區(qū)分出控制所述目標(biāo)RAID陣列的控制器。當(dāng)然在非雙控的環(huán)境下,該參數(shù)就不一定需要了。
[0079]所述數(shù)據(jù)校驗(yàn)值,用于在本區(qū)域中記錄的某些參數(shù)意外丟失時(shí),通過校驗(yàn)計(jì)算對(duì)丟失的參數(shù)進(jìn)行恢復(fù)。
[0080]RAID頭區(qū)域,該區(qū)域根據(jù)使用寫緩存進(jìn)行失效備份的目標(biāo)RAID陣列個(gè)數(shù)被劃分為若干子區(qū)域,每個(gè)子區(qū)域分別對(duì)應(yīng)一個(gè)目標(biāo)RAID陣列;例如,假設(shè)寫緩存需要為兩個(gè)目標(biāo)RAID陣列進(jìn)行失效備份,那么RAID頭區(qū)域可以等同的劃分為兩個(gè)子區(qū)域,每個(gè)子區(qū)域?qū)?yīng)一個(gè)目標(biāo)RAID區(qū)域。RAID頭區(qū)域中每個(gè)子區(qū)域分別記錄對(duì)應(yīng)目標(biāo)RAID陣列信息以及該區(qū)域的數(shù)據(jù)校驗(yàn)值;所述目標(biāo)RAID陣列信息通常包括所述目標(biāo)RAID陣列的陣列編號(hào)(uuid)、扇區(qū)大小(sector_size)、條帶大小(strip_size)、Block 大小(block_size)以及可用Block個(gè)數(shù)(block_number);其中,所述扇區(qū)大小和條帶大小取決于目標(biāo)RAID陣列的具體配置;所述可用Block個(gè)數(shù)為創(chuàng)建寫緩存時(shí)由管理員進(jìn)行分配。
[0081]Block頭區(qū)域,根據(jù)寫緩存的Block總個(gè)數(shù)被劃分為若干個(gè)Block頭,每個(gè)Block頭分別對(duì)應(yīng)一個(gè)Block數(shù)據(jù)塊;每個(gè)Block頭分別記錄該Block頭在Block頭區(qū)域中的Block頭編號(hào)(index,即表示該Block頭為Block頭區(qū)域的第幾個(gè)Block)、該Block頭所屬Raid頭編號(hào)(raid_index,即表示該Block頭屬于RAID頭區(qū)域中的第幾個(gè)RAID)、該Block數(shù)據(jù)塊所記錄的數(shù)據(jù)在目標(biāo)RAID陣列中的Iba地址(logical block address,邏輯區(qū)塊地址)以及記錄該Block數(shù)據(jù)塊是否已寫入數(shù)據(jù)的第二 bitmap位圖(block_bitmap)。
[0082]Block數(shù)據(jù)區(qū)域,該區(qū)域根據(jù)寫緩存的Block總個(gè)數(shù)被劃分為若干個(gè)Block數(shù)據(jù)塊,Block數(shù)據(jù)塊的大小為所述RAID頭中記錄的所述Block大小。其中,寫緩存的Block總個(gè)數(shù)可以通過寫緩存Block數(shù)據(jù)區(qū)域的實(shí)際空間大小除以單個(gè)Block數(shù)據(jù)塊的Block大小計(jì)算得到。
[0083]請(qǐng)參見圖5,圖5為本實(shí)施例示出的RAID陣列通過寫緩存進(jìn)行數(shù)據(jù)失效備份以及數(shù)據(jù)恢復(fù)的處理流程,以下結(jié)合圖4對(duì)RAID陣列通過寫緩存進(jìn)行數(shù)據(jù)失效備份以及數(shù)據(jù)恢復(fù)的處理流程進(jìn)行詳細(xì)描述。
[0084]在本實(shí)施例中,寫緩存在初始狀態(tài)下不對(duì)任何RAID陣列進(jìn)行失效備份,在RAID陣列創(chuàng)建后,如果要對(duì)該RAID陣列進(jìn)行失效備份,則繼續(xù)創(chuàng)建與該RAID陣列對(duì)應(yīng)的寫緩存。
[0085]具體地,在為該RAID陣列創(chuàng)建寫緩存時(shí),可以根據(jù)全局頭中的RAID頭使用bitmap位圖,為該RAID陣列分配一個(gè)空的RAID頭,然后在分配到的RAID頭中記錄該RAID陣列的陣列編號(hào)、扇區(qū)大小、條帶大小、Block大小等信息,同時(shí)為該RAID陣列分配可用Block個(gè)數(shù),并將分配的可用Block個(gè)數(shù)也記錄到RAID頭中。其中,所述可用Block個(gè)數(shù)在具體分配時(shí),可以是根據(jù)寫緩存的總Block個(gè)數(shù)為各目標(biāo)RAID陣列進(jìn)行平均分配;當(dāng)然,在具體實(shí)現(xiàn)時(shí),也可以根據(jù)目標(biāo)RAID陣列的實(shí)際業(yè)務(wù),為不同的目標(biāo)RAID陣列分配數(shù)量不等的可用Block個(gè)數(shù),本實(shí)施例不進(jìn)行特別限定。
[0086]在本實(shí)施例中,創(chuàng)建完成的寫緩存,在RAID陣列正常運(yùn)行時(shí),默認(rèn)為禁用狀態(tài),在RAID陣列失效時(shí)自動(dòng)啟用。當(dāng)寫緩存啟用后,對(duì)于針對(duì)失效RAID陣列的外部讀寫10請(qǐng)求,都由寫緩存進(jìn)行處理。
[0087]寫緩存首先根據(jù)收到的寫10請(qǐng)求中的目標(biāo)RAID陣列編號(hào)以及Iba地址,查找對(duì)應(yīng)的Block頭;具體地,當(dāng)寫緩存收到寫10請(qǐng)求后,首先根據(jù)該寫10請(qǐng)求中的目標(biāo)RAID陣列編號(hào)查找對(duì)應(yīng)的RAID頭,查到RAID頭后再根據(jù)該寫10請(qǐng)求中的Iba地址,在與該RAID頭對(duì)應(yīng)的Block頭中查找Block頭。如果是首次寫入,Block頭中記錄的內(nèi)容均為空,無法查找到對(duì)應(yīng)的Block頭,因此可以直接獲取一個(gè)空Block數(shù)據(jù)塊,將本次寫入的數(shù)據(jù)寫入該空Block數(shù)據(jù)塊中,并在該空Block數(shù)據(jù)塊對(duì)應(yīng)的Block頭中記錄所屬RAID頭的編號(hào)(即為根據(jù)讀10請(qǐng)求中目標(biāo)RAID陣列編號(hào)查找到的那個(gè)RAID頭的編號(hào)),并將所述第二 bitmap位圖中對(duì)應(yīng)bit位置位為I ;同時(shí),將該數(shù)據(jù)在目標(biāo)RAID陣列中的Iba地址(即該寫10請(qǐng)求中的Iba地址)也記錄到該空Block數(shù)據(jù)塊對(duì)應(yīng)的Block頭中,以方便目標(biāo)RAID陣列由失效狀態(tài)恢復(fù)為正常狀態(tài)時(shí),可根據(jù)Block頭中記錄的Iba地址將已寫入數(shù)據(jù)回寫至目標(biāo)RAID陣列。
[0088]當(dāng)根據(jù)該寫10請(qǐng)求中的目標(biāo)RAID陣列編號(hào)以及扇區(qū)地址查找Block頭時(shí),如果查找到了對(duì)應(yīng)的Block頭,表明該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊之前已經(jīng)寫入了數(shù)據(jù),于是直接將本次寫入的數(shù)據(jù)寫入該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊中。
[0089]值得說明的是,在向?qū)懢彺鎸懭霐?shù)據(jù)時(shí),當(dāng)獲取到一個(gè)空Block數(shù)據(jù)塊時(shí),需要更新對(duì)應(yīng)的RAID頭中記錄的所述可用Block個(gè)數(shù),將所述可用Block個(gè)數(shù)減I。
[0090]進(jìn)一步地,當(dāng)寫緩存收到讀10請(qǐng)求后,首先根據(jù)收到的讀10請(qǐng)求中的目標(biāo)RAID陣列編號(hào)以及Iba地址,在所述寫緩存中查找Block頭;具體地,當(dāng)寫緩存收到讀10請(qǐng)求后,首先根據(jù)該讀10請(qǐng)求中的目標(biāo)RAID陣列編號(hào)查找對(duì)應(yīng)的RAID頭,查到RAID頭后再根據(jù)該讀10請(qǐng)求中的Iba地址,在與該RAID頭對(duì)應(yīng)的Block頭中查找Block頭;
[0091]如果查找到了對(duì)應(yīng)的Block頭,并且該Block頭中的所述第二 bitmap位圖中對(duì)應(yīng)bit位已置位為1,表明該block頭對(duì)應(yīng)的block數(shù)據(jù)塊之前已寫入了數(shù)據(jù),則直接讀取該數(shù)據(jù);
[0092]當(dāng)然,如果未查找到對(duì)應(yīng)的Block頭,或者該Block頭中的所述第二 bitmap位圖中對(duì)應(yīng)bit位置位為0,表明寫緩存中未記錄本次需要讀取的數(shù)據(jù),于是從所述目標(biāo)RAID陣列中讀取數(shù)據(jù),并返回讀取結(jié)果。由于此時(shí)所述目標(biāo)RAID陣列仍然處于失效狀態(tài),因此直接返回讀取失敗。
[0093]在本實(shí)施例中,還可以在寫緩存中預(yù)留部分存儲(chǔ)空間作為各目標(biāo)RAID陣列的競(jìng)爭使用空間。對(duì)于競(jìng)爭使用空間,任一 RAID頭即使將可用Block全部用完(即RAID頭中記錄的可用Block個(gè)數(shù)為O),如果競(jìng)爭使用空間還存在空Block數(shù)據(jù)塊,那么該RAID頭仍然可以使用競(jìng)爭使用空間中的空Block數(shù)據(jù)塊。對(duì)于競(jìng)爭使用空間的大小,用戶可以根據(jù)業(yè)務(wù)具體配置。在寫緩存中預(yù)留競(jìng)爭使用空間,可以使得在只有一個(gè)目標(biāo)RAID陣列失效時(shí),使用更多的備份空間,從而最大化延長失效備份的備份時(shí)間,為維護(hù)人員提供更長的故障排查時(shí)間。
[0094]在本實(shí)施例中,在目標(biāo)RAID陣列失效啟用寫緩存的同時(shí),此時(shí)維護(hù)人員可盡快去現(xiàn)場(chǎng)排查問題,重新恢復(fù)陣列。例如,對(duì)于硬盤轉(zhuǎn)接板故障,或者DEU框SAS連線松動(dòng)等磁盤本身并沒有問題的故障,維護(hù)人員可以通過轉(zhuǎn)接板或者SAS連線的更換恢復(fù)陣列。
[0095]當(dāng)失效的目標(biāo)RAID陣列恢復(fù)后,自動(dòng)觸發(fā)寫緩存將已寫入數(shù)據(jù)向該目標(biāo)RAID陣列進(jìn)行回寫,并在寫緩存中的已寫入數(shù)據(jù)全部回寫完成后,自動(dòng)禁用寫緩存。
[0096]在本實(shí)施例中,寫緩存在進(jìn)行回寫時(shí),由于Block頭中已記錄了對(duì)應(yīng)的Block數(shù)據(jù)塊在所述目標(biāo)RAID陣列中的Iba地址,因此可以根據(jù)該Iba地址,將已寫入數(shù)據(jù)按寫入順序回寫至目標(biāo)RAID陣列。比如說,可以將該Iba地址換算成pba地址(physics blockaddress,物理區(qū)塊地址),然后根據(jù)換算出的pba地址將回寫的數(shù)據(jù)寫入對(duì)應(yīng)的物理塊。其中,將該Iba地址換算成pba地址的具體實(shí)現(xiàn)請(qǐng)參考現(xiàn)有技術(shù),本發(fā)明不再詳述。
[0097]在本實(shí)施例中,在數(shù)據(jù)回寫期間,新的寫10將不再由寫緩存處理,新寫入的數(shù)據(jù)將直接寫入恢復(fù)后的目標(biāo)RAID陣列。然而,由于寫緩存在回寫期間,目標(biāo)RAID陣列上的部分有效數(shù)據(jù)仍然在寫緩存中,因此在回寫期間的讀10請(qǐng)求還是先由寫緩存處理,當(dāng)從寫緩存讀取數(shù)據(jù)時(shí)未命中對(duì)應(yīng)的數(shù)據(jù),再從目標(biāo)RAID陣列中讀取數(shù)據(jù)。
[0098]當(dāng)然,在具體實(shí)現(xiàn)時(shí),寫緩存也可以在目標(biāo)RAID陣列正常時(shí)就啟用,將該目標(biāo)RAID陣列已寫入數(shù)據(jù)同步地寫入寫緩存,從而即使該目標(biāo)RAID陣列失效是因?yàn)橛脖P故障導(dǎo)致的,目標(biāo)RAID陣列本地?cái)?shù)據(jù)也不會(huì)全部丟失。例如,對(duì)于視頻監(jiān)控領(lǐng)域的應(yīng)用,錄像寫入之前需要讀取錄像索引數(shù)據(jù),因此可以在RAID陣列正常時(shí)啟用寫緩存,將索引數(shù)據(jù)提前進(jìn)行備份,從而使得RAID陣列失效時(shí),也能正常的讀取錄像索引數(shù)據(jù)。
[0099]通過以上描述可知,本發(fā)明通過創(chuàng)建寫緩存,可以使用少量的存儲(chǔ)空間可同時(shí)為多個(gè)RAID陣列提供失效備份,減低了硬件成本;而且,由于所述寫緩存在RAID陣列失效時(shí)才啟用,可以有效的區(qū)分出陣列失效期間寫入的數(shù)據(jù),并且由于在RAID陣列失效再恢復(fù)時(shí),只回寫失效期間寫入的數(shù)據(jù),從而顯著降低了對(duì)業(yè)務(wù)的性能影響。該方案尤其適用于因非磁盤故障而導(dǎo)致的RAID陣列失效的數(shù)據(jù)備份和恢復(fù)。
[0100]請(qǐng)參見圖6,本發(fā)明還提出一種存儲(chǔ)數(shù)據(jù)的備份裝置60,應(yīng)用于RAID陣列,所述裝置60包括:
[0101]創(chuàng)建模塊601,用于為目標(biāo)RAID陣列創(chuàng)建寫緩存;其中,所述寫緩存在所述目標(biāo)RAID陣列失效時(shí)啟用;
[0102]讀寫模塊602,用于在所述目標(biāo)RAID陣列失效時(shí),在執(zhí)行寫1命令時(shí)將寫入所述目標(biāo)RAID陣列的數(shù)據(jù)寫入所述寫緩存,在執(zhí)行讀1命令時(shí)從所述寫緩存中讀取數(shù)據(jù);
[0103]回寫模塊603,用于在所述目標(biāo)RAID陣列恢復(fù)正常時(shí),自動(dòng)觸發(fā)所述寫緩存將已寫入數(shù)據(jù)回寫至所述目標(biāo)RAID陣列,并在回寫完成時(shí)禁用所述寫緩存。
[0104]在本實(shí)施例中,所述回寫模塊603進(jìn)一步用于:
[0105]在所述回寫過程中,如果需要執(zhí)行寫1命令,則將該寫1命令對(duì)應(yīng)的數(shù)據(jù)寫入所述目標(biāo)RAID陣列;
[0106]所述讀寫模塊602進(jìn)一步用于:
[0107]在所述回寫過程中,如果需要執(zhí)行讀1命令,則根據(jù)待讀取的數(shù)據(jù)信息從所述寫緩存中或者從所述目標(biāo)RAID陣列中讀取數(shù)據(jù)。
[0108]在本實(shí)施例中,所述寫緩存的存儲(chǔ)空間被劃分為全局頭、RAID頭、Block頭以及Block數(shù)據(jù)區(qū);
[0109]所述全局頭,包括寫緩存存儲(chǔ)空間的大小以及記錄各RAID頭是否已被分配的第一 bitmap 位圖;
[0110]所述RAID頭,根據(jù)使用寫緩存進(jìn)行失效備份的目標(biāo)RAID陣列個(gè)數(shù)被劃分為若干子區(qū)域,每個(gè)子區(qū)域分別對(duì)應(yīng)一個(gè)目標(biāo)RAID陣列,并記錄該目標(biāo)RAID陣列信息;所述目標(biāo)RAID陣列信息包括所述目標(biāo)RAID陣列的陣列編號(hào)、Block大小以及可用Block個(gè)數(shù);
[0111]所述Block頭,每個(gè)Block頭分別對(duì)應(yīng)一個(gè)Block數(shù)據(jù)塊,并分別記錄所述Block數(shù)據(jù)塊所屬RAID頭編號(hào)、該Block數(shù)據(jù)塊在目標(biāo)RAID陣列中的Iba地址以及記錄該Block數(shù)據(jù)塊是否已寫入數(shù)據(jù)的第二 bitmap位圖;
[0112]所述Block數(shù)據(jù)區(qū),包括若干個(gè)Block數(shù)據(jù)塊,所述Block數(shù)據(jù)塊的大小為所述RAID頭中記錄的所述Block大小。
[0113]在本實(shí)施例中,所述創(chuàng)建模塊601進(jìn)一步用于:
[0114]根據(jù)所述第一 bitmap位圖,為所述目標(biāo)RAID陣列分配一個(gè)未使用的RAID頭;
[0115]將所述目標(biāo)RAID陣列信息以及為所述目標(biāo)RAID陣列分配的可用Block個(gè)數(shù)記錄到對(duì)應(yīng)的RAID頭中。
[0116]在本實(shí)施例中,所述讀寫模塊602進(jìn)一步用于:
[0117]根據(jù)收到的寫10請(qǐng)求中的目標(biāo)RAID陣列編號(hào)查找對(duì)應(yīng)的RAID頭;
[0118]根據(jù)所述寫10請(qǐng)求中的Iba地址,在該RAID頭對(duì)應(yīng)的Block頭中查找Block頭;
[0119]如果查找到了對(duì)應(yīng)的Block頭,將數(shù)據(jù)寫入該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊中;
[0120]如果未查找到對(duì)應(yīng)的Block頭,則獲取一個(gè)空Block數(shù)據(jù)塊,將數(shù)據(jù)寫入該空Block數(shù)據(jù)塊中,同時(shí)在該空Block數(shù)據(jù)塊對(duì)應(yīng)的Block頭中記錄所屬RAID頭的編號(hào),在所述第二 bitmap位圖中記錄該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊已寫入數(shù)據(jù),并將該數(shù)據(jù)在目標(biāo)RAID陣列中的Iba地址記錄到該Block頭中;
[0121]其中,當(dāng)獲取到一個(gè)空數(shù)據(jù)塊時(shí),更新對(duì)應(yīng)的RAID頭中記錄的所述可用Block個(gè)數(shù)。
[0122]在本實(shí)施例中,所述讀寫模塊602進(jìn)一步用于:
[0123]根據(jù)收到的讀10請(qǐng)求中的目標(biāo)RAID陣列編號(hào)查找對(duì)應(yīng)的RAID頭;
[0124]根據(jù)所述讀10請(qǐng)求中的Iba地址,在該RAID頭對(duì)應(yīng)的Block頭中查找Block頭;
[0125]如果查找到了對(duì)應(yīng)的Block頭,并且該Block頭中的所述第二 bitmap位圖記錄該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊已寫入了數(shù)據(jù),則讀取該數(shù)據(jù);
[0126]如果未查找到對(duì)應(yīng)的Block頭,或者該Block頭中的所述第二 bitmap位圖記錄該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊未寫入數(shù)據(jù),從所述目標(biāo)RAID陣列中讀取數(shù)據(jù),并返回讀取結(jié)果O
[0127]本領(lǐng)域技術(shù)人員可以理解實(shí)施例中的裝置中的模塊可以按照實(shí)施例描述分布于實(shí)施例的裝置中,也可以進(jìn)行相應(yīng)變化位于不同于本實(shí)施例的一個(gè)或多個(gè)裝置中。上述實(shí)施例的模塊可以合并為一個(gè)模塊,也可進(jìn)一步拆分成多個(gè)子模塊。上述發(fā)明實(shí)施例編號(hào)僅僅為了描述,不代表實(shí)施例的優(yōu)劣。
[0128]以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明保護(hù)的范圍之內(nèi)。
【權(quán)利要求】
1.一種存儲(chǔ)數(shù)據(jù)的備份方法,應(yīng)用于RAID陣列,其特征在于,所述方法包括: 為目標(biāo)RAID陣列創(chuàng)建寫緩存;其中,所述寫緩存在所述目標(biāo)RAID陣列失效時(shí)啟用; 當(dāng)所述目標(biāo)RAID陣列失效時(shí),在執(zhí)行寫1命令時(shí)將寫入所述目標(biāo)RAID陣列的數(shù)據(jù)寫入所述寫緩存,在執(zhí)行讀1命令時(shí)從所述寫緩存中讀取數(shù)據(jù); 當(dāng)所述目標(biāo)RAID陣列恢復(fù)正常時(shí),自動(dòng)觸發(fā)所述寫緩存將已寫入數(shù)據(jù)回寫至所述目標(biāo)RAID陣列,并在回寫完成時(shí)禁用所述寫緩存。
2.如權(quán)利要求1所述的方法,其特征在于,所述方法還包括: 在所述回寫過程中,如果需要執(zhí)行寫1命令,則將該寫1命令對(duì)應(yīng)的數(shù)據(jù)寫入所述目標(biāo)RAID陣列; 在所述回寫過程中,如果需要執(zhí)行讀1命令,則根據(jù)待讀取的數(shù)據(jù)信息從所述寫緩存中或者從所述目標(biāo)RAID陣列中讀取數(shù)據(jù)。
3.如權(quán)利要求1所述的方法,其特征在于,所述寫緩存的存儲(chǔ)空間被劃分為全局頭、RAID頭、Block頭以及Block數(shù)據(jù)區(qū); 所述全局頭,記錄寫緩存存儲(chǔ)空間的大小以及各RAID頭是否已被分配的第一 bitmap位圖; 所述RAID頭,根據(jù)使用寫緩存進(jìn)行失效備份的目標(biāo)RAID陣列個(gè)數(shù)被劃分為若干子區(qū)域,每個(gè)子區(qū)域分別對(duì)應(yīng)一個(gè)目標(biāo)RAID陣列,并記錄該目標(biāo)RAID陣列信息;所述目標(biāo)RAID陣列信息包括所述目標(biāo)RAID陣列的陣列編號(hào)、Block大小以及可用Block個(gè)數(shù); 所述Block頭,每個(gè)Block頭分別對(duì)應(yīng)一個(gè)Block數(shù)據(jù)塊,并分別記錄所述Block數(shù)據(jù)塊所屬RAID頭編號(hào)、該Block數(shù)據(jù)塊在目標(biāo)RAID陣列中的Iba地址以及記錄該Block數(shù)據(jù)塊是否已寫入數(shù)據(jù)的第二 bitmap位圖; 所述Block數(shù)據(jù)區(qū),包括若干個(gè)Block數(shù)據(jù)塊,所述Block數(shù)據(jù)塊的大小為所述RAID頭中記錄的所述Block大小。
4.如權(quán)利要求3所述的方法,其特征在于,所述為目標(biāo)RAID陣列創(chuàng)建寫緩存包括: 根據(jù)所述第一 bitmap位圖,為所述目標(biāo)RAID陣列分配一個(gè)未使用的RAID頭; 將所述目標(biāo)RAID陣列信息以及為所述目標(biāo)RAID陣列分配的可用Block個(gè)數(shù)記錄到對(duì)應(yīng)的RAID頭中。
5.如權(quán)利要求3所述的方法,其特征在于,所述將寫入所述目標(biāo)RAID陣列的存儲(chǔ)數(shù)據(jù)寫入所述寫緩存包括: 根據(jù)收到的寫10請(qǐng)求中的目標(biāo)RAID陣列編號(hào)查找對(duì)應(yīng)的RAID頭;根據(jù)所述寫10請(qǐng)求中的Iba地址,在該RAID頭對(duì)應(yīng)的Block頭中查找Block頭;如果查找到了對(duì)應(yīng)的Block頭,將數(shù)據(jù)寫入該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊中;如果未查找到對(duì)應(yīng)的Block頭,則獲取一個(gè)空Block數(shù)據(jù)塊,將數(shù)據(jù)寫入該空Block數(shù)據(jù)塊中,同時(shí)在該空Block數(shù)據(jù)塊對(duì)應(yīng)的Block頭中記錄所屬RAID頭的編號(hào),在所述第二bitmap位圖中記錄該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊已寫入數(shù)據(jù),并將該數(shù)據(jù)在目標(biāo)RAID陣列中的Iba地址記錄到該Block頭中; 其中當(dāng)獲取到一個(gè)空數(shù)據(jù)塊時(shí),更新對(duì)應(yīng)的RAID頭中記錄的所述可用Block個(gè)數(shù)。
6.如權(quán)利要求3所述的方法,其特征在于,所述從所述寫緩存中讀取數(shù)據(jù)包括: 根據(jù)收到的讀10請(qǐng)求中的目標(biāo)RAID陣列編號(hào)查找對(duì)應(yīng)的RAID頭; 根據(jù)所述讀1請(qǐng)求中的Iba地址,在該RAID頭對(duì)應(yīng)的Block頭中查找Block頭;如果查找到了對(duì)應(yīng)的Block頭,并且該Block頭中的所述第二 bitmap位圖記錄該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊已寫入了數(shù)據(jù),則讀取該數(shù)據(jù); 如果未查找到對(duì)應(yīng)的Block頭,或者該Block頭中的所述第二 bitmap位圖記錄該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊未寫入數(shù)據(jù),從所述目標(biāo)RAID陣列中讀取數(shù)據(jù),并返回讀取結(jié)果O
7.一種存儲(chǔ)數(shù)據(jù)的備份裝置,應(yīng)用于RAID陣列,其特征在于,所述裝置包括: 創(chuàng)建模塊,用于為目標(biāo)RAID陣列創(chuàng)建寫緩存;其中,所述寫緩存在所述目標(biāo)RAID陣列失效時(shí)啟用; 讀寫模塊,用于在所述目標(biāo)RAID陣列失效時(shí),在執(zhí)行寫1命令時(shí)將寫入所述目標(biāo)RAID陣列的數(shù)據(jù)寫入所述寫緩存,在執(zhí)行讀1命令時(shí)從所述寫緩存中讀取數(shù)據(jù); 回寫模塊,用于在所述目標(biāo)RAID陣列恢復(fù)正常時(shí),自動(dòng)觸發(fā)所述寫緩存將已寫入數(shù)據(jù)回寫至所述目標(biāo)RAID陣列,并在回寫完成時(shí)禁用所述寫緩存。
8.如權(quán)利要求7所述的裝置,其特征在于,所述回寫模塊進(jìn)一步用于: 在所述回寫過程中,如果需要執(zhí)行寫1命令,則將該寫1命令對(duì)應(yīng)的數(shù)據(jù)寫入所述目標(biāo)RAID陣列; 所述讀寫模塊進(jìn)一步用于: 在所述回寫過程中,如果需要執(zhí)行讀10命令,則根據(jù)待讀取的數(shù)據(jù)信息從所述寫緩存中或者從所述目標(biāo)RAID陣列中讀取數(shù)據(jù)。
9.如權(quán)利要求7所述的裝置,其特征在于,所述寫緩存的存儲(chǔ)空間被劃分為全局頭、RAID頭、Block頭以及Block數(shù)據(jù)區(qū); 所述全局頭,包括寫緩存存儲(chǔ)空間的大小以及記錄各RAID頭是否已被分配的第一bitmap 位圖; 所述RAID頭,根據(jù)使用寫緩存進(jìn)行失效備份的目標(biāo)RAID陣列個(gè)數(shù)被劃分為若干子區(qū)域,每個(gè)子區(qū)域分別對(duì)應(yīng)一個(gè)目標(biāo)RAID陣列,并記錄該目標(biāo)RAID陣列信息;所述目標(biāo)RAID陣列信息包括所述目標(biāo)RAID陣列的陣列編號(hào)、Block大小以及可用Block個(gè)數(shù); 所述Block頭,每個(gè)Block頭分別對(duì)應(yīng)一個(gè)Block數(shù)據(jù)塊,并分別記錄所述Block數(shù)據(jù)塊所屬RAID頭編號(hào)、該Block數(shù)據(jù)塊在目標(biāo)RAID陣列中的Iba地址以及記錄該Block數(shù)據(jù)塊是否已寫入數(shù)據(jù)的第二 bitmap位圖; 所述Block數(shù)據(jù)區(qū),包括若干個(gè)Block數(shù)據(jù)塊,所述Block數(shù)據(jù)塊的大小為所述RAID頭中記錄的所述Block大小。
10.如權(quán)利要求9所述的裝置,其特征在于,所述創(chuàng)建模塊進(jìn)一步用于: 根據(jù)所述第一 bitmap位圖,為所述目標(biāo)RAID陣列分配一個(gè)未使用的RAID頭; 將所述目標(biāo)RAID陣列信息以及為所述目標(biāo)RAID陣列分配的可用Block個(gè)數(shù)記錄到對(duì)應(yīng)的RAID頭中。
11.如權(quán)利要求9所述的裝置,其特征在于,所述讀寫模塊進(jìn)一步用于: 根據(jù)收到的寫10請(qǐng)求中的目標(biāo)RAID陣列編號(hào)查找對(duì)應(yīng)的RAID頭; 根據(jù)所述寫10請(qǐng)求中的Iba地址,在該RAID頭對(duì)應(yīng)的Block頭中查找Block頭; 如果查找到了對(duì)應(yīng)的Block頭,將數(shù)據(jù)寫入該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊中; 如果未查找到對(duì)應(yīng)的Block頭,則獲取一個(gè)空Block數(shù)據(jù)塊,將數(shù)據(jù)寫入該空Block數(shù)據(jù)塊中,同時(shí)在該空Block數(shù)據(jù)塊對(duì)應(yīng)的Block頭中記錄所屬RAID頭的編號(hào),在所述第二bitmap位圖中記錄該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊已寫入數(shù)據(jù),并將該數(shù)據(jù)在目標(biāo)RAID陣列中的Iba地址記錄到該Block頭中; 其中,當(dāng)獲取到一個(gè)空數(shù)據(jù)塊時(shí),更新對(duì)應(yīng)的RAID頭中記錄的所述可用Block個(gè)數(shù)。
12.如權(quán)利要求9所述的裝置,其特征在于,所述讀寫模塊進(jìn)一步用于: 根據(jù)收到的讀1請(qǐng)求中的目標(biāo)RAID陣列編號(hào)查找對(duì)應(yīng)的RAID頭; 根據(jù)所述讀1請(qǐng)求中的Iba地址,在該RAID頭對(duì)應(yīng)的Block頭中查找Block頭;如果查找到了對(duì)應(yīng)的Block頭,并且該Block頭中的所述第二 bitmap位圖記錄該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊已寫入了數(shù)據(jù),則讀取該數(shù)據(jù); 如果未查找到對(duì)應(yīng)的Block頭,或者該Block頭中的所述第二 bitmap位圖記錄該Block頭對(duì)應(yīng)的Block數(shù)據(jù)塊未寫入數(shù)據(jù),從所述目標(biāo)RAID陣列中讀取數(shù)據(jù),并返回讀取結(jié)果O
【文檔編號(hào)】G06F12/08GK104166601SQ201410401367
【公開日】2014年11月26日 申請(qǐng)日期:2014年8月14日 優(yōu)先權(quán)日:2014年8月14日
【發(fā)明者】余麗, 許勇 申請(qǐng)人:浙江宇視科技有限公司