專利名稱:一種raid6磁盤陣列寫性能的優(yōu)化方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計(jì)算機(jī)數(shù)據(jù)存儲(chǔ)領(lǐng)域,具體涉及一種RAID6級(jí)別磁盤陣列的寫性能優(yōu)化方法。
背景技術(shù):
隨著計(jì)算機(jī)技術(shù)和網(wǎng)絡(luò)通信技術(shù)的發(fā)展,信息化程度越來越高,人們對(duì)數(shù)據(jù)可靠性的要求也越來越高。磁盤陣列RAID (RedundantArray of Independent Disks)是可靠存儲(chǔ)系統(tǒng)領(lǐng)域中的一個(gè)典型裝置,磁盤陣列的工作原理與特征=RAID的基本結(jié)構(gòu)特征就是組合(Mriping),捆綁2個(gè)或多個(gè)物理磁盤成組,形成一個(gè)單獨(dú)的邏輯盤。RAID結(jié)構(gòu)被劃分為以下幾個(gè)級(jí)別。RAIDO級(jí)無冗余無校驗(yàn)的磁盤陣列。數(shù)據(jù)同時(shí)分布在各個(gè)磁盤驅(qū)動(dòng)器上,沒有容錯(cuò)能力,讀寫速度在RAID中最快,但因?yàn)槿魏我粋€(gè)磁盤驅(qū)動(dòng)器損壞都會(huì)使整個(gè)RAID系統(tǒng)失效,所以安全系數(shù)反倒比單個(gè)的磁盤驅(qū)動(dòng)器還要低。 RAIDl級(jí)鏡象磁盤陣列。每一個(gè)磁盤驅(qū)動(dòng)器都有一個(gè)鏡像磁盤驅(qū)動(dòng)器,鏡像磁盤驅(qū)動(dòng)器隨時(shí)保持與原磁盤驅(qū)動(dòng)器的內(nèi)容一致。RAIDl具有較高的安全性,但只有一半磁盤空間被用來存儲(chǔ)數(shù)據(jù)。RAID5級(jí)無獨(dú)立校驗(yàn)盤的奇偶校驗(yàn)磁盤陣列。同樣采用奇偶校驗(yàn)來檢查錯(cuò)誤, 但沒有獨(dú)立的校驗(yàn)盤,校驗(yàn)信息分布在各個(gè)磁盤驅(qū)動(dòng)器上。RAID6級(jí)和RAID5級(jí)很相似,但是RAID6級(jí)可以恢復(fù)任意雙盤出錯(cuò)。RAID6具有容忍陣列中雙盤同時(shí)出錯(cuò)的能力,因此跟其它磁盤陣列級(jí)別相比, RAID6能夠提供更高的數(shù)據(jù)可靠性。但是,RAID6在寫性能方面的開銷也是最大的。比如, RAID6磁盤陣列的一個(gè)校驗(yàn)條帶中存在P和Q兩個(gè)校驗(yàn)塊,每更新一個(gè)數(shù)據(jù)塊都會(huì)導(dǎo)致同校驗(yàn)條帶的兩個(gè)校驗(yàn)塊同時(shí)更新,對(duì)一個(gè)數(shù)據(jù)塊的寫請(qǐng)求會(huì)導(dǎo)致RAID6磁盤陣列進(jìn)行至少三次磁盤讀操作和三次磁盤寫操作。顯然,RAID6陣列的寫代價(jià)是非常高的,這也是限制它在實(shí)際環(huán)境中應(yīng)用的重要原因。傳統(tǒng)的RAID6磁盤陣列都是基于Reed-Solomon編碼的,每個(gè)校驗(yàn)條帶中的Q校驗(yàn)塊是采用有限域運(yùn)算而得到的,因此傳統(tǒng)的基于異或運(yùn)算的寫性能優(yōu)化方法如Parity Logging則不能直接運(yùn)用于Reed-Solomon編碼的RAID6磁盤陣列。目前也沒見其它針對(duì) RAID6磁盤陣列的寫性能優(yōu)化方法。
發(fā)明內(nèi)容
本發(fā)明提出一種RAID6磁盤陣列寫性能的優(yōu)化方法,采用一種結(jié)合日志盤的架構(gòu),使得RAID6的寫性能得到提升,尤其是在寫請(qǐng)求密集的時(shí)候作用更加明顯,解決現(xiàn)有的 RAID6級(jí)別磁盤陣列寫性能不高的問題。為實(shí)現(xiàn)本發(fā)明的目的所采用的技術(shù)方案如下一種RAID6磁盤陣列寫性能的優(yōu)化方法,包括如下步驟(1)在傳統(tǒng)RAID6磁盤陣列結(jié)構(gòu)外加一個(gè)日志盤,同時(shí)在內(nèi)存中設(shè)置一個(gè)Hash鏈表,用于記錄RAID6磁盤陣列中的數(shù)據(jù)塊對(duì)應(yīng)的日志記錄在日志盤中的位置地址信息。
(2)讀寫請(qǐng)求處理讀請(qǐng)求的處理與傳統(tǒng)的RAID6磁盤陣列相同,寫請(qǐng)求的處理分為以下兩個(gè)階段(I)預(yù)讀原始數(shù)據(jù)階段針對(duì)每個(gè)校驗(yàn)條帶,系統(tǒng)分別統(tǒng)計(jì)此次將被更新的數(shù)據(jù)塊的集合和不被更新的數(shù)據(jù)塊的集合在Hash鏈表中對(duì)應(yīng)Hash條目的數(shù)目,如果將被更新的數(shù)據(jù)塊的集合對(duì)應(yīng)Hash 條目的數(shù)目少,則采用讀改寫的方式;反之,則采用重構(gòu)寫的方式。在讀改寫方式下,針對(duì)校驗(yàn)條帶上此次將被更新的數(shù)據(jù)塊的集合中的每個(gè)數(shù)據(jù)塊,首先查詢?cè)摂?shù)據(jù)塊在Hash鏈表中是否存在對(duì)應(yīng)Hash條目。如果條目不存在,則需要讀取出該數(shù)據(jù)塊對(duì)應(yīng)的原始數(shù)據(jù)并放入日志緩沖區(qū),然后在Hash鏈表中創(chuàng)建一個(gè)該數(shù)據(jù)塊對(duì)應(yīng)的Hash條目,并在Hash條目的“初始數(shù)據(jù)地址”字段中記錄剛才讀出的原始數(shù)據(jù)寫入到日志盤中的地址。反之,如果該數(shù)據(jù)塊的對(duì)應(yīng)Hash條目已經(jīng)存在,則無需讀取并記錄該數(shù)據(jù)塊的原始數(shù)據(jù)。在重構(gòu)寫方式下,針對(duì)校驗(yàn)條帶上此次不被更新的數(shù)據(jù)塊的集合中的每一個(gè)數(shù)據(jù)塊,查詢?cè)摂?shù)據(jù)塊在Hash鏈表中是否存在對(duì)應(yīng)Hash條目。接下來的處理步驟跟讀改寫方式下相同如果Hash條目不存在則讀取并記錄該數(shù)據(jù)塊對(duì)應(yīng)的原始數(shù)據(jù)到日志盤中,并且為其在Hash鏈表中創(chuàng)建對(duì)應(yīng)Hash條目,并在Hash條目的“初始數(shù)據(jù)地址”字段中記錄剛才讀出的原始數(shù)據(jù)寫入到日志盤中的地址;如果Hash條目存在則無需讀取并記錄該數(shù)據(jù)塊的原始數(shù)據(jù)。(II)寫新數(shù)據(jù)階段針對(duì)校驗(yàn)條帶上每一個(gè)此次將被更新的數(shù)據(jù)塊,系統(tǒng)首先將其要寫入的新數(shù)據(jù)放入到日志緩沖區(qū)中。然后,如果該數(shù)據(jù)塊在Hash鏈表中已經(jīng)存在對(duì)應(yīng)的Hash條目,則將條目的“最新數(shù)據(jù)地址”欄更新為剛才寫入日志盤的新數(shù)據(jù)在日志盤中的地址;如果該數(shù)據(jù)塊在Hash鏈表中不存在對(duì)應(yīng)的Hash條目,則先在Hash鏈表中創(chuàng)建該數(shù)據(jù)塊對(duì)應(yīng)的Hash條目,然后再將剛才寫入日志盤的新數(shù)據(jù)在日志盤中的地址記錄在條目的“最新數(shù)據(jù)地址”欄中。接下來,系統(tǒng)將數(shù)據(jù)塊的寫請(qǐng)求下發(fā)到磁盤,在磁盤寫操作完成之后,該次寫請(qǐng)求即成功返回。(3)發(fā)生雙盤失效時(shí)恢復(fù)數(shù)據(jù)的步驟(I)如果兩個(gè)校驗(yàn)磁盤失效通過數(shù)據(jù)磁盤直接計(jì)算出最新的校驗(yàn)數(shù)據(jù),恢復(fù)校驗(yàn)磁盤。(II)兩個(gè)數(shù)據(jù)磁盤失效查詢丟失的數(shù)據(jù)塊在Hash鏈表中的對(duì)應(yīng)Hash條目。如果Hash條目存在,再查看Hash條目的“最新數(shù)據(jù)地址”字段是否為空。如果“最新數(shù)據(jù)地址”字段不為空,則按照“最新數(shù)據(jù)地址”直接從日志盤中讀出最新數(shù)據(jù)便可以恢復(fù)該數(shù)據(jù)塊。如果“最新數(shù)據(jù)地址”字段為空,則按照“初始數(shù)據(jù)地址”從日志盤中讀出初始數(shù)據(jù)便可以恢復(fù)該數(shù)據(jù)塊。如果不存在對(duì)應(yīng)Hash條目,則該數(shù)據(jù)塊未被更新過。針對(duì)校驗(yàn)條帶上每個(gè)未丟失的數(shù)據(jù)塊,查詢其在Hash鏈表中的對(duì)應(yīng)Hash條目。如果Hash條目不存在,在數(shù)據(jù)磁盤上的數(shù)據(jù)就是該數(shù)據(jù)塊的初始數(shù)據(jù);如果Hash條目存在,則按照條目中“初始數(shù)據(jù)地址”字段從日志盤中讀出該數(shù)據(jù)塊的初始數(shù)據(jù)。讀出了校驗(yàn)條帶上每個(gè)未丟失的數(shù)據(jù)塊的初始數(shù)據(jù)后,再結(jié)合校驗(yàn)塊的初始數(shù)據(jù),利用RAID6校驗(yàn)算法便可以計(jì)算出丟失的數(shù)據(jù)塊的初始數(shù)據(jù)。其初始數(shù)據(jù)便是恢復(fù)數(shù)據(jù)。(III) 一個(gè)數(shù)據(jù)盤和一個(gè)校驗(yàn)盤失效類似于情況II,首先查詢丟失的數(shù)據(jù)塊在Hash鏈表中的對(duì)應(yīng)Hash條目。如果 Hash條目存在,則可以從日志盤中直接恢復(fù)數(shù)據(jù);如果Hash條目不存在,則可以讀取校驗(yàn)條帶上的其它未丟失的數(shù)據(jù)塊和校驗(yàn)塊的原始數(shù)據(jù),然后按照RAID6校驗(yàn)算法恢復(fù)數(shù)據(jù)。 待丟失的數(shù)據(jù)塊恢復(fù)后,通過校驗(yàn)條帶上所有的數(shù)據(jù)塊計(jì)算出校驗(yàn)塊的最新數(shù)據(jù)。本發(fā)明基于一個(gè)普遍存在的現(xiàn)象,即RAID6磁盤陣列的寫性能不高。本發(fā)明通過采用一種RAID6磁盤陣列結(jié)合日志盤的新架構(gòu),包括存儲(chǔ)系統(tǒng)構(gòu)建方法、數(shù)據(jù)讀寫方法和磁盤失效后的數(shù)據(jù)恢復(fù)方法這三個(gè)具體方法,解決了 RAID6磁盤陣列寫性能不好的問題, 大大提升了 RAID6磁盤陣列的寫性能。
圖1為本發(fā)明系統(tǒng)架構(gòu)示意圖;圖2為本發(fā)明的Hash鏈表結(jié)構(gòu)示意圖;圖3為本發(fā)明的寫請(qǐng)求處理示意圖;圖4為本發(fā)明的恢復(fù)雙數(shù)據(jù)盤失效示意圖。
具體實(shí)施例方式下面結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明進(jìn)一步詳細(xì)說明。本發(fā)明的一種RAID6磁盤陣列寫性能的優(yōu)化方法,包括存儲(chǔ)系統(tǒng)構(gòu)建方法、數(shù)據(jù)讀寫方法和磁盤失效后的數(shù)據(jù)恢復(fù)方法這三個(gè)具體方法,具體如下(1)存儲(chǔ)系統(tǒng)構(gòu)建方法,組成架構(gòu)如圖1所示(1. 1)該存儲(chǔ)系統(tǒng)由傳統(tǒng)的RAID6陣列結(jié)構(gòu)外加一個(gè)日志盤組成。寫操作到來時(shí), 把相應(yīng)數(shù)據(jù)塊的原始數(shù)據(jù)或更新數(shù)據(jù)記錄到日志盤中。(1.2)在內(nèi)存中設(shè)置有一個(gè)Hash鏈表,如圖2所示。該Hash鏈表記錄了 RAID6陣列中數(shù)據(jù)塊的更新狀態(tài)以及數(shù)據(jù)塊在日志盤中對(duì)應(yīng)記錄位置的索引信息。LAB字段數(shù)據(jù)塊在RAID6陣列中的邏輯地址。0ri_Ad字段該數(shù)據(jù)塊的初始數(shù)據(jù)在日志盤中的地址。若數(shù)據(jù)塊的初始數(shù)據(jù)未記錄在日志盤中,則該字段的值為NULL。Cur_Ad字段該數(shù)據(jù)塊的最新數(shù)據(jù)在日志盤中的地址。若數(shù)據(jù)塊的最新數(shù)據(jù)未記錄在日志盤中,則該字段的值為NULL。 Next字段指向條目錄列表中下一個(gè)條目的指針。若當(dāng)前條目為列表中最后一個(gè)條目,則該字段的值為NULL。當(dāng)在Hash鏈表中查詢某個(gè)數(shù)據(jù)塊對(duì)應(yīng)的條目時(shí),首先將該數(shù)據(jù)塊的邏輯地址(LBA)進(jìn)行Hash得到一個(gè)整數(shù),再將該整數(shù)作為數(shù)組下標(biāo)找到數(shù)據(jù)塊條目所對(duì)應(yīng)的 Hash槽,然后順序遍歷掛在該Hash槽上的條目鏈表,如果鏈表上某個(gè)條目的LBA字段的數(shù)值與數(shù)據(jù)塊的邏輯地址相等,則該條目即為數(shù)據(jù)塊所對(duì)應(yīng)的條目。反之,如果遍歷完條目鏈表仍未找到滿足條件的條目,則該數(shù)據(jù)塊在Hash鏈表中不存在對(duì)應(yīng)條目。同理,當(dāng)在Hash 鏈表中為某個(gè)數(shù)據(jù)塊添加對(duì)應(yīng)的條目時(shí),也要先對(duì)數(shù)據(jù)塊的邏輯地址(LBA)進(jìn)行Hash找到對(duì)應(yīng)的Hash槽,然后再將數(shù)據(jù)塊的對(duì)應(yīng)條目添加到該Hash槽所指向的條目鏈表中。(1. 3)對(duì)日志盤的寫操作采取順序追加的方式。
(2)數(shù)據(jù)讀寫方法(2. 1)系統(tǒng)處理讀請(qǐng)求的流程與RAID6磁盤陣列相同。(2. 2)寫請(qǐng)求處理方法,如圖3所示首先,跟傳統(tǒng)的RAID6陣列一樣,系統(tǒng)將上層發(fā)下來的寫請(qǐng)求按照陣列結(jié)構(gòu)進(jìn)行分解,再將針對(duì)同一校驗(yàn)條帶的寫請(qǐng)求用條帶緩沖區(qū)組織起來。接下來,針對(duì)每個(gè)校驗(yàn)條帶,系統(tǒng)分別統(tǒng)計(jì)此次將被更新的數(shù)據(jù)塊的集合和不被更新的數(shù)據(jù)塊的集合在Hash鏈表中對(duì)應(yīng)Hash條目的數(shù)目,如果將被更新的數(shù)據(jù)塊的集合對(duì)應(yīng)Hash條目的數(shù)目少,則采用讀改寫的方式;反之,則采用重構(gòu)寫的方式。在讀改寫方式下,針對(duì)校驗(yàn)條帶上每一個(gè)此次將被更新的數(shù)據(jù)塊,首先查詢?cè)摂?shù)據(jù)塊在Hash鏈表中是否存在對(duì)應(yīng)條目。如果條目不存在,則說明該數(shù)據(jù)塊尚未更新過,其初始數(shù)據(jù)也未曾記錄到日志盤中。此時(shí),需要讀取出該數(shù)據(jù)塊對(duì)應(yīng)的原始數(shù)據(jù)并放入日志緩沖區(qū),然后在Hash鏈表中創(chuàng)建一個(gè)該數(shù)據(jù)塊對(duì)應(yīng)的條目,并在條目的“初始數(shù)據(jù)地址”字段(0ri_Ad)中記錄剛才讀出的原始數(shù)據(jù)寫入到日志盤中的地址。反之,如果該數(shù)據(jù)塊的對(duì)應(yīng)條目已經(jīng)存在,則說明該數(shù)據(jù)塊曾經(jīng)被更新過,或者其初始數(shù)據(jù)已經(jīng)被讀出并記錄到日志盤中。此時(shí)無需讀取并記錄該數(shù)據(jù)塊的原始數(shù)據(jù)。在重構(gòu)寫方式下,針對(duì)校驗(yàn)條帶上每一個(gè)此次不被更新的數(shù)據(jù)塊,查詢?cè)摂?shù)據(jù)塊在Hash鏈表中是否存在對(duì)應(yīng)條目。接下來的處理步驟跟讀改寫方式下相同如果Hash條目不存在則讀取并記錄該數(shù)據(jù)塊對(duì)應(yīng)的原始數(shù)據(jù)到日志盤中,并且為其在Hash鏈表中創(chuàng)建對(duì)應(yīng)Hash條目,并在Hash條目的“初始數(shù)據(jù)地址”字段(0ri_Ad)中記錄剛才讀出的原始數(shù)據(jù)寫入到日志盤中的地址;如果Hash條目存在則無需讀取并記錄該數(shù)據(jù)塊的原始數(shù)據(jù)。在讀原始數(shù)據(jù)階段完成之后,系統(tǒng)進(jìn)入寫新數(shù)據(jù)階段。在這個(gè)階段,如果新數(shù)據(jù)塊在Hash鏈表中已經(jīng)存在對(duì)應(yīng)的條目,則將條目的“最新數(shù)據(jù)地址”欄(Cur_Ad)更新為剛才寫入日志盤的新數(shù)據(jù)在日志盤中的地址;如果該數(shù)據(jù)塊在Hash鏈表中不存在對(duì)應(yīng)的條目, 則先在Hash鏈表中創(chuàng)建該數(shù)據(jù)塊對(duì)應(yīng)的條目,然后再將剛才寫入日志盤的新數(shù)據(jù)在日志盤中的地址記錄在條目的“最新數(shù)據(jù)地址”(Cur_Ad)欄中。接下來,系統(tǒng)將數(shù)據(jù)塊的寫請(qǐng)求下發(fā)到磁盤,在磁盤寫操作完成之后,該次寫請(qǐng)求即成功返回。(3)磁盤失效后的數(shù)據(jù)恢復(fù)方法陣列中發(fā)生雙盤失效的情況具體分為三種(3. 1)兩個(gè)校驗(yàn)磁盤失效。因?yàn)樾r?yàn)磁盤上的數(shù)據(jù)不是最新的,我們無需恢復(fù)出校驗(yàn)盤上的初始數(shù)據(jù)。由于數(shù)據(jù)磁盤都沒有失效,因此可以通過數(shù)據(jù)磁盤直接計(jì)算出最新的校驗(yàn)數(shù)據(jù)。(3. 2)兩個(gè)數(shù)據(jù)磁盤失效,如圖4所示系統(tǒng)陣列中發(fā)生雙盤失效意味著每個(gè)校驗(yàn)條帶上丟失了兩個(gè)數(shù)據(jù)塊。首先,查詢丟失的數(shù)據(jù)塊在Hash鏈表中的對(duì)應(yīng)條目。如果條目存在,再查看條目的“最新數(shù)據(jù)地址”字段(Cur_Ad)是否為空。如果“最新數(shù)據(jù)地址”字段不為空,則說明該數(shù)據(jù)塊被更新過,按照 “最新數(shù)據(jù)地址”(Cur_Ad)直接從日志盤中讀出最新數(shù)據(jù)便可以恢復(fù)該數(shù)據(jù)塊。如果“最新數(shù)據(jù)地址”字段(Cur_Ad)為空,則“初始數(shù)據(jù)地址”字段(0ri_Ad)必不為空,說明該數(shù)據(jù)塊未被更新過,但其初始數(shù)據(jù)已被記錄到日志盤中,因此,按照“初始數(shù)據(jù)地址”(0ri_Ad)從日志盤中讀出初始數(shù)據(jù)便可以恢復(fù)該數(shù)據(jù)塊。
如果某個(gè)丟失的數(shù)據(jù)塊在Hash鏈表中不存在對(duì)應(yīng)條目,則該數(shù)據(jù)塊未更新過,針對(duì)校驗(yàn)條帶上每個(gè)未丟失的數(shù)據(jù)塊,查詢其在Hash鏈表中的對(duì)應(yīng)條目。如果條目不存在, 說明該數(shù)據(jù)塊未更新過,在數(shù)據(jù)磁盤上的數(shù)據(jù)就是該數(shù)據(jù)塊的初始數(shù)據(jù);如果條目存在,則按照條目中“初始數(shù)據(jù)地址”字段(0ri_Ad)從日志盤中讀出該數(shù)據(jù)塊的初始數(shù)據(jù)。讀出了校驗(yàn)條帶上每個(gè)未丟失的數(shù)據(jù)塊的初始數(shù)據(jù)后,再結(jié)合校驗(yàn)塊的初始數(shù)據(jù),利用RAID6校驗(yàn)算法便可以計(jì)算出丟失的數(shù)據(jù)塊的初始數(shù)據(jù)。由于該數(shù)據(jù)塊未被更新過,其初始數(shù)據(jù)便是恢復(fù)數(shù)據(jù)。(3. —個(gè)數(shù)據(jù)盤和一個(gè)校驗(yàn)盤失效。RAID6陣列中的每個(gè)校驗(yàn)條帶上丟失了一個(gè)數(shù)據(jù)塊和一個(gè)校驗(yàn)塊。其數(shù)據(jù)恢復(fù)過程與兩個(gè)數(shù)據(jù)磁盤失效情況類似。首先恢復(fù)丟失的數(shù)據(jù)塊的數(shù)據(jù)。查詢丟失的數(shù)據(jù)塊在 Hash鏈表中的對(duì)應(yīng)Hash條目。如果Hash條目存在,則可以從日志盤中直接恢復(fù)數(shù)據(jù);如果條目不存在,則可以讀取校驗(yàn)條帶上的其他數(shù)據(jù)塊的原始數(shù)據(jù),然后按照RAID6校驗(yàn)算法恢復(fù)數(shù)據(jù)。待丟失數(shù)據(jù)塊的數(shù)據(jù)恢復(fù)之后,按照RAID6校驗(yàn)算法計(jì)算出校驗(yàn)塊的最新數(shù)據(jù)。
權(quán)利要求
1.一種RAID6磁盤陣列寫性能的優(yōu)化方法,具體包括如下步驟(1)在RAID6磁盤陣列結(jié)構(gòu)外設(shè)置日志盤,用于記錄RAID6磁盤陣列中的數(shù)據(jù)塊對(duì)應(yīng)的日志記錄,同時(shí)設(shè)置一個(gè)Hash鏈表,用于記錄所述日志記錄在日志盤中的位置地址信息;(2)讀寫請(qǐng)求處理,其中寫請(qǐng)求的處理包括(I)預(yù)讀原始數(shù)據(jù)階段首先,針對(duì)每個(gè)校驗(yàn)條帶,分別統(tǒng)計(jì)此次將被更新的數(shù)據(jù)塊的集合和不被更新的數(shù)據(jù)塊的集合在Hash鏈表中對(duì)應(yīng)Hash條目的數(shù)目;其次,根據(jù)所述將被更新或不被更新的數(shù)據(jù)塊的集合對(duì)應(yīng)Hash條目的數(shù)目,采用讀改寫或重構(gòu)寫的方式對(duì)數(shù)據(jù)塊進(jìn)行預(yù)讀處理;(II)寫新數(shù)據(jù)階段針對(duì)校驗(yàn)條帶上每一個(gè)此次將被更新的數(shù)據(jù)塊,首先將其要寫入的新數(shù)據(jù)放入到日志盤的日志緩沖區(qū)中,然后,如果該數(shù)據(jù)塊在Hash鏈表中已經(jīng)存在對(duì)應(yīng)的Hash條目,則將該 Hash條目的“最新數(shù)據(jù)地址”字段更新為剛才寫入日志盤的新數(shù)據(jù)在日志盤中的地址;如果該數(shù)據(jù)塊在Hash鏈表中不存在對(duì)應(yīng)的Hash條目,則先在Hash鏈表中創(chuàng)建該數(shù)據(jù)塊對(duì)應(yīng)的Hash條目,然后再將剛才寫入日志盤的新數(shù)據(jù)在日志盤中的地址記錄在條目的“最新數(shù)據(jù)地址”欄中;接下來,將數(shù)據(jù)塊的寫請(qǐng)求下發(fā)到磁盤,在磁盤寫操作完成之后,該次寫請(qǐng)求即成功返回;(3)發(fā)生雙盤失效時(shí)的數(shù)據(jù)恢復(fù)(I)如果兩個(gè)校驗(yàn)磁盤失效通過數(shù)據(jù)磁盤直接計(jì)算出最新的校驗(yàn)數(shù)據(jù),恢復(fù)校驗(yàn)磁盤;(II)如果兩個(gè)數(shù)據(jù)磁盤失效(A)查詢丟失的數(shù)據(jù)塊在Hash鏈表中的對(duì)應(yīng)Hash條目;(B)如果Hash條目存在,再查看Hash條目的“最新數(shù)據(jù)地址”字段是否為空,如果不為空,則直接從日志盤中讀出最新數(shù)據(jù)便可以恢復(fù)該數(shù)據(jù)塊,如果為空,則從日志盤中讀出初始數(shù)據(jù)便可以恢復(fù)該數(shù)據(jù)塊;(C)如果不存在對(duì)應(yīng)Hash條目,則該數(shù)據(jù)塊未被更新過,針對(duì)校驗(yàn)條帶上每個(gè)未丟失的數(shù)據(jù)塊,查詢其在Hash鏈表中的對(duì)應(yīng)Hash條目,如果對(duì)應(yīng)Hash條目不存在,在數(shù)據(jù)磁盤上的數(shù)據(jù)就是該數(shù)據(jù)塊的初始數(shù)據(jù);如果對(duì)應(yīng)Hash條目存在,則按照該對(duì)應(yīng)Hash條目中 “初始數(shù)據(jù)地址”字段從日志盤中讀出該數(shù)據(jù)塊的初始數(shù)據(jù);(D)讀出了校驗(yàn)條帶上每個(gè)未丟失的數(shù)據(jù)塊的初始數(shù)據(jù)后,再結(jié)合校驗(yàn)塊的初始數(shù)據(jù), 即可計(jì)算出丟失的數(shù)據(jù)塊的初始數(shù)據(jù),該初始數(shù)據(jù)即為恢復(fù)數(shù)據(jù);(III)一個(gè)數(shù)據(jù)盤和一個(gè)校驗(yàn)盤失效首先查詢丟失的數(shù)據(jù)塊在Hash鏈表中的對(duì)應(yīng)Hash條目,如果對(duì)應(yīng)的Hash條目存在, 則從日志盤中直接恢復(fù)數(shù)據(jù);如果Hash條目不存在,則讀取校驗(yàn)條帶上的其它未丟失的數(shù)據(jù)塊和校驗(yàn)塊的原始數(shù)據(jù),然后按照RAID6校驗(yàn)算法恢復(fù)數(shù)據(jù);然后,在待丟失的數(shù)據(jù)塊恢復(fù)后,通過校驗(yàn)條帶上所有的數(shù)據(jù)塊計(jì)算出校驗(yàn)塊的最新數(shù)據(jù)。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述的步驟O)中,如果校驗(yàn)條帶上將被更新的數(shù)據(jù)塊的集合比不被更新的數(shù)據(jù)塊的集合對(duì)應(yīng)Hash條目的數(shù)目少,則采用讀改寫的方式對(duì)數(shù)據(jù)塊進(jìn)行預(yù)讀處理;否則,采用重構(gòu)寫的方式對(duì)數(shù)據(jù)塊進(jìn)行預(yù)讀處理。
3.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,所述采用讀改寫方式對(duì)數(shù)據(jù)塊進(jìn)行預(yù)讀處理的具體過程為針對(duì)校驗(yàn)條帶上此次將被更新的數(shù)據(jù)塊的集合中的每個(gè)數(shù)據(jù)塊,首先查詢?cè)摂?shù)據(jù)塊在 Hash鏈表中是否存在對(duì)應(yīng)Hash條目,如果條目不存在,則需要讀取出該數(shù)據(jù)塊對(duì)應(yīng)的原始數(shù)據(jù)并放入日志盤的日志緩沖區(qū),然后在Hash鏈表中創(chuàng)建一個(gè)該數(shù)據(jù)塊對(duì)應(yīng)的Hash條目, 并在Hash條目的“初始數(shù)據(jù)地址”字段中記錄剛才讀出的原始數(shù)據(jù)寫入到日志盤中的地址;反之,如果該數(shù)據(jù)塊的對(duì)應(yīng)Hash條目已經(jīng)存在,則無需讀取并記錄該數(shù)據(jù)塊的原始數(shù)據(jù)。
4.根據(jù)權(quán)利要求1-3之一所述的方法,其特征在于,所述采用重構(gòu)寫方式對(duì)數(shù)據(jù)塊進(jìn)行預(yù)讀處理的具體過程為針對(duì)校驗(yàn)條帶上此次不被更新的數(shù)據(jù)塊的集合中的每一個(gè)數(shù)據(jù)塊,查詢?cè)摂?shù)據(jù)塊在 Hash鏈表中是否存在對(duì)應(yīng)Hash條目,接下來的處理步驟跟讀改寫方式下相同即如果Hash 條目不存在則讀取并記錄該數(shù)據(jù)塊對(duì)應(yīng)的原始數(shù)據(jù)到日志盤中,并且為其在Hash鏈表中創(chuàng)建對(duì)應(yīng)Hash條目,并在Hash條目的“初始數(shù)據(jù)地址”字段中記錄剛才讀出的原始數(shù)據(jù)寫入到日志盤中的地址;如果Hash條目存在則無需讀取并記錄該數(shù)據(jù)塊的原始數(shù)據(jù)。
全文摘要
一種RAID6磁盤陣列寫性能的優(yōu)化方法,具體包括如下步驟(1)在RAID6磁盤陣列結(jié)構(gòu)外設(shè)置日志盤,用于記錄RAID6磁盤陣列中的數(shù)據(jù)塊對(duì)應(yīng)的日志記錄,同時(shí)設(shè)置一個(gè)Hash鏈表,用于記錄所述日志記錄在日志盤中的位置地址信息;(2)讀寫請(qǐng)求處理,包括(I)預(yù)讀原始數(shù)據(jù)階段和(II)寫新數(shù)據(jù)階段;(3)發(fā)生雙盤失效時(shí)的數(shù)據(jù)恢復(fù),包括(I)如果兩個(gè)校驗(yàn)磁盤失效(II)如果兩個(gè)數(shù)據(jù)磁盤失效和(III)一個(gè)數(shù)據(jù)盤和一個(gè)校驗(yàn)盤失效的分別的處理過程。本發(fā)明通過采用一種RAID6磁盤陣列結(jié)合日志盤的新架構(gòu),解決了RAID6磁盤陣列寫性能不好的問題,大大提升了RAID6磁盤陣列的寫性能。
文檔編號(hào)G06F3/06GK102270102SQ20111011181
公開日2011年12月7日 申請(qǐng)日期2011年4月29日 優(yōu)先權(quán)日2011年4月29日
發(fā)明者馮丹, 劉建平, 劉景寧, 沙睿彬, 金超, 陳儉喜 申請(qǐng)人:華中科技大學(xué)