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