專利名稱:連續(xù)數(shù)據(jù)存儲(chǔ)中面向raid5的寫(xiě)操作優(yōu)化設(shè)計(jì)方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計(jì)算機(jī)數(shù)據(jù)存儲(chǔ)技術(shù)領(lǐng)域,涉及一種在連續(xù)數(shù)據(jù)存儲(chǔ)中面向RAID 5的寫(xiě)操作優(yōu)化設(shè)計(jì)方法。
背景技術(shù):
RAID (Redundant Array of Ind印endent Disk,獨(dú)立冗余磁盤(pán)陣列)技術(shù),是將N臺(tái)硬盤(pán)通過(guò)RAID Controller(分Hardware, Software)結(jié)合成虛擬單臺(tái)大容量的硬盤(pán)使用。RAID的采用為存儲(chǔ)系統(tǒng)(或者服務(wù)器的內(nèi)置存儲(chǔ))帶來(lái)巨大利益,其中提高傳輸速率和提供容錯(cuò)功能是最大的優(yōu)點(diǎn)。 RAID 5是一種存儲(chǔ)性能、數(shù)據(jù)安全和存儲(chǔ)成本兼顧的存儲(chǔ)解決方案。RAID 5不對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行備份,而是把數(shù)據(jù)和相對(duì)應(yīng)的奇偶校驗(yàn)信息存儲(chǔ)到組成RAID 5的各個(gè)磁盤(pán)上,并且奇偶校驗(yàn)信息和相對(duì)應(yīng)的數(shù)據(jù)分別存儲(chǔ)于不同的磁盤(pán)上,冗余校驗(yàn)數(shù)據(jù)均衡分布于所有磁盤(pán)中。當(dāng)RAID 5的一個(gè)磁盤(pán)數(shù)據(jù)發(fā)生損壞后,利用剩下的數(shù)據(jù)和相應(yīng)的奇偶校驗(yàn)信息去恢復(fù)被損壞的數(shù)據(jù)。 當(dāng)構(gòu)造冗余校驗(yàn)數(shù)據(jù)時(shí),如果寫(xiě)入的數(shù)據(jù)正好是RAID 5的一個(gè)條帶,則直接從這些數(shù)據(jù)計(jì)算出一個(gè)校驗(yàn)塊,否則就要使用重構(gòu)寫(xiě)或讀改寫(xiě)。其中,重構(gòu)寫(xiě)是讀取未修改磁盤(pán)的數(shù)據(jù)塊,與要寫(xiě)入的數(shù)據(jù)塊一起計(jì)算得到校驗(yàn)塊;讀改寫(xiě)是讀取需要修改磁盤(pán)的舊數(shù)據(jù)塊和舊的校驗(yàn)塊計(jì)算得到校驗(yàn)塊。為計(jì)算校驗(yàn)塊,重構(gòu)寫(xiě)或讀改寫(xiě)需要額外的1/0開(kāi)銷和延時(shí),這就降低了RAID 5的吞吐能力。 另一方面,當(dāng)向RAID 5寫(xiě)入的數(shù)據(jù)塊不連續(xù)(隨機(jī)寫(xiě))時(shí),磁盤(pán)就需要尋道到新
的數(shù)據(jù)塊位置,此時(shí),隨機(jī)1/0傳輸性能是連續(xù)1/0傳輸性能的35%甚至更低。 因此,如何避免重構(gòu)寫(xiě)或讀改寫(xiě)的開(kāi)銷,并保持?jǐn)?shù)據(jù)塊的連續(xù)性,避免磁盤(pán)尋道開(kāi)
銷,成為亟待解決的問(wèn)題。
發(fā)明內(nèi)容
本發(fā)明的目的是為解決上述技術(shù)問(wèn)題,提出一種連續(xù)數(shù)據(jù)存儲(chǔ)中面向RAID5的寫(xiě)操作優(yōu)化設(shè)計(jì)方法。 本發(fā)明方法所采用的技術(shù)方案如下 在連續(xù)數(shù)據(jù)存儲(chǔ)應(yīng)用中,通過(guò)在計(jì)算機(jī)上運(yùn)行一個(gè)聚合驅(qū)動(dòng)程序,對(duì)應(yīng)用程序的寫(xiě)數(shù)據(jù)塊進(jìn)行聚合重組,即,在連續(xù)數(shù)據(jù)存儲(chǔ)時(shí),在內(nèi)存緩沖區(qū)內(nèi)保存應(yīng)用程序發(fā)出的寫(xiě)數(shù)據(jù)塊,并構(gòu)造一個(gè)與RAID 5的完整條帶長(zhǎng)度相等的對(duì)齊數(shù)據(jù)塊,之后,使對(duì)齊數(shù)據(jù)塊在RAID 5上恰好占滿整個(gè)條帶,再發(fā)送給RAID 5,以實(shí)現(xiàn)對(duì)RAID 5的整條寫(xiě);同時(shí),對(duì)向RAID 5寫(xiě)入的數(shù)據(jù)塊進(jìn)行排序,使它們連續(xù)地寫(xiě)入相鄰的條帶,由此實(shí)現(xiàn)RAID 5的連續(xù)1/0傳輸; 其中,所述聚合驅(qū)動(dòng)程序位于應(yīng)用程序和RAID 5之間,包括兩個(gè)線程和一個(gè)隊(duì)列Q ;兩個(gè)線程中,一個(gè)是接收線程,其完成如下工作監(jiān)控和接收應(yīng)用程序發(fā)送給RAID 5的寫(xiě)請(qǐng)求,并把接收到的寫(xiě)請(qǐng)求加入到隊(duì)列Q ;另一個(gè)是發(fā)送線程,其完成如下工作當(dāng)隊(duì)列Q不為空時(shí),從隊(duì)列Q中取出并處理寫(xiě)請(qǐng)求。
該方法同樣適用于RAID 6。
下面對(duì)其進(jìn)行具體說(shuō)明 首先,獲取RAID 5磁盤(pán)陣列的參數(shù),包括條帶長(zhǎng)度(Stripe Length,—個(gè)條帶在單塊磁盤(pán)上的占用區(qū)域的大小,以字節(jié)為單位),條帶深度(Stripe D印th,組成RAID 5的
磁盤(pán)數(shù)目)。 其中,一個(gè)完整的條帶長(zhǎng)度(Full Stripe Length)等于條帶長(zhǎng)度乘以條帶深度。
上述兩個(gè)參數(shù)可通過(guò)人工指定,或者調(diào)用API接口函數(shù),或者運(yùn)行測(cè)試程序等方式獲得。 其次,在計(jì)算機(jī)上運(yùn)行一個(gè)聚合驅(qū)動(dòng)程序,該程序位于應(yīng)用程序和RAID 5之間。
所述聚合驅(qū)動(dòng)程序包括兩個(gè)線程和一個(gè)隊(duì)列Q。兩個(gè)線程中,一個(gè)是接收線程,其完成如下工作監(jiān)控和接收應(yīng)用程序發(fā)送給RAID 5的寫(xiě)請(qǐng)求,并把接收到的寫(xiě)請(qǐng)求加入到隊(duì)列Q。另一個(gè)是發(fā)送線程,其完成如下工作當(dāng)隊(duì)列Q不為空時(shí),從隊(duì)列Q中取出并處理寫(xiě)請(qǐng)求。 設(shè)寫(xiě)請(qǐng)求具有如下格式 ssize—t write(struct file氺filp, const char氺buf, size—t cnt, 1off—t氺off)其中,filp為設(shè)備文件指針,指一個(gè)打開(kāi)的設(shè)備,例如RAID 5磁盤(pán)陣列;buf為用戶空間緩沖區(qū)指針,指向待寫(xiě)數(shù)據(jù)的起始地址;cnt為寫(xiě)數(shù)據(jù)塊的大??;off是偏移量,也就是用戶數(shù)據(jù)寫(xiě)入設(shè)備文件的起始位置,RAID 5會(huì)將其轉(zhuǎn)換為對(duì)應(yīng)的LBA。為方便說(shuō)明,將寫(xiě)請(qǐng)求記作(buf, cnt, off)。 在上述基礎(chǔ)上,進(jìn)行以下操作 對(duì)于每一路數(shù)據(jù),當(dāng)應(yīng)用程序提交寫(xiě)請(qǐng)求時(shí),每次寫(xiě)入數(shù)據(jù)塊的起始邏輯塊地址LBA與前一次寫(xiě)操作的末尾LBA是相鄰的,即數(shù)據(jù)被存儲(chǔ)到連續(xù)的邏輯塊中。如果為每一路數(shù)據(jù)分別建立一個(gè)RAID 5,可以簡(jiǎn)化聚合驅(qū)動(dòng)程序的設(shè)計(jì),但這樣需要更多的磁盤(pán)個(gè)數(shù),校驗(yàn)數(shù)據(jù)需占據(jù)更多的存儲(chǔ)空間。因此,將多路數(shù)據(jù)存儲(chǔ)在一個(gè)RAID 5中。
應(yīng)用程序把N路數(shù)據(jù)塊依次發(fā)送給RAID 5,由接收線程接收后將其加入到隊(duì)列Q。設(shè)定每次采集并寫(xiě)入的數(shù)據(jù)塊大小相等,D(i, j)表示第i路采集到的第j項(xiàng)數(shù)據(jù),0《i《N-l,O《j。 對(duì)于每一路數(shù)據(jù),發(fā)送線程為它創(chuàng)建一個(gè)發(fā)送緩沖區(qū),記作bufsend[i](0《i《N-l),其中,緩沖區(qū)大小為RAID 5的完整條帶長(zhǎng)度Fu11 Stripe Length,簡(jiǎn)記為fullstripelen。緩沖區(qū)緩存的字節(jié)數(shù)記為filled[i],緩沖區(qū)空閑的字節(jié)數(shù)記為residiml[i]。 filled[i]+residiml [i] = fullstripelen。 發(fā)送線程從隊(duì)列Q中取出寫(xiě)請(qǐng)求,設(shè)該請(qǐng)求對(duì)應(yīng)于第i路數(shù)據(jù),將其發(fā)送到對(duì)應(yīng)的發(fā)送緩沖區(qū)bufsend[i]。對(duì)于bufsend[i],初始其residual [i]為fullstripelen,offsend[i] = i*fullstripelen。設(shè)bufsend[i]接收到的寫(xiě)請(qǐng)求表示為(buf , cnt, off)。buf send [i]處理寫(xiě)請(qǐng)求的流程如下
1)接收第i路數(shù)據(jù)的寫(xiě)請(qǐng)求(buf, cnt, off); 2)判斷buf send [i]是否可容納該寫(xiě)請(qǐng)求的數(shù)據(jù)塊,即,比較cnt和residual [i]。如果cnt小于residual [i],轉(zhuǎn)到3);否則轉(zhuǎn)到6); 3)從該寫(xiě)請(qǐng)求的數(shù)據(jù)緩沖區(qū)復(fù)制cnt個(gè)字節(jié)到bufsend[i]; 4)修改residual [i]為residual [i] _cnt ; 5)在隊(duì)列Q中刪除該寫(xiě)請(qǐng)求,然后轉(zhuǎn)到1)執(zhí)行; 6)把該寫(xiě)請(qǐng)求的前residual [i]個(gè)字節(jié)復(fù)制到bufsend[i]; 7)將該寫(xiě)請(qǐng)求修改為(buf+residiml[i], cnt-residiml[i], off+residiml[i])。
艮卩,修改buf為buf+residiml[i], 修改cnt為cnt_residiml [i], 修改off為
off+residiml [i]; 8)由于經(jīng)步驟6)已將bufsend[i]填滿,此時(shí),發(fā)送線程將bufsend[i]中的數(shù)據(jù)寫(xiě)入RAID 5,其偏移量為offsend[i],長(zhǎng)度為fullstripelen。 9)偏移量指針offsend[i]增加N*fullstripelen,并設(shè)置residual [i]為fullstripelen。 10)判斷cnt是否為零,若cnt = 0,表明該寫(xiě)請(qǐng)求的數(shù)據(jù)已經(jīng)發(fā)送完畢,轉(zhuǎn)到5)執(zhí)行,否則,轉(zhuǎn)到2)執(zhí)行。 由于應(yīng)用程序設(shè)定每路數(shù)據(jù)塊的大小相等,所以N個(gè)發(fā)送緩沖區(qū)是依次順序填滿的。當(dāng)緩沖區(qū)bufsend[O]至bufsend[N-l]依次填滿后,發(fā)送線程就會(huì)把這N個(gè)緩沖區(qū)中的數(shù)據(jù)逐個(gè)發(fā)送給RAID 5,并被順序?qū)懭氲絉AID 5的第kN到第(kN)+N_1條帶中,這里k=0,1,2,...。由此實(shí)現(xiàn)了對(duì)RAID 5條帶的整條寫(xiě),避免了重構(gòu)寫(xiě)或讀改寫(xiě)。由于對(duì)條帶的寫(xiě)入同時(shí)也是連續(xù)的,對(duì)RAID 5表現(xiàn)為順序?qū)懀苊饬穗S機(jī)寫(xiě)操作所需的磁頭尋道。
按照如上方法存儲(chǔ)的數(shù)據(jù),第i路數(shù)據(jù)存儲(chǔ)在第i、N+i、2N+i,. . . , kN+l,...個(gè)條帶中。讀取每一路數(shù)據(jù)時(shí),LBA線性增加,磁頭順序移動(dòng),磁頭尋道開(kāi)銷將比隨機(jī)讀要低。
為了保證應(yīng)用程序重啟后,bufsend[i]寫(xiě)入的整條數(shù)據(jù)仍然與RAID 5的條帶邊
界對(duì)齊,聚合驅(qū)動(dòng)程序需要監(jiān)控應(yīng)用程序?qū)υO(shè)備文件的打開(kāi)與關(guān)閉操作。當(dāng)應(yīng)用程序關(guān)閉設(shè)備文件,發(fā)送線程最后一次向RAID 5寫(xiě)數(shù)據(jù)時(shí),緩沖區(qū)bufsend[i]可能沒(méi)有填滿,因此需要記錄當(dāng)前offsend[i]及緩存字節(jié)數(shù)filled[i] (fullstripelen-residual [i])的值后,再把bufsend[i]中的數(shù)據(jù)寫(xiě)入RAID 5 ;當(dāng)設(shè)備文件再次打開(kāi)時(shí),首先根據(jù)記錄的offsend[i]及filled[i],在RAID 5中從offsend[i]位置開(kāi)始,讀出filled[i]個(gè)字節(jié)到buf send [i]后,再進(jìn)入正常工作狀態(tài)。 對(duì)于連續(xù)數(shù)據(jù)保護(hù)系統(tǒng)(CDP),本發(fā)明同樣適用。塊級(jí)CDP系統(tǒng)需要將捕獲的磁盤(pán)
數(shù)據(jù)塊寫(xiě)操作保存在CDP日志中,由于日志區(qū)中的數(shù)據(jù)是連續(xù)寫(xiě)入的,并且每一個(gè)日志數(shù)
據(jù)項(xiàng)(磁盤(pán)塊數(shù)據(jù))都具有相同的大小,因此同樣適合使用本方法進(jìn)行優(yōu)化,每一個(gè)要保護(hù)
的磁盤(pán)相當(dāng)于一路數(shù)據(jù)。 有益效果 本發(fā)明方法具有以下優(yōu)點(diǎn) 1)實(shí)現(xiàn)了 RAID 5條帶的整條寫(xiě)。本發(fā)明通過(guò)緩沖組合應(yīng)用程序發(fā)出的寫(xiě)數(shù)據(jù)塊,每次向RAID 5寫(xiě)入一個(gè)完整的條帶,避免了構(gòu)造RAID 5校驗(yàn)數(shù)據(jù)所需的重構(gòu)寫(xiě)或讀改寫(xiě)的開(kāi)銷。 2)實(shí)現(xiàn)了多個(gè)條帶的連續(xù)寫(xiě)。本發(fā)明通過(guò)設(shè)置多個(gè)緩沖區(qū),使多路數(shù)據(jù)組合后的完整的條帶連續(xù)地寫(xiě)入到RAID 5中,實(shí)現(xiàn)了RAID 5的連續(xù)寫(xiě),避免了磁盤(pán)尋道開(kāi)銷。
3)通過(guò)RAID 5條帶的整條寫(xiě)和多個(gè)條帶的連續(xù)寫(xiě),降低了 RAID 5系統(tǒng)的I/O開(kāi)
銷,提高了它的吞吐能力。 該發(fā)明同樣適用于RAID 6。
圖1為向N個(gè)發(fā)送緩沖區(qū)分發(fā)隊(duì)列Q中寫(xiě)請(qǐng)求的示意 圖2為寫(xiě)請(qǐng)求的處理流程圖; 圖3為視頻監(jiān)控?cái)?shù)據(jù)在RAID 5條帶中的存儲(chǔ)情況;
圖4為本發(fā)明實(shí)施例的寫(xiě)操作示意圖。
具體實(shí)施例方式
下面結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明方法做進(jìn)一步詳細(xì)說(shuō)明。
結(jié)合基于塊級(jí)的多路視頻監(jiān)控,詳細(xì)闡述本方法的工作流程。 對(duì)于每一路監(jiān)控?cái)?shù)據(jù),當(dāng)視頻監(jiān)控程序提交寫(xiě)請(qǐng)求時(shí),每次寫(xiě)入數(shù)據(jù)塊的起始邏輯塊地址LBA與前一次寫(xiě)操作的末尾LBA是相鄰的,即數(shù)據(jù)被存儲(chǔ)到連續(xù)的邏輯塊中。如果為每一路監(jiān)控?cái)?shù)據(jù)分別建立一個(gè)RAID 5,可以簡(jiǎn)化聚合驅(qū)動(dòng)程序的設(shè)計(jì),但這樣需要更多的磁盤(pán)個(gè)數(shù),校驗(yàn)數(shù)據(jù)需占據(jù)更多的存儲(chǔ)空間。因此,可將多路視頻監(jiān)控?cái)?shù)據(jù)存儲(chǔ)在一個(gè)RAID 5中。 視頻監(jiān)控程序把N路采集數(shù)據(jù)依次發(fā)送給RAID 5,由接收線程接收后將其加入到隊(duì)列Q。設(shè)定每次采集并寫(xiě)入的數(shù)據(jù)塊大小相等,D(i, j)表示第i路視頻采集到的第j項(xiàng)數(shù)據(jù),O《i《N-l,O《j。 對(duì)于每一路數(shù)據(jù),發(fā)送線程為它創(chuàng)建一個(gè)發(fā)送緩沖區(qū),記作bufsend[i](0《i《N-l),其中,緩沖區(qū)大小為RAID 5的完整條帶長(zhǎng)度Fu11 Stripe Length,簡(jiǎn)記為fullstripelen,緩沖區(qū)緩存的字節(jié)數(shù)記為f illed[i],緩沖區(qū)空閑的字節(jié)數(shù)記為residiml[i]。 filled[i]+residiml [i] = fullstripelen。 發(fā)送線程從隊(duì)列Q中取出寫(xiě)請(qǐng)求,設(shè)該請(qǐng)求對(duì)應(yīng)于第i路視頻數(shù)據(jù),將其發(fā)送到對(duì)應(yīng)的發(fā)送緩沖區(qū)bufsend[i],如圖1所示。對(duì)于緩沖區(qū)bufsend[i],初始其residual [i]為fullstripelen, offsend[i] = i*fullstripelen,設(shè)bufsend[i]接收到的寫(xiě)請(qǐng)求表示為(buf, cnt, off) 。 bufsend[i]處理寫(xiě)請(qǐng)求的工作流程如圖2所示,過(guò)程如下
1)接收第i路數(shù)據(jù)寫(xiě)請(qǐng)求(buf, cnt, off); 2)判斷bufsend[i]緩沖區(qū)是否可容納該寫(xiě)請(qǐng)求的數(shù)據(jù)塊,即,比較cnt和
residual [i]。如果cnt小于residual [i],轉(zhuǎn)到3);否則轉(zhuǎn)到6); 3)從該寫(xiě)請(qǐng)求的數(shù)據(jù)緩沖區(qū)復(fù)制cnt個(gè)字節(jié)到buf send [i]; 4)修改residual [i]為residual [i] _cnt ; 5)在隊(duì)列Q中刪除該寫(xiě)請(qǐng)求,轉(zhuǎn)到1)執(zhí)行; 6)把該寫(xiě)請(qǐng)求的前residual [i]個(gè)字節(jié)復(fù)制到buf send [i]; 7)將該寫(xiě)請(qǐng)求修改為(buf+residiml[i], cnt-residiml[i], off+residiml[i])。
艮卩修改buf為buf+residiml[i], 修改cnt為cnt_residiml [i], 修改off為
off+residiml [i];由于經(jīng)步驟6)已將bufsend[i]填滿,此時(shí),發(fā)送線程將bufsend[i]中的數(shù)據(jù)寫(xiě)入RAID 5(偏移量為offsend[i],長(zhǎng)度為fullstripelen)。 9)偏移量指針offsend[i]增加N*fullstripelen,設(shè)置residual [i]為fullstripelen。 10)判斷cnt是否為零,若cnt = 0,表明該寫(xiě)請(qǐng)求的數(shù)據(jù)已經(jīng)發(fā)送完畢,轉(zhuǎn)到5)執(zhí)行,否則,轉(zhuǎn)到2)執(zhí)行。 由于應(yīng)用程序設(shè)定每路數(shù)據(jù)塊的大小相等,所以N個(gè)發(fā)送緩沖區(qū)是依次順序填滿的。當(dāng)緩沖區(qū)bufsend[O]至bufsend[N-l]依次填滿后,發(fā)送線程就會(huì)把這N個(gè)緩沖區(qū)中的數(shù)據(jù)逐個(gè)發(fā)送給RAID 5,并被順序?qū)懭氲絉AID 5的第kN到第(kN)+N-1條帶中,這里k=0,1,2,…,見(jiàn)圖3。由此實(shí)現(xiàn)了對(duì)RAID 5條帶的整條寫(xiě),避免了重構(gòu)寫(xiě)或讀改寫(xiě);由于對(duì)條帶的寫(xiě)入同時(shí)也是連續(xù)的,對(duì)RAID 5表現(xiàn)為順序?qū)?,避免了隨機(jī)寫(xiě)操作所需的磁頭尋道。 按照如上方法存儲(chǔ)的視頻數(shù)據(jù),第i路視頻數(shù)據(jù)存儲(chǔ)在第i、 N+i、2N+i,…,kN+l,…個(gè)條帶中,讀取每一路視頻數(shù)據(jù)時(shí),LBA線性增加,磁頭順序移動(dòng),磁頭尋道開(kāi)銷將比隨機(jī)讀要低。 為了保證應(yīng)用程序重啟后,bufsend[i]寫(xiě)入的整條數(shù)據(jù)仍然與RAID 5的條帶邊
界對(duì)齊,聚合驅(qū)動(dòng)程序需要監(jiān)控應(yīng)用程序?qū)υO(shè)備文件的打開(kāi)與關(guān)閉操作。當(dāng)應(yīng)用程序關(guān)閉設(shè)備文件,發(fā)送線程最后一次向RAID 5寫(xiě)數(shù)據(jù)時(shí),緩沖區(qū)bufsend[i]可能沒(méi)有填滿,因此需要記錄當(dāng)前offsend[i]及緩存字節(jié)數(shù)filled[i] (fullstripelen-residual [i])的值后,再把bufsend[i]中的數(shù)據(jù)寫(xiě)入RAID 5 ;當(dāng)設(shè)備文件再次打開(kāi)時(shí),首先根據(jù)記錄的offsend[i]及filled[i],在RAID 5中從offsend[i]位置開(kāi)始,讀出filled[i]個(gè)字節(jié)到bufsend[i]后,再進(jìn)入正常工作狀態(tài)。
實(shí)施例 如圖4所示,設(shè)2路視頻監(jiān)控應(yīng)用程序,每次發(fā)送的寫(xiě)數(shù)據(jù)塊大小為4KB, RAID 5條帶長(zhǎng)度f(wàn)ullstripelen = 10KB(5個(gè)數(shù)據(jù)磁盤(pán),1個(gè)校驗(yàn)磁盤(pán),每個(gè)數(shù)據(jù)塊大小為2KB),第0路、第l路數(shù)據(jù)的發(fā)送緩沖區(qū)分別為bufsend
和bufsend[l],初始變量residual
=residual[1] = fullstripelen = IOKB, offsend[O] = 0, offsend[l] = fullstripelen。
接收線程接收到應(yīng)用程序發(fā)出的6個(gè)寫(xiě)請(qǐng)求,分別來(lái)自于第0路、第1路視頻監(jiān)控,見(jiàn)圖4(a),放入隊(duì)列Q中。發(fā)送線程向bufsend[O]和bufsend[l]分發(fā)寫(xiě)請(qǐng)求,見(jiàn)圖4(b)。 發(fā)送線程進(jìn)行如下操作,見(jiàn)圖4 (c)。對(duì)于每一路數(shù)據(jù),前2個(gè)寫(xiě)請(qǐng)求的數(shù)據(jù)塊被復(fù)制到緩沖區(qū)中,第3個(gè)寫(xiě)請(qǐng)求數(shù)據(jù)塊的前面2KB將緩沖區(qū)填滿,該寫(xiě)請(qǐng)求被修改為2KB。
大小為10KB的緩沖區(qū)填滿后,被寫(xiě)入RAID 5,正好是RAID 5的一個(gè)條帶,RAID 5可以直接計(jì)算校驗(yàn)數(shù)據(jù),而不需要從磁盤(pán)上讀取舊的數(shù)據(jù)塊或校驗(yàn)塊;而圖中的2個(gè)條帶在RAID 5中的地址又是連續(xù)的,見(jiàn)圖4(d),由RAID 5作為順序的寫(xiě)操作來(lái)處理,不需要磁盤(pán)尋道。 本發(fā)明利用緩沖區(qū)對(duì)多路數(shù)據(jù)進(jìn)行重組聚合,在視頻監(jiān)控、連續(xù)數(shù)據(jù)保護(hù)等連續(xù)
數(shù)據(jù)存儲(chǔ)應(yīng)用中,構(gòu)造出連續(xù)的、完整的條帶寫(xiě)操作,提高RAID 5的吞吐能力。 對(duì)于RAID 6系統(tǒng),本發(fā)明同樣適用。完整的條帶寫(xiě)操作可以使RAID 6不需讀取
8磁盤(pán)數(shù)據(jù)塊或校驗(yàn)塊就可以計(jì)算出校驗(yàn)數(shù)據(jù),而連續(xù)的條帶寫(xiě)操作可以節(jié)省磁盤(pán)的尋道開(kāi) 銷。
權(quán)利要求
一種連續(xù)數(shù)據(jù)存儲(chǔ)中面向RAID 5的寫(xiě)操作優(yōu)化設(shè)計(jì)方法,其特征在于,在連續(xù)數(shù)據(jù)存儲(chǔ)應(yīng)用中,通過(guò)在計(jì)算機(jī)上運(yùn)行一個(gè)聚合驅(qū)動(dòng)程序,對(duì)應(yīng)用程序的寫(xiě)數(shù)據(jù)塊進(jìn)行聚合重組,即,在連續(xù)數(shù)據(jù)存儲(chǔ)時(shí),在內(nèi)存緩沖區(qū)內(nèi)保存應(yīng)用程序發(fā)出的寫(xiě)數(shù)據(jù)塊,并構(gòu)造一個(gè)與RAID 5的完整條帶長(zhǎng)度相等的對(duì)齊數(shù)據(jù)塊,之后,使對(duì)齊數(shù)據(jù)塊在RAID 5上恰好占滿整個(gè)條帶,再發(fā)送給RAID 5,以實(shí)現(xiàn)對(duì)RAID 5的整條寫(xiě);同時(shí),對(duì)向RAID 5寫(xiě)入的數(shù)據(jù)塊進(jìn)行排序,使它們連續(xù)地寫(xiě)入相鄰的條帶,由此實(shí)現(xiàn)RAID 5的連續(xù)I/O傳輸;其中,所述聚合驅(qū)動(dòng)程序位于應(yīng)用程序和RAID 5之間,包括兩個(gè)線程和一個(gè)隊(duì)列Q;兩個(gè)線程中,一個(gè)是接收線程,其完成如下工作監(jiān)控和接收應(yīng)用程序發(fā)送給RAID 5的寫(xiě)請(qǐng)求,并把接收到的寫(xiě)請(qǐng)求加入到隊(duì)列Q;另一個(gè)是發(fā)送線程,其完成如下工作當(dāng)隊(duì)列Q不為空時(shí),從隊(duì)列Q中取出并處理寫(xiě)請(qǐng)求;同時(shí),聚合驅(qū)動(dòng)程序要監(jiān)控應(yīng)用程序?qū)υO(shè)備文件的打開(kāi)與關(guān)閉操作。
2. 如權(quán)利要求1所述的一種連續(xù)數(shù)據(jù)存儲(chǔ)中面向RAID 5的寫(xiě)操作優(yōu)化設(shè)計(jì)方法,其特 征在于,所述對(duì)RAID 5的整條寫(xiě)的實(shí)現(xiàn)過(guò)程如下應(yīng)用程序把N路數(shù)據(jù)塊依次發(fā)送給RAID 5,由接收線程接收后將其加入到隊(duì)列Q ;設(shè)定 每次采集并寫(xiě)入的數(shù)據(jù)塊大小相等,D(i, j)表示第i路采集到的第j項(xiàng)數(shù)據(jù),O《i《N-l, 0《j ;對(duì)于每一路數(shù)據(jù),發(fā)送線程為它創(chuàng)建一個(gè)發(fā)送緩沖區(qū),記作bufsend[i] (0《i《N-l), 其中,緩沖區(qū)大小為RAID 5的完整條帶長(zhǎng)度Fu11 Stripe Length,簡(jiǎn)記為fullstripelen ; 緩沖區(qū)緩存的字節(jié)數(shù)記為filled[i],緩沖區(qū)空閑的字節(jié)數(shù)記為residual [i]; filled[i]+residiml[i] = fullstripelen ;發(fā)送線程從隊(duì)列Q中取出寫(xiě)請(qǐng)求,設(shè)該請(qǐng)求對(duì)應(yīng)于第i路數(shù)據(jù),將其發(fā)送到對(duì)應(yīng)的發(fā)送 緩沖區(qū)bufsend[i];對(duì)于bufsend[i],初始其residual [i]為fullstripelen, offsend[i] =i*fullstripelen ;設(shè)bufsend[i]接收到的寫(xiě)請(qǐng)求表示為(buf, cnt, off) ;bufsend[i] 處理寫(xiě)請(qǐng)求的流程如下1) 接收第i路數(shù)據(jù)的寫(xiě)請(qǐng)求(buf, cnt, off);2) 判斷bufsend[i]是否可容納該寫(xiě)請(qǐng)求的數(shù)據(jù)塊,即,比較cnt和residual [i];如果 cnt小于residual [i],轉(zhuǎn)到3);否則轉(zhuǎn)到6);3) 從該寫(xiě)請(qǐng)求的數(shù)據(jù)緩沖區(qū)復(fù)制cnt個(gè)字節(jié)到bufsend[i];4) 修改residual [i]為residual [i] _cnt ;5) 在隊(duì)列Q中刪除該寫(xiě)請(qǐng)求,然后轉(zhuǎn)到1)執(zhí)行;6) 把該寫(xiě)請(qǐng)求的前residual [i]個(gè)字節(jié)復(fù)制到bufsend[i];7) 將該寫(xiě)請(qǐng)求修改為(buf+residiml [i] , cnt_residiml [i] , off+residiml [i]), 艮卩,修改buf為buf+residiml[i], 修改cnt為cnt_residiml [i], 修改off為 off+residiml [i];8) 由于經(jīng)步驟6)已將bufsend[i]填滿,此時(shí),發(fā)送線程將bufsend[i]中的數(shù)據(jù)寫(xiě)入 RAID 5,其偏移量為offsend[i],長(zhǎng)度為fullstripelen ;9) 偏移量指針offsend[i]增加N*fullstripelen,并設(shè)置residual [i]為 fullstripelen ;10) 判斷cnt是否為零,若cnt = 0,表明該寫(xiě)請(qǐng)求的數(shù)據(jù)已經(jīng)發(fā)送完畢,轉(zhuǎn)到5)執(zhí)行,否則,轉(zhuǎn)到2)執(zhí)行;由于應(yīng)用程序設(shè)定每路數(shù)據(jù)塊的大小相等,所以N個(gè)發(fā)送緩沖區(qū)是依次順序填滿的;當(dāng)緩沖區(qū)bufsend[O]至bufsend[N-l]依次填滿后,發(fā)送線程就會(huì)把這N個(gè)緩沖區(qū)中的數(shù) 據(jù)逐個(gè)發(fā)送給RAID 5,并被順序?qū)懭氲絉AID 5的第kN到第(kN)+N-1條帶中,這里k = 0, 1,2,…;為保證應(yīng)用程序重啟后,bufsend[i]寫(xiě)入的整條數(shù)據(jù)仍然與RAID 5的條帶邊界對(duì)齊, 聚合驅(qū)動(dòng)程序需要監(jiān)控應(yīng)用程序?qū)υO(shè)備文件的打開(kāi)與關(guān)閉操作當(dāng)應(yīng)用程序關(guān)閉設(shè)備文件,發(fā)送線程最后一次向RAID 5寫(xiě)數(shù)據(jù)時(shí),需要記錄當(dāng) 前offsend[i]及緩存字節(jié)數(shù)filled[i] (fullstripelen-residual [i])的值后,再把 bufsend[i]中的數(shù)據(jù)寫(xiě)入RAID 5 ;當(dāng)設(shè)備文件再次打開(kāi)時(shí),首先根據(jù)記錄的off send [i]及 filled[i],在RAID 5中從offsend[i]位置開(kāi)始,讀出filled[i]個(gè)字節(jié)到bufsend[i]后, 再進(jìn)入正常工作狀態(tài)。
全文摘要
本發(fā)明提出了一種連續(xù)數(shù)據(jù)存儲(chǔ)中面向RAID5的寫(xiě)操作優(yōu)化設(shè)計(jì)方法。在連續(xù)數(shù)據(jù)存儲(chǔ)應(yīng)用中,在內(nèi)存緩沖區(qū)內(nèi)保存應(yīng)用程序發(fā)出的寫(xiě)數(shù)據(jù)塊,并構(gòu)造一個(gè)與RAID 5的完整條帶長(zhǎng)度相等的對(duì)齊數(shù)據(jù)塊,之后,使對(duì)齊數(shù)據(jù)塊在RAID5上恰好占滿整個(gè)條帶,再發(fā)送給RAID5,以實(shí)現(xiàn)對(duì)RAID5的整條寫(xiě)。這樣寫(xiě)入的數(shù)據(jù)塊恰好占滿RAID5的整個(gè)條帶,從而避免了重構(gòu)寫(xiě)、讀改寫(xiě)等生成校驗(yàn)的開(kāi)銷,數(shù)據(jù)塊的連續(xù)性避免了磁頭的尋道開(kāi)銷,提高了存儲(chǔ)系統(tǒng)的吞吐能力。同時(shí),對(duì)向RAID5寫(xiě)入的數(shù)據(jù)塊進(jìn)行排序,使它們連續(xù)地寫(xiě)入相鄰的條帶,由此實(shí)現(xiàn)RAID 5的連續(xù)I/O傳輸。本發(fā)明同樣適用于RAID6。
文檔編號(hào)G06F3/06GK101727299SQ20101918501
公開(kāi)日2010年6月9日 申請(qǐng)日期2010年2月8日 優(yōu)先權(quán)日2010年2月8日
發(fā)明者劉靖宇, 周澤湘, 孫志卓, 謝紅軍, 譚毓安 申請(qǐng)人:北京同有飛驥科技有限公司