一種自精簡(jiǎn)存儲(chǔ)系統(tǒng)數(shù)據(jù)一致性管理方法
【專利摘要】本發(fā)明提供一種自精簡(jiǎn)存儲(chǔ)系統(tǒng)數(shù)據(jù)一致性管理方法,屬于自動(dòng)精簡(jiǎn)配置【技術(shù)領(lǐng)域】,本發(fā)明設(shè)計(jì)了數(shù)據(jù)塊管理的元數(shù)據(jù)結(jié)構(gòu)和元數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)的實(shí)現(xiàn)方案。對(duì)于數(shù)據(jù)塊管理的元數(shù)據(jù)結(jié)構(gòu),設(shè)計(jì)了一種B+Tree的改進(jìn)結(jié)構(gòu),同時(shí)配合超級(jí)塊、元數(shù)據(jù)位圖和數(shù)據(jù)位圖等元數(shù)據(jù)實(shí)現(xiàn)數(shù)據(jù)塊的自精簡(jiǎn)管理。在原有B+Tree數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)上,將每個(gè)非葉節(jié)點(diǎn)的空間擴(kuò)大一倍,并劃分為活動(dòng)域和非活動(dòng)域兩部分,使得在修改B+Tree過程中基本上不分配額外磁盤空間,降低元數(shù)據(jù)修改操作復(fù)雜度,同時(shí)分配的額外非活動(dòng)域空間還可作為元數(shù)據(jù)副本或用于歷史操作記錄,減少存儲(chǔ)系統(tǒng)副本維護(hù)或日志維護(hù)開銷。
【專利說明】一種自精簡(jiǎn)存儲(chǔ)系統(tǒng)數(shù)據(jù)一致性管理方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及自動(dòng)精簡(jiǎn)配置【技術(shù)領(lǐng)域】,具體是一種自精簡(jiǎn)存儲(chǔ)系統(tǒng)數(shù)據(jù)一致性管理方法。
【背景技術(shù)】
[0002]當(dāng)前互聯(lián)網(wǎng)產(chǎn)生的數(shù)據(jù)量呈爆發(fā)式增長(zhǎng),對(duì)存儲(chǔ)系統(tǒng)的容量和性能提出了更高要求?,F(xiàn)有存儲(chǔ)系統(tǒng)存在磁盤存儲(chǔ)利用率較低、存儲(chǔ)資源浪費(fèi)的問題,因此近幾年出現(xiàn)了自動(dòng)精簡(jiǎn)配置技術(shù)。
[0003]自動(dòng)精簡(jiǎn)配置技術(shù)利用“寫時(shí)分配”策略,通過改變存儲(chǔ)系統(tǒng)的資源按需分配,能夠提高磁盤存儲(chǔ)空間利用率,在提高存儲(chǔ)系統(tǒng)性能的同時(shí)達(dá)到降低存儲(chǔ)系統(tǒng)的部署成本和節(jié)約資源的目的?!皩憰r(shí)分配”就是在向自精簡(jiǎn)邏輯卷寫數(shù)據(jù)時(shí),才從自精簡(jiǎn)存儲(chǔ)池中分配存儲(chǔ)空間。其實(shí)現(xiàn)時(shí)將自精簡(jiǎn)存儲(chǔ)池存儲(chǔ)空間分割成大小相等的數(shù)據(jù)塊,并通過B+Tree等形式進(jìn)行組織管理:包括數(shù)據(jù)塊的分配、回收、查找等操作。自精簡(jiǎn)存儲(chǔ)池分為數(shù)據(jù)區(qū)和元數(shù)據(jù)區(qū),數(shù)據(jù)區(qū)用于存儲(chǔ)數(shù)據(jù),元數(shù)據(jù)區(qū)包括了存儲(chǔ)池超級(jí)塊,元數(shù)據(jù)位圖,數(shù)據(jù)位圖,邏輯卷信息等等對(duì)自精簡(jiǎn)存儲(chǔ)池是個(gè)組織管理者,非常重要,一旦元數(shù)據(jù)出現(xiàn)丟失、不一致等錯(cuò)誤,就會(huì)丟失用戶數(shù)據(jù)甚至使得整個(gè)存儲(chǔ)系統(tǒng)崩潰。同時(shí),存儲(chǔ)系統(tǒng)正常運(yùn)行時(shí),元數(shù)據(jù)是存儲(chǔ)在內(nèi)存中并定時(shí)刷寫到磁盤上的,而當(dāng)系統(tǒng)出現(xiàn)異常時(shí),如控制器失效、控制器掉電、RAID失效和RAID掉電等硬件錯(cuò)誤,可能造成元數(shù)據(jù)刷寫失敗,導(dǎo)致元數(shù)據(jù)錯(cuò)誤。因此如何保證元數(shù)據(jù)的一致性是存儲(chǔ)系統(tǒng)和自動(dòng)精簡(jiǎn)技術(shù)的重點(diǎn)。
[0004]在自動(dòng)精簡(jiǎn)技術(shù)的實(shí)現(xiàn)中,大多用B+Tree數(shù)據(jù)結(jié)構(gòu)來管理數(shù)據(jù)塊。為了保證元數(shù)據(jù)B+Tree的一致性,可以采取的一種管理方法是:當(dāng)進(jìn)行B+Tree的修改操作時(shí),額外創(chuàng)建一個(gè)與B+Tree相同的另一棵B+Tree,并在額外創(chuàng)建的B+Tree上進(jìn)行操作,等到整個(gè)操作完成后,將指向原來B+Tree根節(jié)點(diǎn)的指針指向新創(chuàng)建的B+Tree的根節(jié)點(diǎn),并將原來B+Tree的空間釋放,達(dá)到修改元數(shù)據(jù)的目的。此實(shí)現(xiàn)方法的優(yōu)點(diǎn)是能夠保證元數(shù)據(jù)B+Tree的一致性,在整個(gè)修改過程中的任一階段,存儲(chǔ)在磁盤上的元數(shù)據(jù)都保持一致性,能夠較好地防止因控制器失效等硬件錯(cuò)誤引起的元數(shù)據(jù)不一致。而此方法的缺點(diǎn)也較為明顯,就是每次修改元數(shù)據(jù)B+Tree需要重建一棵同等大小的B+Tree,在重建過程中需要為B+Tree中每個(gè)節(jié)點(diǎn)分配空間;同時(shí)為了保證元數(shù)據(jù)可用性,在與元數(shù)據(jù)B+Tree同一 RAID的其它地方,還要存儲(chǔ)一份副本。因此這種方法在時(shí)間和空間上開銷都較大。
[0005]另一種元數(shù)據(jù)的管理方法是將存儲(chǔ)系統(tǒng)中單一 RAID作為元數(shù)據(jù)空間,專門存儲(chǔ)元數(shù)據(jù),這使得該RAID容易稱為系統(tǒng)中數(shù)據(jù)訪問的“熱點(diǎn)”和單一故障點(diǎn)。一種解決方法是將元數(shù)據(jù)分散存放在幾個(gè)RAID中,但若系統(tǒng)中控制器失效仍會(huì)對(duì)元數(shù)據(jù)訪問造成較大影響。
【發(fā)明內(nèi)容】
[0006]本發(fā)明提供一種自精簡(jiǎn)存儲(chǔ)系統(tǒng)數(shù)據(jù)一致性管理方法,即可解決上述兩種方法中的缺點(diǎn),保證元數(shù)據(jù)一致性,又可減小元數(shù)據(jù)操作的時(shí)間和空間復(fù)雜度。
[0007]本發(fā)明設(shè)計(jì)了數(shù)據(jù)塊管理的元數(shù)據(jù)結(jié)構(gòu)和元數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)的實(shí)現(xiàn)方案。對(duì)于數(shù)據(jù)塊管理的元數(shù)據(jù)結(jié)構(gòu),設(shè)計(jì)了一種B+Tree的改進(jìn)結(jié)構(gòu),同時(shí)配合超級(jí)塊、元數(shù)據(jù)位圖和數(shù)據(jù)位圖等元數(shù)據(jù)實(shí)現(xiàn)數(shù)據(jù)塊的自精簡(jiǎn)管理。在原有B+Tree數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)上,將每個(gè)非葉節(jié)點(diǎn)的空間擴(kuò)大一倍,并劃分為活動(dòng)域和非活動(dòng)域兩部分,使得在修改B+Tree過程中基本上不分配額外磁盤空間,降低元數(shù)據(jù)修改操作復(fù)雜度,同時(shí)分配的額外非活動(dòng)域空間還可作為元數(shù)據(jù)副本或用于歷史操作記錄,減少存儲(chǔ)系統(tǒng)副本維護(hù)或日志維護(hù)開銷。
[0008]一種自精簡(jiǎn)存儲(chǔ)系統(tǒng)數(shù)據(jù)一致性管理方法,其特征為:
S1:在元數(shù)據(jù)組織的B+Tree中,增加B+Tree每個(gè)非葉子節(jié)點(diǎn)的空間。在原有B+Tree數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)上,將每個(gè)非葉節(jié)點(diǎn)的空間擴(kuò)大一倍,并劃分為活動(dòng)域和非活動(dòng)域兩部分,其中活動(dòng)域中存儲(chǔ)映射B+Tree節(jié)點(diǎn)的數(shù)據(jù),即(key, value)鍵值對(duì);而非活動(dòng)域中根據(jù)不同策略可存儲(chǔ)活動(dòng)域數(shù)據(jù)的副本,也可存儲(chǔ)最近一次節(jié)點(diǎn)修改前的數(shù)據(jù)。對(duì)節(jié)點(diǎn)的修改在節(jié)點(diǎn)的非活動(dòng)域進(jìn)行,節(jié)點(diǎn)的修改完成后,活動(dòng)域和非活動(dòng)域進(jìn)行交換。每個(gè)非葉節(jié)點(diǎn)在分配時(shí)起始地址以節(jié)點(diǎn)大小對(duì)齊,例如若節(jié)點(diǎn)大小是8KB,其中活動(dòng)域和非活動(dòng)域各占4KB,則節(jié)點(diǎn)起始地址以8KB對(duì)齊。這樣就使得在修改元數(shù)據(jù)過程中不分配額外存儲(chǔ)空間,降低元數(shù)據(jù)修改操作復(fù)雜度。
[0009]對(duì)元數(shù)據(jù)的修改涉及三種操作:增加數(shù)據(jù)塊映射、刪除數(shù)據(jù)塊映射和修改數(shù)據(jù)塊映射。各操作流程如下:
A、增加數(shù)據(jù)塊映射
1、查找新增數(shù)據(jù)塊在映射B+Tree中的父節(jié)點(diǎn)N;
2、復(fù)制N的活動(dòng)域數(shù)據(jù)到非活動(dòng)域;
3、修改N的非活動(dòng)域,增加key和索引指針,將指針指向新增節(jié)點(diǎn),即將新增節(jié)點(diǎn)插入到N;
4、判斷N是否需要進(jìn)行分裂。若不需要?jiǎng)t轉(zhuǎn)向步驟7;若N需要分裂,則轉(zhuǎn)向步驟5 ;
5、分裂N,得到節(jié)點(diǎn)N’和節(jié)點(diǎn)N’’,此時(shí)原節(jié)點(diǎn)N的父節(jié)點(diǎn)在N分裂后指向N’ ;
5.1.查找元數(shù)據(jù)位圖B+Tree,找到空閑的元數(shù)據(jù)塊;
5.2.分配新節(jié)點(diǎn)N’ ’并初始化,更新元數(shù)據(jù)位圖B+Tree ;
5.3.計(jì)算分裂后節(jié)點(diǎn)N’和N’’各自包含的元數(shù)據(jù)信息,S卩(key,value)鍵值對(duì)的范圍;
5、4.按照計(jì)算結(jié)果將待分裂節(jié)點(diǎn)N活動(dòng)域的數(shù)據(jù)一部分復(fù)制到非活動(dòng)域,另一部分復(fù)制到新分配節(jié)點(diǎn)N’’的活動(dòng)域,此時(shí)稱節(jié)點(diǎn)N為N’ ;
6、轉(zhuǎn)到步驟2,向被分裂節(jié)點(diǎn)的父節(jié)點(diǎn)M插入節(jié)點(diǎn)N’’ ;
7、將各修改過的節(jié)點(diǎn)的父節(jié)點(diǎn)的指針指向修改過的節(jié)點(diǎn)的非活動(dòng)域;
8、更新數(shù)據(jù)位圖B+Tree中新增數(shù)據(jù)塊對(duì)應(yīng)的位,置為已使用;
9、更新元數(shù)據(jù)的超級(jí)塊等其它元數(shù)據(jù),改變存儲(chǔ)池、邏輯卷等邏輯設(shè)備對(duì)象的大??;
10、操作完成。
[0010]B、刪除數(shù)據(jù)塊映射
1、查找待刪除節(jié)點(diǎn)在映射B+Tree中的父節(jié)點(diǎn)N;
2、復(fù)制N的活動(dòng)域數(shù)據(jù)到非活動(dòng)域; 3、修改N的非活動(dòng)域,刪除key和索引指針;
4、判斷N是否需要與其它節(jié)點(diǎn)合并。若不需要?jiǎng)t轉(zhuǎn)向步驟7;若需要合并,則轉(zhuǎn)向步驟
5 ;
5、找到與合并的節(jié)點(diǎn)N’,并進(jìn)行節(jié)點(diǎn)合并操作。此時(shí)N的父節(jié)點(diǎn)在其合并后指向合并后的新節(jié)點(diǎn)M ;
5、1.計(jì)算待合并節(jié)點(diǎn)N和N’,確定合并后節(jié)點(diǎn)包含的元數(shù)據(jù)信息;
5.2.按照計(jì)算結(jié)果將節(jié)點(diǎn)N和N’的數(shù)據(jù)復(fù)制到節(jié)點(diǎn)N’的非活動(dòng)域,此時(shí)稱節(jié)點(diǎn)N為節(jié)點(diǎn)M ;
6、轉(zhuǎn)到步驟2,刪除被合并的節(jié)點(diǎn)N;
7、將各修改過的節(jié)點(diǎn)的父節(jié)點(diǎn)的指針指向修改過的節(jié)點(diǎn)的非活動(dòng)區(qū)域;
8、釋放被刪除的節(jié)點(diǎn)的空間;
9、更新數(shù)據(jù)位圖B+Tree中刪除數(shù)據(jù)塊對(duì)應(yīng)的位,置為未使用;
10、更新元數(shù)據(jù)的超級(jí)塊等其它元數(shù)據(jù),改變存儲(chǔ)池、邏輯卷等邏輯設(shè)備對(duì)象的大??;
11、操作完成。
[0011]C、修改數(shù)據(jù)塊映射
1、查找映射B+Tree,確定待修改數(shù)據(jù)塊所屬的父節(jié)點(diǎn)N及修改映射關(guān)系后的父節(jié)點(diǎn)
N,;
2、從節(jié)點(diǎn)N下刪除數(shù)據(jù)塊映射;
3、將數(shù)據(jù)塊插入到節(jié)點(diǎn)N’下;
4、操作完成。
[0012]S2:元數(shù)據(jù)散列的存儲(chǔ)于存儲(chǔ)池每個(gè)底層存儲(chǔ)單元中。
[0013]將元數(shù)據(jù)分散到存儲(chǔ)池中各個(gè)RAID上,通過B+Tree等方式組織管理;更好的提升元數(shù)據(jù)訪問性能,又降低了硬件異常帶來元數(shù)據(jù)丟失的風(fēng)險(xiǎn)。
[0014]由于元數(shù)據(jù)存儲(chǔ)在存儲(chǔ)池各個(gè)RAID中,存儲(chǔ)池以RAID為單位的擴(kuò)容和縮容需要將各RAID中元數(shù)據(jù)空間擴(kuò)大一倍,同樣劃分成活動(dòng)空間和非活動(dòng)空間。這樣在系統(tǒng)進(jìn)行擴(kuò)容和縮容時(shí),只修改元數(shù)據(jù)的非活動(dòng)空間,而不影響活動(dòng)空間的正常訪問。當(dāng)元數(shù)據(jù)在非活動(dòng)空間調(diào)整完畢后,將各RAID中的元數(shù)據(jù)活動(dòng)空間和非活動(dòng)空間交換,啟用新的元數(shù)據(jù),完成存儲(chǔ)系統(tǒng)的擴(kuò)容和縮容,最后同步活動(dòng)空間和非活動(dòng)空間的數(shù)據(jù),并建立跨RAID的元數(shù)據(jù)副本。
[0015]本發(fā)明的有益效果是:1)有利于元數(shù)據(jù)的磁盤刷寫,相比于現(xiàn)有B+Tree管理數(shù)據(jù)塊的方式,降低了元數(shù)據(jù)在磁盤中空間分布的散列程度;2)減少了元數(shù)據(jù)修改時(shí)空間分配開銷,除了節(jié)點(diǎn)分裂時(shí)需要進(jìn)行新節(jié)點(diǎn)的分配外,其余操作均不需要額外分配空間;3)應(yīng)用方式靈活,映射B+Tree非葉節(jié)點(diǎn)的非活動(dòng)域即可作為映射B+Tree元數(shù)據(jù)的副本,也可作為歷史操作的記錄,以支持操作回滾。當(dāng)節(jié)點(diǎn)的非活動(dòng)域用作副本時(shí),在對(duì)映射B+Tree操作結(jié)束后,首先將各節(jié)點(diǎn)活動(dòng)域數(shù)據(jù)同步到非活動(dòng)域中。之后重建非活動(dòng)域節(jié)點(diǎn)指針,將各節(jié)點(diǎn)的指針指向孩子節(jié)點(diǎn)的非活動(dòng)域。此時(shí)各節(jié)點(diǎn)的非活動(dòng)域形成一顆獨(dú)立的映射B+Tree副本,若除根節(jié)點(diǎn)外任一節(jié)點(diǎn)的活動(dòng)域數(shù)據(jù)損壞,則僅修改指向根節(jié)點(diǎn)的指針即可快速切換到非活動(dòng)域副本,正常訪問映射B+Tree元數(shù)據(jù)。節(jié)點(diǎn)的非活動(dòng)域用作副本時(shí),由于將副本分散與原本保存在一起,減少了維護(hù)副本一致性帶來的額外磁盤訪問的時(shí)間和空間開銷;節(jié)點(diǎn)非活動(dòng)域用作操作歷史記錄時(shí),保存了其上一次作為活動(dòng)域時(shí)的數(shù)據(jù),減少了系統(tǒng)日志需要記錄的數(shù)據(jù)量,在減少日志記錄的時(shí)間和空間開銷同時(shí),也減少了回滾操作的數(shù)據(jù)重建復(fù)雜度。4)保護(hù)元數(shù)據(jù)一致性。由于在對(duì)映射B+Tree操作前,會(huì)將各節(jié)點(diǎn)的活動(dòng)域數(shù)據(jù)復(fù)制到非活動(dòng)域,并且在非活動(dòng)域進(jìn)行操作,因此即便在操作過程中出現(xiàn)控制器失效或者RAID掉電等情況,存在節(jié)點(diǎn)活動(dòng)域的數(shù)據(jù)也能保持一致性,所影響的只是非活動(dòng)域中未完成修改的操作。同時(shí),即使單RAID數(shù)據(jù)丟失,也能通過其它RAID中存儲(chǔ)的交叉副本進(jìn)行數(shù)據(jù)重構(gòu)。5)提升元數(shù)據(jù)訪問性能,由于將元數(shù)據(jù)分散到系統(tǒng)所有RAID中,充分利用了多RAID并發(fā)的性能,提高元數(shù)據(jù)訪問的1PS,解決了元數(shù)據(jù)單點(diǎn)性能瓶頸問題,同時(shí)支持存儲(chǔ)系統(tǒng)在線擴(kuò)容。實(shí)現(xiàn)系統(tǒng)擴(kuò)容縮容后新舊元數(shù)據(jù)的無縫切換。
[0016]本方法彌補(bǔ)了現(xiàn)有自精簡(jiǎn)存儲(chǔ)系統(tǒng)中為保證元數(shù)據(jù)安全而采用的復(fù)雜操作,減少了元數(shù)據(jù)增加和刪除過程中反復(fù)申請(qǐng)和釋放磁盤空間造成的額外開銷和存儲(chǔ)空間碎片化。在保證了元數(shù)據(jù)一致性性的前提下降低了元數(shù)據(jù)的訪問性能。同時(shí)采用全分布的元數(shù)據(jù)存儲(chǔ)方法也避免了元數(shù)據(jù)訪問的單點(diǎn)故障問題。
【專利附圖】
【附圖說明】
[0017]附圖1是元數(shù)據(jù)結(jié)構(gòu)示意圖。
[0018]附圖2是映射B+Tree結(jié)構(gòu)示意圖。
[0019]附圖3是插入節(jié)點(diǎn)步驟I。
[0020]附圖4是插入節(jié)點(diǎn)步驟2。
[0021]附圖5是插入節(jié)點(diǎn)步驟3。
[0022]附圖6是分裂節(jié)點(diǎn)步驟I。
[0023]附圖7是分裂節(jié)點(diǎn)步驟2。
[0024]附圖8是分裂節(jié)點(diǎn)步驟3。
[0025]附圖9是分裂節(jié)點(diǎn)步驟4。
[0026]附圖10是分裂節(jié)點(diǎn)步驟5。
[0027]附圖11是元數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0028]下面參照附圖,以本發(fā)明中映射B+Tree的插入節(jié)點(diǎn)和分裂節(jié)點(diǎn)操作為例,重點(diǎn)說明本發(fā)明中增加、刪除和修改數(shù)據(jù)塊映射中的映射B+Tree操作。刪除節(jié)點(diǎn)和合并節(jié)點(diǎn)操作分別是插入節(jié)點(diǎn)和分裂節(jié)點(diǎn)操作的逆過程,在此不再贅述。同時(shí)說明元數(shù)據(jù)在各RAID中的存儲(chǔ)結(jié)構(gòu)和存儲(chǔ)系統(tǒng)擴(kuò)容、縮容過程中對(duì)元數(shù)據(jù)的操作。
[0029]附圖1是映射B+Tree的數(shù)據(jù)結(jié)構(gòu)示意圖,其中每個(gè)非葉節(jié)點(diǎn)都包含活動(dòng)域和非活動(dòng)域,兩者大小相等,地址空間相鄰,非葉節(jié)點(diǎn)起始地址以節(jié)點(diǎn)大小對(duì)齊。葉子節(jié)點(diǎn)是指向數(shù)據(jù)塊的指針。非葉節(jié)點(diǎn)中活動(dòng)域與非活動(dòng)域是通過父節(jié)點(diǎn)指向當(dāng)前節(jié)點(diǎn)的指針決定的。稱節(jié)點(diǎn)中地址相鄰的兩個(gè)空間為A域和B域,其中A域的起始地址是節(jié)點(diǎn)的起始地址。由于非葉節(jié)點(diǎn)的地址以節(jié)點(diǎn)大小對(duì)齊,則若父節(jié)點(diǎn)中指向當(dāng)前節(jié)點(diǎn)的指針?biāo)鎯?chǔ)的地址為A域起始地址,同時(shí)也為當(dāng)前節(jié)點(diǎn)起始地址,則A域?yàn)榛顒?dòng)域,B域?yàn)榉腔顒?dòng)域;反之若父節(jié)點(diǎn)中指向當(dāng)前節(jié)點(diǎn)的指針?biāo)鎯?chǔ)的地址為B域起始地址,此時(shí)該地址不能以節(jié)點(diǎn)大小對(duì)齊,則A域?yàn)榉腔顒?dòng)域,B域?yàn)榛顒?dòng)域。
[0030]附圖3至附圖5對(duì)映射B+Tree插入節(jié)點(diǎn)的操作進(jìn)行了流程說明;
1)如附圖3所示,首先查找映射B+Tree,確定新增葉節(jié)點(diǎn)的父節(jié)點(diǎn),將其節(jié)點(diǎn)活動(dòng)域中數(shù)據(jù)復(fù)制到非活動(dòng)域;
2)如附圖4所示,修改節(jié)點(diǎn)非活動(dòng)域,添加新葉節(jié)點(diǎn)索引,修改鍵值;
3)如附圖5所示,修改當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)中指向當(dāng)前節(jié)點(diǎn)的指針,使其指向當(dāng)前節(jié)點(diǎn)的非活動(dòng)域,完成活動(dòng)域和非活動(dòng)域的轉(zhuǎn)換,啟用新的節(jié)點(diǎn)元數(shù)據(jù),插入節(jié)點(diǎn)操作完成。
[0031]映射B+Tree中某個(gè)非葉節(jié)點(diǎn)在插入了新節(jié)點(diǎn)后,節(jié)點(diǎn)中的索引值可能超出了映射B+Tree數(shù)據(jù)結(jié)構(gòu)中的節(jié)點(diǎn)限制,需要進(jìn)行節(jié)點(diǎn)分裂形成兩個(gè)新節(jié)點(diǎn),每個(gè)新節(jié)點(diǎn)存儲(chǔ)原節(jié)點(diǎn)一部分的數(shù)據(jù)。附圖6至附圖10對(duì)映射B+Tree分裂節(jié)點(diǎn)的操作進(jìn)行了流程說明;
1)如附圖6所示,映射B+Tree中某一非葉節(jié)點(diǎn)在插入了節(jié)點(diǎn)后索引值達(dá)到最大,需要進(jìn)行分裂;
2)如附圖7所示,復(fù)制當(dāng)前節(jié)點(diǎn)的活動(dòng)域數(shù)據(jù)到非活動(dòng)域;
3)如附圖8所示,分配一個(gè)新的非葉節(jié)點(diǎn)并初始化,將當(dāng)前節(jié)點(diǎn)非活動(dòng)域中的一部分?jǐn)?shù)據(jù)遷移到新分配的節(jié)點(diǎn)的活動(dòng)域中;
4)如附圖9所示,將新分配的節(jié)點(diǎn)作為一個(gè)新節(jié)點(diǎn)插入到映射B+Tree中;
5)如附圖10所示,修改所有涉及節(jié)點(diǎn)的索引指針,指向存有新的元數(shù)據(jù)的節(jié)點(diǎn)的非活動(dòng)域,完成各節(jié)點(diǎn)活動(dòng)域和非活動(dòng)域的轉(zhuǎn)換,啟用新的節(jié)點(diǎn)元數(shù)據(jù),分裂節(jié)點(diǎn)操作完成。
[0032]附圖11是元數(shù)據(jù)實(shí)際存儲(chǔ)結(jié)構(gòu)示意圖。元數(shù)據(jù)的超級(jí)塊在系統(tǒng)中每個(gè)RAID中存放一份副本,在超級(jí)塊中存放數(shù)據(jù)塊映射B+Tree根節(jié)點(diǎn)、元數(shù)據(jù)位圖B+Tree根節(jié)點(diǎn)、數(shù)據(jù)位圖B+Tree根節(jié)點(diǎn),以及系統(tǒng)中其它元數(shù)據(jù)如設(shè)備UUID、設(shè)備名稱、設(shè)備對(duì)象索引、設(shè)備屬性信息等。數(shù)據(jù)塊映射B+Tree、元數(shù)據(jù)位圖B+Tree和數(shù)據(jù)位圖B+Tree并不是在每個(gè)RAID中存儲(chǔ)一份相同的數(shù)據(jù),而是將構(gòu)成B+Tree的數(shù)據(jù)塊按照一定負(fù)載均衡策略分散存儲(chǔ)到所有RAID中。每個(gè)RAID中的元數(shù)據(jù)非活動(dòng)空間存儲(chǔ)當(dāng)前RAID元數(shù)據(jù)活動(dòng)空間中元數(shù)據(jù)的副本,同時(shí),按照分散策略將RAID中數(shù)據(jù)塊映射B+Tree、元數(shù)據(jù)位圖B+Tree和數(shù)據(jù)位圖B+Tree在其他RAID中存儲(chǔ)兩份副本,兩份副本不在同一 RAID中,保證分散存儲(chǔ)的元數(shù)據(jù)在系統(tǒng)中兩個(gè)RAID失效時(shí)還能夠保持完整性。
[0033]存儲(chǔ)系統(tǒng)進(jìn)行擴(kuò)容時(shí)對(duì)元數(shù)據(jù)處理過程如下:
1、初始化新增RAID;
2、按照負(fù)載均衡策略計(jì)算擴(kuò)容后元數(shù)據(jù)分布;
3、同步各RAID中元數(shù)據(jù)活動(dòng)空間和非活動(dòng)空間,使得兩者中存儲(chǔ)的元數(shù)據(jù)一致;
4、按照步驟2計(jì)算結(jié)果,復(fù)制元數(shù)據(jù)到新增RAID的元數(shù)據(jù)活動(dòng)空間;
5、按照步驟2計(jì)算結(jié)果,修改各RAID中元數(shù)據(jù)非活動(dòng)空間的元數(shù)據(jù)為擴(kuò)容后狀態(tài);
6、更新各RAID中超級(jí)塊、元數(shù)據(jù)位圖B+Tree和數(shù)據(jù)位圖B+Tree;
7、啟用原有各RAID的元數(shù)據(jù)非活動(dòng)空間成為活動(dòng)空間;
8、同步各RAID的元數(shù)據(jù)活動(dòng)空間和非活動(dòng)空間,并重新建立跨RAID的元數(shù)據(jù)副本;
9、操作完成。
[0034]存儲(chǔ)系統(tǒng)的縮容操作與擴(kuò)容操作流程類似,在此不再贅述。
[0035]以上所述,僅為本發(fā)明的較佳實(shí)施實(shí)例而已,并非用于限定本發(fā)明的保護(hù)范圍。
【權(quán)利要求】
1.一種自精簡(jiǎn)存儲(chǔ)系統(tǒng)數(shù)據(jù)一致性管理方法,其特征在于設(shè)計(jì)了數(shù)據(jù)塊管理的元數(shù)據(jù)結(jié)構(gòu)和元數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)的實(shí)現(xiàn)方案,其中 元數(shù)據(jù)結(jié)構(gòu)包括: (1)B+Tree數(shù)據(jù)結(jié)構(gòu)的改進(jìn)結(jié)構(gòu); (2)應(yīng)用B+Tree的改進(jìn)數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的增加數(shù)據(jù)塊映射、刪除數(shù)據(jù)塊映射和修改數(shù)據(jù)塊映射操作; (3)B+Tree的改進(jìn)數(shù)據(jù)結(jié)構(gòu)中非葉節(jié)點(diǎn)的活動(dòng)域與非活動(dòng)域的判定方式; 根據(jù)不同的分配策略將元數(shù)據(jù)分散到存儲(chǔ)系統(tǒng)中所有RAID中,通過B+Tree等方式組織管理,同時(shí)元數(shù)據(jù)在不同RAID中做交叉?zhèn)浞荩? 元數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)包括:(I)元數(shù)據(jù)跨所有RAID的存儲(chǔ)和備份;(2)應(yīng)用元 數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)的存儲(chǔ)系統(tǒng)擴(kuò)容縮容操作。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于所述B+Tree數(shù)據(jù)結(jié)構(gòu)的改進(jìn)結(jié)構(gòu)設(shè)計(jì),為原有B+Tree數(shù)據(jù)結(jié)構(gòu)中非葉節(jié)點(diǎn)分配額外空間,使得改進(jìn)后的非葉節(jié)點(diǎn)空間大小為原來兩倍,并且節(jié)點(diǎn)起始地址以節(jié)點(diǎn)大小對(duì)齊;節(jié)點(diǎn)空間劃分成相鄰的活動(dòng)域和非活動(dòng)域,活動(dòng)域用于正常的元數(shù)據(jù)查詢操作;非活動(dòng)域用于存儲(chǔ)活動(dòng)域副本或前一次操作歷史記錄。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于所述應(yīng)用B+Tree數(shù)據(jù)結(jié)構(gòu)的改進(jìn)結(jié)構(gòu)實(shí)現(xiàn)的數(shù)據(jù)塊管理操作,在進(jìn)行自精簡(jiǎn)數(shù)據(jù)塊的映射操作時(shí),將B+Tree改進(jìn)結(jié)構(gòu)的節(jié)點(diǎn)中活動(dòng)域中數(shù)據(jù)復(fù)制到非活動(dòng)域,所有修改節(jié)點(diǎn)中數(shù)據(jù)的操作在節(jié)點(diǎn)的非活動(dòng)域進(jìn)行,當(dāng)節(jié)點(diǎn)中數(shù)據(jù)修改完畢后,修改指向存在數(shù)據(jù)修改的各節(jié)點(diǎn)的指針,使其指向各節(jié)點(diǎn)原來的非活動(dòng)域,將存有修改后的數(shù)據(jù)的各節(jié)點(diǎn)非活動(dòng)域變?yōu)榛顒?dòng)域,原來的各節(jié)點(diǎn)活動(dòng)域變?yōu)榉腔顒?dòng)域。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于所述B+Tree的改進(jìn)數(shù)據(jù)結(jié)構(gòu)中非葉節(jié)點(diǎn)的活動(dòng)域與非活動(dòng)域的判定方式,根據(jù)父節(jié)點(diǎn)指向當(dāng)前節(jié)點(diǎn)的指針?biāo)鎯?chǔ)的地址決定活動(dòng)域和非活動(dòng)域;將節(jié)點(diǎn)分成地址相鄰的兩個(gè)空間:A域和B域,其中A域的起始地址是節(jié)點(diǎn)的起始地址;由于非葉節(jié)點(diǎn)的地址以節(jié)點(diǎn)大小對(duì)齊,則若父節(jié)點(diǎn)中指向當(dāng)前節(jié)點(diǎn)的指針?biāo)鎯?chǔ)的地址為A域起始地址,同時(shí)也為當(dāng)前節(jié)點(diǎn)起始地址,則A域?yàn)榛顒?dòng)域,B域?yàn)榉腔顒?dòng)域;反之若父節(jié)點(diǎn)中指向當(dāng)前節(jié)點(diǎn)的指針?biāo)鎯?chǔ)的地址為B域起始地址,此時(shí)該地址不能以節(jié)點(diǎn)大小對(duì)齊,則A域?yàn)榉腔顒?dòng)域,B域?yàn)榛顒?dòng)域。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于所述元數(shù)據(jù)跨所有RAID的存儲(chǔ)和備份,將各RAID中存儲(chǔ)元數(shù)據(jù)的元數(shù)據(jù)空間劃分為兩個(gè)大小相同,地址相鄰的元數(shù)據(jù)活動(dòng)空間和元數(shù)據(jù)非活動(dòng)空間;元數(shù)據(jù)中數(shù)據(jù)量較小的數(shù)據(jù)結(jié)構(gòu),如超級(jí)塊等在存儲(chǔ)系統(tǒng)中每個(gè)RAID元數(shù)據(jù)活動(dòng)空間中存放一份相同副本;而對(duì)于數(shù)據(jù)量較大的數(shù)據(jù)結(jié)構(gòu),如元數(shù)據(jù)映射B+Tree、元數(shù)據(jù)位圖B+Tree和數(shù)據(jù)位圖B+Tree,根據(jù)負(fù)載均衡策略分散到每個(gè)RAID元數(shù)據(jù)活動(dòng)空間中,各RAID存放元數(shù)據(jù)的一部分,在RAID中的元數(shù)據(jù)非活動(dòng)空間存放元數(shù)據(jù)活動(dòng)空間的副本;同時(shí),在各RAID中按照一定策略存放其它兩個(gè)RAID中元數(shù)據(jù)的副本。
6.根據(jù)權(quán)利要求1所述的方法,其特征在于所述應(yīng)用元數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)的存儲(chǔ)系統(tǒng)擴(kuò)容和縮容操作,主要是在擴(kuò)容和縮容操作時(shí),首先同步元數(shù)據(jù)活動(dòng)空間和元數(shù)據(jù)非活動(dòng)空間,之后根據(jù)元數(shù)據(jù)分散策略修改各RAID中元數(shù)據(jù)非活動(dòng)空間,最后轉(zhuǎn)換各RAID的元數(shù)據(jù)非活動(dòng)空間為活動(dòng)空間,啟用新的元數(shù)據(jù)完成擴(kuò)容縮容操作。
【文檔編號(hào)】G06F17/30GK104331478SQ201410614846
【公開日】2015年2月4日 申請(qǐng)日期:2014年11月5日 優(yōu)先權(quán)日:2014年11月5日
【發(fā)明者】馬春 申請(qǐng)人:浪潮電子信息產(chǎn)業(yè)股份有限公司