專利名稱:一種獨(dú)立冗余磁盤陣列系統(tǒng)及其初始化方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)系統(tǒng)及存儲(chǔ)領(lǐng)域,具體涉及一種RAID5 (Redundant Arrays of Inexpensive Disks,獨(dú)立冗余磁盤陣列)系統(tǒng)及其初始化方法。
背景技術(shù):
對(duì)于具有冗余校驗(yàn)信息的RAID5 (Redundant Arrays of Inexpensive Disks,獨(dú)立冗余磁盤陣列)系統(tǒng),RAID5新創(chuàng)建時(shí)各成員盤數(shù)據(jù)并不能保證條帶數(shù)據(jù)是一致性的.數(shù)據(jù)的不一致性使得系統(tǒng)無(wú)法按照正常流程處理主機(jī)IO請(qǐng)求,所得到的校驗(yàn)數(shù)據(jù)可能是錯(cuò)誤的,因此這些級(jí)別的RAID5創(chuàng)建時(shí)必須先進(jìn)行一致性初始化工作。典型的初始化方式是格式化所有成員盤,將所有成員盤數(shù)據(jù)寫零,即可保證RAID5分條數(shù)據(jù)符合偶校驗(yàn)。但RAID5初始化任務(wù)必須遍歷成員盤的所有數(shù)據(jù),這是一項(xiàng)非常耗時(shí)的工作,并且隨著磁盤的容量的增大,等待的時(shí)間就會(huì)更長(zhǎng)。另外初始化完成之前,RAID5無(wú)法響應(yīng)主機(jī)端IO請(qǐng)求,否則已寫入的數(shù)據(jù)可能被初始化操作覆蓋,或者產(chǎn)生數(shù)據(jù)錯(cuò)誤,因此初始化過(guò)程中RAID5無(wú)法響應(yīng)IO請(qǐng)求,無(wú)法滿足即插即用的需求。如何快速完成RAID5系統(tǒng)初始化工作,并為主機(jī)端可用成為一個(gè)急需解決的問(wèn)題。目前RAID5有兩種寫方式讀改寫和重構(gòu)寫。讀改寫一般用于小塊寫,重構(gòu)寫一般用于大塊寫。對(duì)于讀改寫來(lái)說(shuō),需要舊的校驗(yàn)數(shù)據(jù)的參與,所以,如果原來(lái)的條帶數(shù)據(jù)不一致的話,讀改寫由于依賴原來(lái)的校驗(yàn)值,經(jīng)過(guò)重新計(jì)算,會(huì)產(chǎn)生錯(cuò)誤的結(jié)果,條帶還是不一致,失去了冗余的作用。而如果進(jìn)行重構(gòu)寫的話,不需要舊的校驗(yàn)值參與計(jì)算,所以,新的結(jié)果是一致的,即使原來(lái)的條帶數(shù)據(jù)不一致,經(jīng)過(guò)重構(gòu)寫也變得一致。如果條帶的第一次寫請(qǐng)求到達(dá),就讓它做重構(gòu)寫,第一次寫之后,采用各自對(duì)應(yīng)的寫方式。也就是說(shuō)不用刻意地去做初始化,創(chuàng)建之后即可以投入使用。這樣,就需要記錄已經(jīng)寫過(guò)或者已同步過(guò)的區(qū)域,目前采用的是位圖標(biāo)記方式,即利用位圖中的一位對(duì)應(yīng)記錄一個(gè)條帶的同步情況。例如,某一條帶已同步,貝Ij該條帶對(duì)應(yīng)位圖中的位的值為I。若條帶不同步,則條帶對(duì)應(yīng)位圖中的位的值為O。顯而易見,上述位圖中的一位對(duì)應(yīng)一個(gè)條帶的同步情況在實(shí)際使用中會(huì)有很多限制。假設(shè)每個(gè)條帶4KB,對(duì)于2TB的磁盤,共用于記錄同步情況的位圖大約需要62MB,如果把位圖全部放在內(nèi)存中,會(huì)消耗很大的內(nèi)存,特別是有多個(gè)RAID5的系統(tǒng)。而如果只放在內(nèi)存中一部分位圖頁(yè)面,等用到的時(shí)候再去磁盤請(qǐng)求頁(yè)面,并把原來(lái)在內(nèi)存中的頁(yè)面換出,這樣是減少了內(nèi)存的消耗,但加大了磁盤的請(qǐng)求,很大的影響寫性能,特別是對(duì)于隨機(jī)寫。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問(wèn)題是,提供一種RAID5系統(tǒng)及其初始化方法,以使得創(chuàng)建之后即可投入使用。為了解決上述問(wèn)題,本發(fā)明公開了一種獨(dú)立冗余磁盤陣列RAID5系統(tǒng)初始化方法,包括
創(chuàng)建用于記錄RAID5中各區(qū)域的同步狀態(tài)的一級(jí)位圖,其中,所創(chuàng)建的一級(jí)位圖中的每一位分別記錄一個(gè)區(qū)域的同步狀態(tài),所述一個(gè)區(qū)域包括多個(gè)連續(xù)條帶;順序初始化各條帶時(shí),從所述一級(jí)位圖中讀取當(dāng)前要初始化的條帶所屬的區(qū)域?qū)?yīng)位的值,根據(jù)讀取值確定此區(qū)域已同步時(shí),繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化;根據(jù)讀取值確定此區(qū)域不同步時(shí),查找到此區(qū)域?qū)?yīng)的二級(jí)位圖,從所查找到的二級(jí)位圖中讀取當(dāng)前要初始化的條帶對(duì)應(yīng)位的值,根據(jù)讀取值確定此條帶已同步時(shí),繼續(xù)對(duì)下一條帶進(jìn)行順序初始化,根據(jù)讀取值確定此條帶不同步時(shí),對(duì)當(dāng)前要初始化的條帶進(jìn)行同步校驗(yàn)計(jì)算,使當(dāng)前所要初始化的條帶同步,將所述二級(jí)位圖中此條帶對(duì)應(yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值,再繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化;查找不到此區(qū)域?qū)?yīng)的二級(jí)位圖,則對(duì)當(dāng)前要初始化的條帶進(jìn)行同步校驗(yàn)計(jì)算,使當(dāng)前所要初始化的條帶同步,繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化。較佳地,上述方法在上述初始化過(guò)程中,還記錄初始化完成位置。較佳地,上述方法還包括在上述初始化過(guò)程中,接收寫請(qǐng)求,若所接收的寫請(qǐng)求所在的條帶的位置小于所記錄的初始化完成位置,則根據(jù)應(yīng)用場(chǎng)景選擇讀改寫或者重構(gòu)寫方式進(jìn)行寫操作。較佳地,上述方法中,若所接收的寫請(qǐng)求所在的條帶位圖大于所記錄的初始化完成位置,則查找寫請(qǐng)求所在的條帶所屬的區(qū)域?qū)?yīng)的二級(jí)位圖,若查找到該二級(jí)位圖,則從所查找到的二級(jí)位圖中讀取所接收到的寫請(qǐng)求所在的條帶對(duì)應(yīng)位的值,根據(jù)讀取值選擇相應(yīng)的寫方式進(jìn)行寫操作,若查找不到寫請(qǐng)求所在的條帶所屬的區(qū)域?qū)?yīng)的二級(jí)位圖,則利用空閑內(nèi)存塊創(chuàng)建該二級(jí)位圖,所創(chuàng)建的二級(jí)位圖中每一位僅記錄此區(qū)域中一條條帶的同步狀態(tài),再對(duì)寫請(qǐng)求所在的條帶進(jìn)行重構(gòu)寫,將所創(chuàng)建的二級(jí)位圖中此條帶對(duì)應(yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值。較佳地,上述方法中,根據(jù)讀取值選擇相應(yīng)的寫方式進(jìn)行寫操作的過(guò)程如下根據(jù)讀取的值確定此條帶已同步時(shí),按照應(yīng)用場(chǎng)景選擇讀改寫或者重構(gòu)寫方式進(jìn)行寫操作;根據(jù)讀取的值確定此條帶不同步時(shí),選擇重寫方式進(jìn)行寫操作,在寫操作結(jié)束后, 將所述二級(jí)位圖中此條帶對(duì)應(yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值。較佳地,上述方法中,當(dāng)所述二級(jí)位圖中記錄的每一條條帶均同步,則將所述一級(jí)位圖中該二級(jí)位圖對(duì)應(yīng)的區(qū)域?qū)?yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值,并釋放該二級(jí)位圖所占用的內(nèi)存塊。較佳地,上述方法還包括當(dāng)內(nèi)存使用超過(guò)設(shè)定比率時(shí),釋放長(zhǎng)時(shí)間未更新的二級(jí)位圖所占用的內(nèi)存塊。本發(fā)明還公開了一種獨(dú)立冗余磁盤陣列(RAID5)系統(tǒng),包括第一模塊,創(chuàng)建用于記錄RAID5中各區(qū)域的同步狀態(tài)的一級(jí)位圖,其中,所創(chuàng)建的一級(jí)位圖中的每一位分別記錄一個(gè)區(qū)域的同步狀態(tài),所述一個(gè)區(qū)域包括多個(gè)連續(xù)條帶;第二模塊,順序初始化各條帶時(shí),從所述一級(jí)位圖中讀取當(dāng)前要初始化的條帶所屬的區(qū)域?qū)?yīng)位的值;第三模塊,根據(jù)讀取值確定此區(qū)域已同步時(shí),繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化; 根據(jù)讀取值確定此區(qū)域不同步時(shí),查找到此區(qū)域?qū)?yīng)的二級(jí)位圖,從所查找到的二級(jí)位圖中讀取當(dāng)前要初始化的條帶對(duì)應(yīng)位的值,根據(jù)讀取值確定此條帶已同步時(shí),繼續(xù)對(duì)下一條帶進(jìn)行順序初始化,根據(jù)讀取值確定此條帶不同步時(shí),對(duì)當(dāng)前要初始化的條帶進(jìn)行同步校驗(yàn)計(jì)算,使當(dāng)前所要初始化的條帶同步,將所述二級(jí)位圖中此條帶對(duì)應(yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值,繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化,查找不到此區(qū)域?qū)?yīng)的二級(jí)位圖,則對(duì)當(dāng)前要初始化的條帶進(jìn)行同步校驗(yàn)計(jì)算,使當(dāng)前所要初始化的條帶同步,繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化。較佳地,上述系統(tǒng)中,所述第三模塊,在初始化過(guò)程中,還記錄初始化完成位置;此時(shí),該系統(tǒng)還包括第四模塊,在上述初始化過(guò)程中,接收寫請(qǐng)求,若所接收的寫請(qǐng)求所在的條帶的位置小于所記錄的初始化完成位置,則根據(jù)應(yīng)用場(chǎng)景選擇讀改寫或者重構(gòu)寫方式進(jìn)行寫操作;若所接收的寫請(qǐng)求所在的條帶位圖大于所記錄的初始化完成位置,則查找寫請(qǐng)求所在的條帶所屬的區(qū)域?qū)?yīng)的二級(jí)位圖,若查找到該二級(jí)位圖,則從所查找到的二級(jí)位圖中讀取所接收到的寫請(qǐng)求所在的條帶對(duì)應(yīng)位的值,根據(jù)讀取值選擇相應(yīng)的寫方式進(jìn)行寫操作, 若查找不到寫請(qǐng)求所在的條帶所屬的區(qū)域?qū)?yīng)的二級(jí)位圖,則利用空閑內(nèi)存塊創(chuàng)建該二級(jí)位圖,所創(chuàng)建的二級(jí)位圖中每一位僅記錄此區(qū)域中一條條帶的同步狀態(tài),再對(duì)寫請(qǐng)求所在的條帶進(jìn)行重構(gòu)寫,將所創(chuàng)建的二級(jí)位圖中此條帶對(duì)應(yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值。較佳地,上述系統(tǒng)中,所述第四模塊,在所述二級(jí)位圖中記錄的每一條條帶均同步,則將所述一級(jí)位圖中該二級(jí)位圖對(duì)應(yīng)的區(qū)域?qū)?yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值, 并釋放該二級(jí)位圖所占用的內(nèi)存塊。本申請(qǐng)技術(shù)方案,提出一種新的記錄條帶同步情況的位圖方式,使得RAID創(chuàng)建之后即可投入使用,且本申請(qǐng)技術(shù)方案提供的位圖方式占用內(nèi)存資源較小。
圖I為本實(shí)施例中順序初始化流程圖;圖2為本實(shí)施例中寫請(qǐng)求流程圖;圖3為本實(shí)施例中周期刷寫流程圖。
具體實(shí)施例方式為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚明白,下文將結(jié)合附圖對(duì)本發(fā)明技術(shù)方案作進(jìn)一步詳細(xì)說(shuō)明。需要說(shuō)明的是,在不沖突的情況下,本申請(qǐng)的實(shí)施例和實(shí)施例中的特征可以任意相互組合。實(shí)施例I在本實(shí)施例中,申請(qǐng)人提出在Iinux內(nèi)核中軟RAID基礎(chǔ)上,可采用位圖去標(biāo)記各區(qū)域的同步狀態(tài)(例如已經(jīng)寫過(guò)或者同步過(guò)的區(qū)域?qū)?yīng)的位圖中的位的取值為1),再根據(jù)標(biāo)記對(duì)應(yīng)的同步狀態(tài)來(lái)選擇合適的寫方式(如讀改寫或重構(gòu)寫),從而提高RAID初始化的效率。其中,本實(shí)施例中采用的位圖標(biāo)記方式,是位圖中的一位用于標(biāo)記多個(gè)連續(xù)條帶的同步狀態(tài),這是個(gè)粗粒度的劃分,相當(dāng)于位圖中的一位用于標(biāo)記多個(gè)連續(xù)條帶所組成的一個(gè)區(qū)域的同步狀態(tài)信息。假設(shè),位圖中的一位用于標(biāo)記16個(gè)連續(xù)條帶的同步狀態(tài)信息, 那么對(duì)于2TB的磁盤,其位圖大小不到4MB,這樣,可以把位圖信息全部放在內(nèi)存中,以減少與磁盤的交互,同時(shí)也減少了內(nèi)存消耗。由于位圖中的一位標(biāo)記16個(gè)條帶是否同步的狀態(tài)信息,當(dāng)這16個(gè)條帶都重構(gòu)寫過(guò)或者初始化過(guò),才將位圖中的這一位置為I (初始值為O)。 為了表示更細(xì)分的條帶的同步狀態(tài),當(dāng)對(duì)一個(gè)條帶有寫請(qǐng)求時(shí)候,先查看該條帶所屬的區(qū)域在位圖中所對(duì)應(yīng)的位的取值,如果該位的取值已經(jīng)置1,就說(shuō)明這個(gè)區(qū)域的16個(gè)條帶都同步了,即收到寫請(qǐng)求的條帶已同步;如果該條帶所屬的區(qū)域在位圖中所對(duì)應(yīng)的位的取值沒有置1,就分配一個(gè)內(nèi)存塊,至少有16個(gè)位,這個(gè)內(nèi)存塊用于創(chuàng)建二級(jí)位圖,來(lái)表示每個(gè)條帶的狀態(tài),然后就是對(duì)內(nèi)存塊中對(duì)應(yīng)的位進(jìn)行操作。直到這16個(gè)都置I 了,才把位圖對(duì)應(yīng)的位設(shè)置1,然后釋放掉這個(gè)內(nèi)存塊,當(dāng)然,要對(duì)這些內(nèi)存塊的數(shù)量進(jìn)行限制,以免過(guò)多使用內(nèi)存,如果達(dá)到最大數(shù)量,就需要有替換機(jī)制,釋放被替換出的內(nèi)存塊,給新的請(qǐng)求分配內(nèi)存塊。這個(gè)替換算法有很多實(shí)現(xiàn),只要合理就好。另外,較佳的方案中,將進(jìn)入最早的內(nèi)存塊換出,因?yàn)槿绻繉戇^(guò)的話,就應(yīng)該不在內(nèi)存中了,還在內(nèi)存中的話,就說(shuō)明很長(zhǎng)時(shí)間沒有請(qǐng)求,所以換出還是合理的。而對(duì)于已經(jīng)分配了的內(nèi)存塊,需要快速查找刪除等操作時(shí),可采用紅黑樹進(jìn)行管理,內(nèi)存塊對(duì)應(yīng)的位的在位圖頁(yè)面的順序編號(hào)(可以計(jì)算出)作為關(guān)鍵字,可以進(jìn)行有效率的查找,添加,刪除等操作。并且考慮到極端的情況下,因?yàn)樘鎿Q機(jī)制,會(huì)有位圖記錄丟失,但不會(huì)影響數(shù)據(jù)的正確性,那段條帶相當(dāng)于沒有初始化,如果有寫請(qǐng)求,就會(huì)再進(jìn)行一次重構(gòu)寫。并且還有順序初始化線程,所以,到最后會(huì)表明整個(gè)RAID5都已經(jīng)同步了。下面結(jié)合圖1,說(shuō)明順序初始化線程的具體過(guò)程,該過(guò)程包括如下步驟步驟100, 創(chuàng)建用于記錄RAID5中各區(qū)域的同步狀態(tài)的一級(jí)位圖,并初始化為0,其中,所創(chuàng)建的一級(jí)位圖中的每一位分別記錄一個(gè)區(qū)域的同步狀態(tài),一個(gè)區(qū)域包括多個(gè)連續(xù)條帶;需要說(shuō)明的是,上述步驟100操作是創(chuàng)建RAID時(shí)完成的。步驟200,查詢當(dāng)前要初始化的條帶包括的扇區(qū)是否達(dá)到最大數(shù)值,如果是,則表明順序初始化完畢,結(jié)果本流程,否則進(jìn)入步驟300 ;步驟300,從一級(jí)位圖中讀取當(dāng)前要初始化的條帶所屬的區(qū)域?qū)?yīng)位,確定該區(qū)域是否同步,如果是,直接返回步驟200對(duì)下一個(gè)條帶進(jìn)行初始化,否則進(jìn)入步驟400 ;本實(shí)施例中,當(dāng)一級(jí)位圖中區(qū)域?qū)?yīng)位置1,則表明該區(qū)域所包含的各條帶之前均已經(jīng)重構(gòu)寫過(guò),即包含這些條帶的區(qū)域已同步。步驟400,查找此區(qū)域?qū)?yīng)的二級(jí)位圖,若查找到,進(jìn)入步驟500,否則對(duì)當(dāng)前要初始化的條帶進(jìn)行同步校驗(yàn)計(jì)算,使當(dāng)前所要初始化的條帶同步,返回步驟200繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化。步驟500,從所查找到的二級(jí)位圖中讀取當(dāng)前要初始化的條帶對(duì)應(yīng)位的值,根據(jù)讀取值判斷此條帶是否已同步,如果是,返回步驟200繼續(xù)對(duì)下一條帶進(jìn)行順序初始化,否則對(duì)當(dāng)前要初始化的條帶進(jìn)行同步校驗(yàn)計(jì)算,使當(dāng)前所要初始化的條帶同步,將所述二級(jí)位圖中此條帶對(duì)應(yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值,再返回步驟200繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化。有些方案在上述順序初始化的過(guò)程中,還記錄初始化完成位置,記錄為place_seqinitο記錄初始化完成位置,主要是可以在初始化的同時(shí),進(jìn)行寫操作,即初始化線程和寫線程可同時(shí)運(yùn)行。下面再結(jié)合圖2,說(shuō)明初始化過(guò)程中具體的數(shù)據(jù)寫流程,該過(guò)程包括如下步驟a)判斷寫請(qǐng)求所在的條帶的位置是否小于plaCe_Seqinit,如果是,說(shuō)明已經(jīng)順序初始化過(guò)了,根據(jù)實(shí)際情況選擇讀改寫或者重構(gòu)寫方式,否則進(jìn)入步驟b)。該步驟中,根據(jù)實(shí)際情況選擇讀改寫還是重構(gòu)寫方式,主要指可按照本領(lǐng)域常規(guī)來(lái)選擇合適的寫方式,即根據(jù)磁盤要讀的數(shù)量,哪種方式讀盤數(shù)量少就采用哪個(gè),以減少讀操作而提高性能。例如寫請(qǐng)求所要讀的磁盤數(shù)量過(guò)大時(shí),可選用重構(gòu)寫方式,寫請(qǐng)求所要讀的磁盤數(shù)量較小時(shí),則可選用讀改寫方式。b)讀取一級(jí)位圖中寫請(qǐng)求所在的條帶所屬區(qū)域?qū)?yīng)位的值,根據(jù)所讀取的值判斷此條帶所屬區(qū)域是否同步,如果是,說(shuō)明整個(gè)區(qū)域的條帶都同步了,直接根據(jù)實(shí)際情況選擇讀改寫還是重構(gòu)寫,否則進(jìn)入步驟c)。c)判斷該條帶所屬區(qū)域?qū)?yīng)的二級(jí)位圖是否存在,如果存在,進(jìn)入步驟d),否則進(jìn)入步驟e);d)讀取二級(jí)位圖中寫請(qǐng)求所在條帶對(duì)應(yīng)位的值,根據(jù)所讀取的值判斷此條帶同步時(shí),如果是,直接根據(jù)實(shí)際情況選擇進(jìn)行讀改寫還是重構(gòu)寫,根據(jù)所讀取的值判斷此條帶不同步時(shí),對(duì)該條帶進(jìn)行重構(gòu)寫,并將二級(jí)位圖中寫請(qǐng)求所在條帶對(duì)應(yīng)位的值設(shè)置為已同步狀態(tài)對(duì)應(yīng)的值。如果二級(jí)位圖中記錄的每一條條帶均同步,則將所述一級(jí)位圖中該二級(jí)位圖對(duì)應(yīng)的區(qū)域?qū)?yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值,并釋放該二級(jí)位圖所占用的內(nèi)存塊。e)通過(guò)內(nèi)存塊為該條帶創(chuàng)建所屬區(qū)域?qū)?yīng)的二級(jí)位圖,并對(duì)該條帶進(jìn)行重構(gòu)寫, 將所創(chuàng)建的二級(jí)位圖中寫請(qǐng)求所在條帶對(duì)應(yīng)位的值設(shè)置為已同步狀態(tài)對(duì)應(yīng)的值,其中,所創(chuàng)建的二級(jí)位圖中每一位僅記錄此區(qū)域中一條條帶的同步狀態(tài)。有些方案中,還考慮到資源有限的問(wèn)題,故在創(chuàng)建二級(jí)位圖時(shí),先查看內(nèi)存塊的數(shù)量是否達(dá)到最大數(shù)值。如果沒有達(dá)到最大數(shù)值,就分配對(duì)應(yīng)的內(nèi)存塊以創(chuàng)建二級(jí)位圖,初始化為O。如果內(nèi)存塊的數(shù)量達(dá)到最大數(shù)值,則找出一個(gè)內(nèi)存塊釋放掉,給新的請(qǐng)求分配內(nèi)存塊創(chuàng)建二級(jí)位圖,初始化為O。其中,釋放內(nèi)存塊時(shí),可以鈄那些長(zhǎng)時(shí)間未更新(即)的二級(jí)位圖所占用的內(nèi)存塊釋放掉。另外,也可以按照資源利用率來(lái)釋放內(nèi)存塊,即使用的內(nèi)存塊數(shù)量與內(nèi)存塊總數(shù)量的比值達(dá)到一定設(shè)定值,就可以開始釋放內(nèi)存塊。另外,由于位圖信息的操作都是在緩存中進(jìn)行,必要時(shí)才進(jìn)行真正的磁盤操作。但是,在這個(gè)過(guò)程中有可能發(fā)生斷電或重啟的情況,位圖記錄就會(huì)丟失,就會(huì)產(chǎn)生位圖記錄與實(shí)際不一樣的情況。但即使位圖記錄和實(shí)際不同,由于位圖晚于實(shí)際情況,中途斷電再啟動(dòng),那段條帶相當(dāng)于沒有初始化,就會(huì)再進(jìn)行一次重構(gòu)寫,可以保證數(shù)據(jù)的正確性。對(duì)實(shí)時(shí)性要求不是很高,如果同步寫回到磁盤的話,會(huì)帶來(lái)很大的性能損失。所以,需要考慮性能的影響,可以設(shè)置把位圖信息周期性地寫回磁盤。這里通過(guò)一個(gè)線程去實(shí)現(xiàn),可以設(shè)置喚醒的時(shí)間,圖3所示即為周期刷寫位圖的過(guò)程。因?yàn)槲粓D頁(yè)面比較多,所以,讓線程每一次只查詢一定數(shù)目的頁(yè)面。檢查這一批是否已經(jīng)掃描了足夠數(shù)量的頁(yè)面,掃描完就退出,否則就查詢一個(gè)頁(yè)面。如果頁(yè)面沒有標(biāo)記為臟頁(yè),就停止對(duì)該頁(yè)面的操作,查詢下一個(gè)頁(yè)面。如果標(biāo)記為臟頁(yè),就把該頁(yè)面寫回磁盤。清楚該頁(yè)的臟標(biāo)記。實(shí)施例2本實(shí)施例介紹一種RAID5系統(tǒng),至少包括第一模塊、第二模塊和第三模塊。下面介紹各模塊的功能。第一模塊,創(chuàng)建用于記錄RAID5中各區(qū)域的同步狀態(tài)的一級(jí)位圖,其中,所創(chuàng)建的一級(jí)位圖中的每一位分別記錄一個(gè)區(qū)域的同步狀態(tài),一個(gè)區(qū)域包括多個(gè)連續(xù)條帶;第二模塊,順序初始化各條帶時(shí),從一級(jí)位圖中讀取當(dāng)前要初始化的條帶所屬的區(qū)域?qū)?yīng)位的值;第三模塊,根據(jù)讀取值確定此區(qū)域已同步時(shí),繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化; 根據(jù)讀取值確定此區(qū)域不同步時(shí),查找此區(qū)域?qū)?yīng)的二級(jí)位圖,從所查找到的二級(jí)位圖中讀取當(dāng)前要初始化的條帶對(duì)應(yīng)位的值,根據(jù)讀取值確定此條帶已同步時(shí),繼續(xù)對(duì)下一條帶進(jìn)行順序初始化,根據(jù)讀取值確定此條帶不同步時(shí),對(duì)當(dāng)前要初始化的條帶進(jìn)行同步校驗(yàn)計(jì)算,使當(dāng)前所要初始化的條帶同步,將所述二級(jí)位圖中此條帶對(duì)應(yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值,繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化,查找不到此區(qū)域?qū)?yīng)的二級(jí)位圖,則對(duì)當(dāng)前要初始化的條帶進(jìn)行同步校驗(yàn)計(jì)算,使當(dāng)前所要初始化的條帶同步,繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化。另外,上述第三模塊,在初始化過(guò)程中,還可以記錄初始化完成位置。記錄初始化完成位置的主要作用是,可以在初始化的同時(shí)進(jìn)行寫操作,即雙線程運(yùn)行。此時(shí),上述系統(tǒng)可增加一個(gè)第四模塊,該模塊在初始化過(guò)程中,接收寫請(qǐng)求,若所接收的寫請(qǐng)求所在的條帶的位置小于所記錄的初始化完成位置,則根據(jù)應(yīng)用場(chǎng)景選擇讀改寫或者重構(gòu)寫方式進(jìn)行寫操作。若所接收的寫請(qǐng)求所在的條帶位圖大于所記錄的初始化完成位置,則查找寫請(qǐng)求所在的條帶所屬的區(qū)域?qū)?yīng)的二級(jí)位圖,若查找到該二級(jí)位圖,則從所查找到的二級(jí)位圖中讀取所接收到的寫請(qǐng)求所在的條帶對(duì)應(yīng)位的值,根據(jù)讀取值選擇相應(yīng)的寫方式進(jìn)行寫操作,若查找不到寫請(qǐng)求所在的條帶所屬的區(qū)域?qū)?yīng)的二級(jí)位圖,則利用空閑內(nèi)存塊創(chuàng)建該二級(jí)位圖,所創(chuàng)建的二級(jí)位圖中每一位僅記錄此區(qū)域中一條條帶的同步狀態(tài),再對(duì)寫請(qǐng)求所在的條帶進(jìn)行重構(gòu)寫,將所創(chuàng)建的二級(jí)位圖中此條帶對(duì)應(yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值。寫操作以及創(chuàng)建二級(jí)位圖的具體過(guò)程可參見實(shí)施例1,在此不再贅述。還有一些方案中,第四模塊,在二級(jí)位圖中記錄的每一條條帶均同步時(shí),將一級(jí)位圖中該二級(jí)位圖對(duì)應(yīng)的區(qū)域?qū)?yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值,并釋放該二級(jí)位圖所占用的內(nèi)存塊。優(yōu)選方案中,還考慮到第四模塊,可以在內(nèi)存使用超過(guò)設(shè)定比率時(shí),釋放長(zhǎng)時(shí)間未更新的二級(jí)位圖所占用的內(nèi)存塊,以提高資源利用率。本領(lǐng)域普通技術(shù)人員可以理解上述方法中的全部或部分步驟可通過(guò)程序來(lái)指令相關(guān)硬件完成,所述程序可以存儲(chǔ)于計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中,如只讀存儲(chǔ)器、磁盤或光盤等??蛇x地,上述實(shí)施例的全部或部分步驟也可以使用一個(gè)或多個(gè)集成電路來(lái)實(shí)現(xiàn)。相應(yīng)地,上述實(shí)施例中的各模塊/單元可以采用硬件的形式實(shí)現(xiàn),也可以采用軟件功能模塊的形式實(shí)現(xiàn)。本申請(qǐng)不限制于任何特定形式的硬件和軟件的結(jié)合。以上所述,僅為本發(fā)明的較佳實(shí)例而已,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種獨(dú)立冗余磁盤陣列(RAID5)系統(tǒng)初始化方法,其特征在于,該方法包括創(chuàng)建用于記錄RAID5中各區(qū)域的同步狀態(tài)的一級(jí)位圖,其中,所創(chuàng)建的一級(jí)位圖中的每一位分別記錄一個(gè)區(qū)域的同步狀態(tài),所述一個(gè)區(qū)域包括多個(gè)連續(xù)條帶;順序初始化各條帶時(shí),從所述一級(jí)位圖中讀取當(dāng)前要初始化的條帶所屬的區(qū)域?qū)?yīng)位的值,根據(jù)讀取值確定此區(qū)域已同步時(shí),繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化;根據(jù)讀取值確定此區(qū)域不同步時(shí),查找到此區(qū)域?qū)?yīng)的二級(jí)位圖,從所查找到的二級(jí)位圖中讀取當(dāng)前要初始化的條帶對(duì)應(yīng)位的值,根據(jù)讀取值確定此條帶已同步時(shí),繼續(xù)對(duì)下一條帶進(jìn)行順序初始化,根據(jù)讀取值確定此條帶不同步時(shí),對(duì)當(dāng)前要初始化的條帶進(jìn)行同步校驗(yàn)計(jì)算,使當(dāng)前所要初始化的條帶同步,將所述二級(jí)位圖中此條帶對(duì)應(yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值,再繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化;查找不到此區(qū)域?qū)?yīng)的二級(jí)位圖,則對(duì)當(dāng)前要初始化的條帶進(jìn)行同步校驗(yàn)計(jì)算,使當(dāng)前所要初始化的條帶同步,繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化。
2.如權(quán)利要求I所述的方法,其特征在于,在上述初始化過(guò)程中,還記錄初始化完成位置。
3.如權(quán)利要求2所述的方法,其特征在于,該方法還包括在上述初始化過(guò)程中,接收寫請(qǐng)求,若所接收的寫請(qǐng)求所在的條帶的位置小于所記錄的初始化完成位置,則根據(jù)應(yīng)用場(chǎng)景選擇讀改寫或者重構(gòu)寫方式進(jìn)行寫操作。
4.如權(quán)利要求3所述的方法,其特征在于,若所接收的寫請(qǐng)求所在的條帶位圖大于所記錄的初始化完成位置,則查找寫請(qǐng)求所在的條帶所屬的區(qū)域?qū)?yīng)的二級(jí)位圖,若查找到該二級(jí)位圖,則從所查找到的二級(jí)位圖中讀取所接收到的寫請(qǐng)求所在的條帶對(duì)應(yīng)位的值,根據(jù)讀取值選擇相應(yīng)的寫方式進(jìn)行寫操作, 若查找不到寫請(qǐng)求所在的條帶所屬的區(qū)域?qū)?yīng)的二級(jí)位圖,則利用空閑內(nèi)存塊創(chuàng)建該二級(jí)位圖,所創(chuàng)建的二級(jí)位圖中每一位僅記錄此區(qū)域中一條條帶的同步狀態(tài),再對(duì)寫請(qǐng)求所在的條帶進(jìn)行重構(gòu)寫,將所創(chuàng)建的二級(jí)位圖中此條帶對(duì)應(yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值。
5.如權(quán)利要求4所述的方法,其特征在于,根據(jù)讀取值選擇相應(yīng)的寫方式進(jìn)行寫操作的過(guò)程如下根據(jù)讀取的值確定此條帶已同步時(shí),按照應(yīng)用場(chǎng)景選擇讀改寫或者重構(gòu)寫方式進(jìn)行寫操作;根據(jù)讀取的值確定此條帶不同步時(shí),選擇重寫方式進(jìn)行寫操作,在寫操作結(jié)束后,將所述二級(jí)位圖中此條帶對(duì)應(yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值。
6.如權(quán)利要求I至5任一項(xiàng)所述的方法,其特征在于,當(dāng)所述二級(jí)位圖中記錄的每一條條帶均同步,則將所述一級(jí)位圖中該二級(jí)位圖對(duì)應(yīng)的區(qū)域?qū)?yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值,并釋放該二級(jí)位圖所占用的內(nèi)存塊。
7.如權(quán)利要求6所述的方法,其特征在于,該方法還包括當(dāng)內(nèi)存使用超過(guò)設(shè)定比率時(shí),釋放長(zhǎng)時(shí)間未更新的二級(jí)位圖所占用的內(nèi)存塊。
8.一種獨(dú)立冗余磁盤陣列(RAID5)系統(tǒng),其特征在于,該系統(tǒng)包括第一模塊,創(chuàng)建用于記錄RAID5中各區(qū)域的同步狀態(tài)的一級(jí)位圖,其中,所創(chuàng)建的一級(jí)位圖中的每一位分別記錄一個(gè)區(qū)域的同步狀態(tài),所述一個(gè)區(qū)域包括多個(gè)連續(xù)條帶;第二模塊,順序初始化各條帶時(shí),從所述一級(jí)位圖中讀取當(dāng)前要初始化的條帶所屬的區(qū)域?qū)?yīng)位的值;第三模塊,根據(jù)讀取值確定此區(qū)域已同步時(shí),繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化;根據(jù)讀取值確定此區(qū)域不同步時(shí),查找到此區(qū)域?qū)?yīng)的二級(jí)位圖,從所查找到的二級(jí)位圖中讀取當(dāng)前要初始化的條帶對(duì)應(yīng)位的值,根據(jù)讀取值確定此條帶已同步時(shí),繼續(xù)對(duì)下一條帶進(jìn)行順序初始化,根據(jù)讀取值確定此條帶不同步時(shí),對(duì)當(dāng)前要初始化的條帶進(jìn)行同步校驗(yàn)計(jì)算,使當(dāng)前所要初始化的條帶同步,將所述二級(jí)位圖中此條帶對(duì)應(yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值,繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化,查找不到此區(qū)域?qū)?yīng)的二級(jí)位圖,則對(duì)當(dāng)前要初始化的條帶進(jìn)行同步校驗(yàn)計(jì)算,使當(dāng)前所要初始化的條帶同步,繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化。
9.如權(quán)利要求8所述的系統(tǒng),其特征在于,所述第三模塊,在初始化過(guò)程中,還記錄初始化完成位置;此時(shí),該系統(tǒng)還包括第四模塊,在上述初始化過(guò)程中,接收寫請(qǐng)求,若所接收的寫請(qǐng)求所在的條帶的位置小于所記錄的初始化完成位置,則根據(jù)應(yīng)用場(chǎng)景選擇讀改寫或者重構(gòu)寫方式進(jìn)行寫操作;若所接收的寫請(qǐng)求所在的條帶位圖大于所記錄的初始化完成位置,則查找寫請(qǐng)求所在的條帶所屬的區(qū)域?qū)?yīng)的二級(jí)位圖,若查找到該二級(jí)位圖,則從所查找到的二級(jí)位圖中讀取所接收到的寫請(qǐng)求所在的條帶對(duì)應(yīng)位的值,根據(jù)讀取值選擇相應(yīng)的寫方式進(jìn)行寫操作,若查找不到寫請(qǐng)求所在的條帶所屬的區(qū)域?qū)?yīng)的二級(jí)位圖,則利用空閑內(nèi)存塊創(chuàng)建該二級(jí)位圖, 所創(chuàng)建的二級(jí)位圖中每一位僅記錄此區(qū)域中一條條帶的同步狀態(tài),再對(duì)寫請(qǐng)求所在的條帶進(jìn)行重構(gòu)寫,將所創(chuàng)建的二級(jí)位圖中此條帶對(duì)應(yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值。
10.如權(quán)利要求8或9所述的系統(tǒng),其特征在于,所述第四模塊,在所述二級(jí)位圖中記錄的每一條條帶均同步,則將所述一級(jí)位圖中該二級(jí)位圖對(duì)應(yīng)的區(qū)域?qū)?yīng)位的值設(shè)置成已同步狀態(tài)對(duì)應(yīng)的值,并釋放該二級(jí)位圖所占用的內(nèi)存塊。
全文摘要
本發(fā)明公開了一種RAID5系統(tǒng)及其初始化方法,涉及計(jì)算機(jī)系統(tǒng)及存儲(chǔ)領(lǐng)域。本發(fā)明公開的方法包括創(chuàng)建一級(jí)位圖,順序初始化各條帶時(shí),從一級(jí)位圖中讀取當(dāng)前要初始化的條帶所屬的區(qū)域?qū)?yīng)位的值,確定此區(qū)域已同步時(shí),繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化;確定此區(qū)域不同步時(shí),查找到此區(qū)域?qū)?yīng)的二級(jí)位圖,從所查找到的二級(jí)位圖中讀取當(dāng)前要初始化的條帶對(duì)應(yīng)位的值,確定此條帶已同步時(shí),繼續(xù)對(duì)下一條帶進(jìn)行順序初始化,確定此條帶不同步時(shí),或者查找不到此區(qū)域?qū)?yīng)的二級(jí)位圖時(shí),對(duì)當(dāng)前要初始化的條帶進(jìn)行同步校驗(yàn)計(jì)算,使當(dāng)前所要初始化的條帶同步,繼續(xù)對(duì)下一個(gè)條帶進(jìn)行順序初始化。本申請(qǐng)技術(shù)方案使得RAID創(chuàng)建之后即可投入使用。
文檔編號(hào)G06F3/06GK102609224SQ201210035448
公開日2012年7月25日 申請(qǐng)日期2012年2月16日 優(yōu)先權(quán)日2012年2月16日
發(fā)明者古世磊, 施培任 申請(qǐng)人:浪潮(北京)電子信息產(chǎn)業(yè)有限公司