本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,具體涉及一種元數(shù)據(jù)結(jié)構(gòu)和基于其的操作方法、定位方法、切分方法。
背景技術(shù):
分布式文件系統(tǒng)是一種普遍使用的存儲(chǔ)系統(tǒng)。具有很多優(yōu)點(diǎn),如可擴(kuò)展性強(qiáng),維護(hù)簡單,成本較低等,因此,很適合存儲(chǔ)大量的,且增長很快的數(shù)據(jù)。但是,分布式文件系統(tǒng)也存在一些不足,如延遲較高,對元數(shù)據(jù)訪問的可擴(kuò)展性差等特點(diǎn)。
分布式文件系統(tǒng)中最為重要的就是關(guān)于元數(shù)據(jù)的管理,一種廣泛使用的方法就是將元數(shù)據(jù)存放在鍵值存儲(chǔ)(Key-Value Store)系統(tǒng)中。這種鍵值系統(tǒng)能夠高效的完成元數(shù)據(jù)的查詢,并且可以保證數(shù)據(jù)的一致性(Consistency),持久性(Durability)。由于鍵值系統(tǒng)是目前被廣泛應(yīng)用的系統(tǒng),所以采用鍵值系統(tǒng)存儲(chǔ)分布式文件系統(tǒng)的元數(shù)據(jù)是非常適合的。
為了支持高效的元數(shù)據(jù)訪問,在使用鍵值存儲(chǔ)的系統(tǒng)中,需要在鍵值存儲(chǔ)之上構(gòu)建結(jié)構(gòu)化元數(shù)據(jù)緩存層,將非結(jié)構(gòu)化的元數(shù)據(jù)在內(nèi)存中進(jìn)行結(jié)構(gòu)化。即對于一次創(chuàng)建或者更改元數(shù)據(jù)的操作,客戶端首先將請求發(fā)送到元數(shù)據(jù)服務(wù)器,元數(shù)據(jù)服務(wù)器在接收到請求后,首先將元數(shù)據(jù)緩存在元數(shù)據(jù)服務(wù)器的結(jié)構(gòu)化元數(shù)據(jù)緩存層,之后序列化到鍵值存儲(chǔ)系統(tǒng)中,鍵值存儲(chǔ)系統(tǒng)最后將對于元數(shù)據(jù)的更改持久化到硬盤。而對于一次讀取元數(shù)據(jù)的操作,客戶端首先將請求發(fā)送到元數(shù)據(jù)服務(wù)器,元數(shù)據(jù)服務(wù)器接收到請求后,如果元數(shù)據(jù)在結(jié)構(gòu)化緩存中,則直接返回結(jié)果,如果不在結(jié)構(gòu)化緩存中,則從鍵值存儲(chǔ)中讀取結(jié)果,并且反序列化到結(jié)構(gòu)化緩存中。這種方法雖然能夠在緩存命中的時(shí)候提供快速的數(shù)據(jù)處理,存在內(nèi)存空間不能充分利用和序列化反序列化開銷較大的問題。其中內(nèi)存不能充分利用主要體現(xiàn)在結(jié)構(gòu)化緩存和鍵值數(shù)據(jù)庫中的非結(jié)構(gòu)化緩存在數(shù)據(jù)的內(nèi)容上具有一致性,但是卻以不同的形態(tài)存儲(chǔ)了兩份內(nèi)容。序列化和反序列化的開銷體現(xiàn)在在緩存不命中的情況下,每一次對于一個(gè)文件元數(shù)據(jù)中一個(gè)部分的修改或者讀取,都需要對整個(gè)文件的元數(shù)據(jù)進(jìn)行序列化和反序列化操作,這種方式導(dǎo)致數(shù)據(jù)的處理比較低下。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明旨在至少解決上述技術(shù)問題之一。
為此,本發(fā)明的一個(gè)目的在于提出一種元數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)元數(shù)據(jù)在內(nèi)存與外存的統(tǒng)一表示,無需對元數(shù)據(jù)字段進(jìn)行序列化和反序列化操作。
為了實(shí)現(xiàn)上述目的,本發(fā)明的實(shí)施例公開了一種元數(shù)據(jù)結(jié)構(gòu),包括:目錄元數(shù)據(jù)結(jié)構(gòu),所述目錄元數(shù)據(jù)包括:目錄索引;多個(gè)目錄元數(shù)據(jù),其中,所有目錄元數(shù)據(jù)的數(shù)據(jù)字段為定長字段;文件元數(shù)據(jù)結(jié)構(gòu),所述文件元數(shù)據(jù)結(jié)構(gòu)包括:文件索引;多個(gè)文件元數(shù)據(jù),其中,所有文件元數(shù)據(jù)的數(shù)據(jù)字段為定長字段。
進(jìn)一步地,所述目錄索引為目錄的路徑,所述目錄元數(shù)據(jù)包括目錄的訪問權(quán)限標(biāo)識(shí)、目錄的用戶標(biāo)識(shí)、目錄的用戶組標(biāo)識(shí)、目錄的訪問時(shí)間和目錄的全局唯一標(biāo)識(shí)。
進(jìn)一步地,所述文件索引包括目錄元數(shù)據(jù)的父目錄的全局唯一標(biāo)識(shí)和目錄文件名,所述文件元數(shù)據(jù)包括訪問時(shí)間、訪問模式、用戶標(biāo)識(shí)、組標(biāo)識(shí)、修改時(shí)間、文件的內(nèi)容的訪問時(shí)間、文件的大小、文件塊的大小和文件元數(shù)據(jù)的全局唯一標(biāo)識(shí)。
根據(jù)本發(fā)明實(shí)施例的元數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)元數(shù)據(jù)在內(nèi)存與外存的統(tǒng)一表示,無需對元數(shù)據(jù)字段進(jìn)行序列化和反序列化操作。
本發(fā)明的另一個(gè)目的在于提出一種對上述實(shí)施例的元數(shù)據(jù)結(jié)構(gòu)的操作方法,包括:所述目錄元數(shù)據(jù)結(jié)構(gòu)在存儲(chǔ)過程中,使用所述目錄的路徑作為鍵,多個(gè)目錄元數(shù)據(jù)作為值;所述文件元數(shù)據(jù)結(jié)構(gòu)在存儲(chǔ)過程中,使用目錄元數(shù)據(jù)的父目錄的全局唯一標(biāo)識(shí)和目錄文件名作為鍵,使用所述多個(gè)文件元數(shù)據(jù)作為值。
進(jìn)一步地,還包括:從內(nèi)存寫回外存時(shí)將元數(shù)據(jù)的內(nèi)存字段直接拼接寫入到鍵值數(shù)據(jù)庫中;在從外存讀取元數(shù)據(jù)到內(nèi)存時(shí)從鍵值數(shù)據(jù)庫中讀出,在內(nèi)存中直接填入元數(shù)據(jù)的內(nèi)存結(jié)構(gòu)表示。
根據(jù)本發(fā)明實(shí)施例的元數(shù)據(jù)結(jié)構(gòu)的操作方法,實(shí)現(xiàn)了無序列化和反序列的高效鍵值存儲(chǔ)。
本發(fā)明的另一個(gè)目的在于提出一種對上述實(shí)施例的元數(shù)據(jù)結(jié)構(gòu)的定位方法,包括:根據(jù)文件元數(shù)據(jù)結(jié)構(gòu)的大小和塊大小確定文件內(nèi)容存儲(chǔ)的具體位置;根據(jù)外部輸入的偏移量獲取文件塊的偏移;根據(jù)所述文件的全局唯一標(biāo)識(shí)和所述文件塊的偏移得到所述文件塊在存儲(chǔ)集群中的位置。
根據(jù)本發(fā)明實(shí)施例的元數(shù)據(jù)結(jié)構(gòu)的定位方法,可以通過文件的大小和文件的塊大小直接定位文件。
本發(fā)明的另一個(gè)目的在于提出一種對上述實(shí)施例的元數(shù)據(jù)結(jié)構(gòu)的切分方法,包括:A1:將元數(shù)據(jù)操作分為訪問控制型操作和文件定位型操作;A2:將元數(shù)據(jù)字段分為訪問控制類型的元數(shù)據(jù)和描述文件空間分布的元數(shù)據(jù)字段,其中,所述訪問控制類型的元數(shù)據(jù)包括所述訪問時(shí)間、訪問模式、用戶標(biāo)識(shí)和組標(biāo)識(shí),所述描述文件空間分布的元數(shù)據(jù)字段包括:修改時(shí)間、文件的內(nèi)容的訪問時(shí)間、文件的大小、文件塊的大小和文件元數(shù)據(jù)的全局唯一標(biāo)識(shí);A3:將文件系統(tǒng)元數(shù)據(jù)操作分為需要訪問所有的元數(shù)據(jù)操作、需要改變訪問控制類型的操作和需要改變描述文件空間分布的元數(shù)據(jù)操作,其中,所述需要訪問所有的元數(shù)據(jù)操作包括獲取文件元數(shù)據(jù)操作、刪除文件操作和重命名文件操作,所述需要改變訪問控制類型的操作包括改變用戶組操作、改變用戶權(quán)限操作、創(chuàng)建文件操作和打開文件操作,所述需要改變描述文件空間分布的元數(shù)據(jù)操作包括讀文件內(nèi)容操作、寫文件內(nèi)容操作和改變文件大小操作;A4:基于A1-A3的分類,將元數(shù)據(jù)字段進(jìn)行聚集,聚集訪問控制類型的元數(shù)據(jù)字段為訪問控制元數(shù)據(jù)塊,聚集描述文件空間分布的元數(shù)據(jù)字段為文件空間描述元數(shù)據(jù)塊。
進(jìn)一步地,還包括:對所述需要改變訪問控制類型的操作和所述需要改變描述文件空間分布的元數(shù)據(jù)操作時(shí),每次的更改和讀取將讀取和修改的一種類型的元數(shù)據(jù);當(dāng)處理一個(gè)修改類型的元數(shù)據(jù)操作時(shí),從鍵值系統(tǒng)中獲得需要修改的元數(shù)據(jù),替換數(shù)據(jù)后直接寫入鍵值數(shù)據(jù)庫。
根據(jù)本發(fā)明實(shí)施例的元數(shù)據(jù)結(jié)構(gòu)的切分方法,對基本的元數(shù)據(jù)操作進(jìn)行分類,將其按照所需要修改的元數(shù)據(jù)字段進(jìn)行劃分,減少的每次元數(shù)據(jù)操作所訪問的字段的長度。
本發(fā)明的附加方面和優(yōu)點(diǎn)將在下面的描述中部分給出,部分將從下面的描述中變得明顯,或通過本發(fā)明的實(shí)踐了解到。
附圖說明
本發(fā)明的上述和/或附加的方面和優(yōu)點(diǎn)從結(jié)合下面附圖對實(shí)施例的描述中將變得明顯和容易理解,其中:
圖1是本發(fā)明一個(gè)實(shí)施例的目錄元數(shù)據(jù)的結(jié)構(gòu)圖;
圖2是本發(fā)明一個(gè)實(shí)施例的與訪問控制相關(guān)的元數(shù)據(jù)的結(jié)構(gòu)圖;
圖3是本發(fā)明一個(gè)實(shí)施例的與文件數(shù)據(jù)布局相關(guān)的元數(shù)據(jù)結(jié)構(gòu)圖;
圖4是本發(fā)明一個(gè)實(shí)施例的文件操作與文件元數(shù)據(jù)的對應(yīng)關(guān)系圖;
圖5是本發(fā)明一個(gè)實(shí)施例的總體結(jié)構(gòu)圖;。
具體實(shí)施方式
下面詳細(xì)描述本發(fā)明的實(shí)施例,所述實(shí)施例的示例在附圖中示出,其中自始至終相同或類似的標(biāo)號(hào)表示相同或類似的元件或具有相同或類似功能的元件。下面通過參考附圖描述的實(shí)施例是示例性的,僅用于解釋本發(fā)明,而不能理解為對本發(fā)明的限制。
參照下面的描述和附圖,將清楚本發(fā)明的實(shí)施例的這些和其他方面。在這些描述和附圖中,具體公開了本發(fā)明的實(shí)施例中的一些特定實(shí)施方式,來表示實(shí)施本發(fā)明的實(shí)施例的原理的一些方式,但是應(yīng)當(dāng)理解,本發(fā)明的實(shí)施例的范圍不受此限制。相反,本發(fā)明的實(shí)施例包括落入所附加權(quán)利要求書的精神和內(nèi)涵范圍內(nèi)的所有變化、修改和等同物。
以下結(jié)合附圖描述本發(fā)明。
根據(jù)本發(fā)明實(shí)施例的元數(shù)據(jù)結(jié)構(gòu),包括目錄元數(shù)據(jù)結(jié)構(gòu)和文件元數(shù)據(jù)結(jié)構(gòu)。
其中,目錄元數(shù)據(jù)包括目錄索引和多個(gè)目錄元數(shù)據(jù),所有目錄元數(shù)據(jù)的數(shù)據(jù)字段為定長字段。
圖1是本發(fā)明一個(gè)實(shí)施例的目錄元數(shù)據(jù)的結(jié)構(gòu)圖。如圖1所示,在本發(fā)明的一個(gè)實(shí)施例中,目錄索引為目錄的路徑PATH,目錄元數(shù)據(jù)包括目錄的訪問權(quán)限標(biāo)識(shí)MODE、目錄的用戶標(biāo)識(shí)UID、目錄的用戶組標(biāo)識(shí)GID、目錄的訪問時(shí)間CTIME。所列的元數(shù)據(jù)字段為定長字段,如果增加了其他字段,只要其增加的為定長字段,都在此方法的說明范圍之內(nèi)。目錄元數(shù)據(jù)的存儲(chǔ)以PATH為索引項(xiàng),所有定長的元數(shù)據(jù)組合為一個(gè)新的定長字段,保證了目錄元數(shù)據(jù)為定長數(shù)據(jù)。在此基礎(chǔ)上,最為重要的特征是還具備目錄的全局唯一標(biāo)識(shí)DUUID。這是一個(gè)能夠在全局唯一確定一個(gè)目錄特征的定長字段。
在圖1中,索引字段PATH為不定長的字符串,其長度根據(jù)路徑的不同而有不同,其范圍為1~255個(gè)字節(jié),在實(shí)際的使用中,根據(jù)支持的語言的不同,長度還可以擴(kuò)展到1024字節(jié)。其余的字段為8字節(jié)的定長字段,其中DUUID在這里設(shè)定為一個(gè)8字節(jié)字段,理論上而言,其能夠支持足夠多的目錄,但是如果系統(tǒng)對唯一值的分配有更高的要求,則可以擴(kuò)展到16字節(jié),無論是哪一種擴(kuò)展,都需要保證了目錄元數(shù)據(jù)為定長數(shù)據(jù)。在這個(gè)實(shí)例中,其長度為40個(gè)字節(jié)。
管理目錄元數(shù)據(jù)的服務(wù)器在創(chuàng)建目錄的時(shí)候,會(huì)為每個(gè)目錄分配一個(gè)全局唯一的DUUID,可以通過兩種手段管理DUUID,一種是構(gòu)建一個(gè)Bitmap表,每個(gè)bit記錄一個(gè)目錄的DUUID是否會(huì)被分配。但這種方式在每次分配的時(shí)候會(huì)帶來額外的查詢和管理開銷,還有一種方法是將DUUID從0開始計(jì)數(shù),這種方法的優(yōu)勢是每次從最大的值加1后作為目錄的DUUID即可,但是當(dāng)創(chuàng)建的目錄數(shù)目大于8個(gè)字節(jié)所能表示的值的時(shí)候,這種方法則不可以使用。但是8個(gè)字節(jié)所能標(biāo)識(shí)的數(shù)量級在當(dāng)前的系統(tǒng)中是足夠用的,所以并不會(huì)成為瓶頸。系統(tǒng)一旦為一個(gè)目錄分配了一個(gè)DUUID后,對于這個(gè)目錄而言,其整個(gè)生命周期內(nèi),這個(gè)DUUID是不變的,相當(dāng)于這個(gè)目錄的指紋,當(dāng)目錄被重命名,或者被移動(dòng)到另外的路徑之后,其DUUID是不變的。所以通過DUUID可以在全局唯一確定一個(gè)目錄。
文件元數(shù)據(jù)結(jié)構(gòu)包括文件索引和多個(gè)文件元數(shù)據(jù),文件元數(shù)據(jù)的數(shù)據(jù)字段為定長字段。
圖2是本發(fā)明一個(gè)實(shí)施例的與訪問控制相關(guān)的元數(shù)據(jù)的結(jié)構(gòu)圖,圖3是本發(fā)明一個(gè)實(shí)施例的與文件數(shù)據(jù)布局相關(guān)的元數(shù)據(jù)結(jié)構(gòu)圖。如圖2和圖3所示,在本發(fā)明的一個(gè)實(shí)施例中,文件索引包括目錄元數(shù)據(jù)的父目錄的全局唯一標(biāo)識(shí)DUUID和目錄文件名FNAME,以DUUID+FNAME構(gòu)成文件的索引項(xiàng),這是一個(gè)有8字節(jié)構(gòu)成的字段和一個(gè)不定長的字符串的組合,由于DUUID是全局唯一的目錄標(biāo)識(shí),所以不會(huì)存在兩個(gè)目錄共同使用一個(gè)目錄標(biāo)識(shí),所以使用DUUID+文件名的方式就能在全局唯一確定一個(gè)文件。在傳統(tǒng)方法中,確定一個(gè)文件的唯一性采用的是PATH+FNAME的方式,這種方式在本專利基于鍵值存儲(chǔ)的模型中,會(huì)占用更多的存儲(chǔ)空間,而且目錄深度的不同也會(huì)造成鍵值長度的不同,而使用DUUID+FNAME的方法可以減少對于路徑的存儲(chǔ)。在這個(gè)實(shí)例中,DUUID+FNAME的長度不能超過255字節(jié),在實(shí)際中,根據(jù)系統(tǒng)的不同,可以擴(kuò)展這種存儲(chǔ)。圖1和圖2的Value部分都為定長的字段,從而保證了文件元數(shù)據(jù)為定長的。文件元數(shù)據(jù)包括訪問時(shí)間CTIME、訪問模式MODE、用戶標(biāo)識(shí)UID、組標(biāo)識(shí)GID、修改時(shí)間MTIME、文件的內(nèi)容的訪問時(shí)間ATIME、文件的大小SIZE、文件塊的大小BSIZE和文件元數(shù)據(jù)的全局唯一標(biāo)識(shí)FUUID。在元數(shù)據(jù)中,重要的特征是具有FUUID用于在全局能夠惟一確定一個(gè)文件的標(biāo)識(shí),且為一個(gè)定長的字段。其余的各項(xiàng)字段也皆為定長字段,如果增加了更多的字段,只要為定長字段,都在此說明之內(nèi)。這些定長字段組合為新的定長的字段,從而保證了文件元數(shù)據(jù)為定長的。
本發(fā)明的實(shí)施例還公開了一種元數(shù)據(jù)結(jié)構(gòu)的操作方法,包括:目錄元數(shù)據(jù)結(jié)構(gòu)在存儲(chǔ)過程中,使用目錄的路徑作為鍵,多個(gè)目錄元數(shù)據(jù)作為值;文件元數(shù)據(jù)結(jié)構(gòu)在存儲(chǔ)過程中,使用目錄元數(shù)據(jù)的父目錄的全局唯一標(biāo)識(shí)和目錄文件名作為鍵,使用多個(gè)文件元數(shù)據(jù)作為值。
在本發(fā)明的一個(gè)實(shí)施例中,元數(shù)據(jù)結(jié)構(gòu)的操作方法還包括:從內(nèi)存寫回外存時(shí)將元數(shù)據(jù)的內(nèi)存字段直接拼接寫入到鍵值數(shù)據(jù)庫中;在從外存讀取元數(shù)據(jù)到內(nèi)存時(shí)從鍵值數(shù)據(jù)庫中讀出,在內(nèi)存中直接填入元數(shù)據(jù)的內(nèi)存結(jié)構(gòu)表示。
具體地,圖1、圖2和圖3的實(shí)例還描述了使用鍵值存儲(chǔ)元數(shù)據(jù)的方法。在存儲(chǔ)過程中,在存儲(chǔ)過程中,對于目錄的元數(shù)據(jù),使用PATH作為鍵,其余的元數(shù)據(jù)作為值。對于文件元數(shù)據(jù),使用DUUID+FNAME作為鍵,其余元數(shù)據(jù)作為值。顯而易見的,使用PATH和DUUID+FNAME的機(jī)制能夠保證文件系統(tǒng)的存儲(chǔ)中不會(huì)出現(xiàn)相同文件或者目錄具有不同的鍵。從而保證了邏輯上的唯一性。這種設(shè)計(jì)方法適用于將目錄和文件的元數(shù)據(jù)分布在多個(gè)節(jié)點(diǎn)上的元數(shù)據(jù)布局。
這種定長的存儲(chǔ)方法可以減少在存儲(chǔ)過程中不必要的序列化開銷。在元數(shù)據(jù)訪問的實(shí)現(xiàn)過程中,使用一個(gè)元數(shù)據(jù)的結(jié)構(gòu)體可以完整的描述圖1,圖2和圖3所表示的Value值。由于是在內(nèi)存中的結(jié)構(gòu)體,對于任何一個(gè)Value,盡管有多個(gè)元數(shù)據(jù)項(xiàng),但是其在內(nèi)存的空間是連續(xù)的?;谶@樣的原理,可以直接將內(nèi)存中的數(shù)據(jù)寫入到鍵值存儲(chǔ)中,在這種情況下,就不需要對數(shù)據(jù)進(jìn)行拷貝,或者像很多序列化操作一樣,需要提交額外的元數(shù)據(jù)來保證結(jié)構(gòu)體各個(gè)字段的長度。在這種存儲(chǔ)方式下,實(shí)際存儲(chǔ)的Value長度是固定的。以實(shí)例為例,其目錄元數(shù)據(jù)的長度為40Bytes,兩種文件元數(shù)據(jù)的長度分別為32Bytes和40Bytes。鍵值存儲(chǔ)在存儲(chǔ)過程中通過直接獲得指向這些區(qū)域的指針,就可以直接將這部分的數(shù)據(jù)存儲(chǔ)到鍵值數(shù)據(jù)庫中,避免了額外的內(nèi)存開銷。在讀出這些數(shù)據(jù)時(shí),由于存儲(chǔ)的數(shù)據(jù)的長度和順序是固定的,所以在實(shí)現(xiàn)過程中,直接將讀出的數(shù)據(jù)放到定義好的元數(shù)據(jù)結(jié)構(gòu)中,就可以供上層應(yīng)用提取和使用。相對于傳統(tǒng)的方法,這種方法沒有了序列化和反序列化的開銷,數(shù)據(jù)在內(nèi)存中始終只存在一份,沒有拷貝,降低了對于內(nèi)存的使用,也能夠利用鍵值存儲(chǔ)的一致性保證數(shù)據(jù)的一致性和可用性,簡化了數(shù)據(jù)處理的流程,提高了可靠性。
本發(fā)明的實(shí)施例還公開了一種元數(shù)據(jù)結(jié)構(gòu)的定位方法,包括:根據(jù)文件元數(shù)據(jù)結(jié)構(gòu)的大小和塊大小確定文件內(nèi)容存儲(chǔ)的具體位置;根據(jù)外部輸入的偏移量獲取文件塊的偏移;根據(jù)文件的全局唯一標(biāo)識(shí)和文件塊的偏移得到文件塊在存儲(chǔ)集群中的位置。
具體地,圖3給出了一種基于在分布式環(huán)境下的二元定位元數(shù)據(jù)方法,對于傳統(tǒng)的文件元數(shù)據(jù)存儲(chǔ)而言,需要有一塊區(qū)域標(biāo)明各個(gè)文件塊所在的位置。這一部分的元數(shù)據(jù)往往占用了較大的空間。由于在分布式系統(tǒng)中,文件塊在各個(gè)節(jié)點(diǎn)是以文件的形式存儲(chǔ),所以對于分布式文件系統(tǒng)而言,只需要標(biāo)明其文件塊所在的節(jié)點(diǎn),同時(shí)給文件塊一個(gè)唯一的標(biāo)識(shí),使其能夠在存儲(chǔ)文件塊的節(jié)點(diǎn)找到這個(gè)文件塊。本實(shí)例提出的這種方法可以在僅僅使用三個(gè)字段,供24bytes的空間,就可以唯一確定一個(gè)文件的位置,并且能夠保證其他元數(shù)據(jù)操作的高效執(zhí)行。這種方法在每個(gè)文件創(chuàng)建的時(shí)候?yàn)闉槊總€(gè)文件確定一個(gè)文件塊大小BSIZE,這個(gè)大小決定了文件塊的最小單位。如果文件本身的大小小于這個(gè)單位,則按照一個(gè)單位計(jì)算。對于文件的寫入和讀取,POSIX接口會(huì)提供寫入文件的偏移OFFSET,寫入的長度WSIZE這兩個(gè)參數(shù)。對于一次寫操作而言,客戶端根據(jù)OFFSET/BSIZE可以確定寫入的起始文件塊,通過WSIZE可以計(jì)算出需要往后占用的文件塊,由此可以確定一個(gè)需要寫入的文件塊的編號(hào)組(X1,X2,…,Xn)。這個(gè)時(shí)候,需要一個(gè)全局唯一的標(biāo)識(shí)來在分布式存儲(chǔ)中確定這些文件塊。此方法使用FUUID這個(gè)文件的全局標(biāo)識(shí)和文件塊編號(hào)確定一個(gè)全局唯一的文件塊,如對于第i塊,其標(biāo)識(shí)為FUUID+Xi。之后通過一種類型的哈希算法,確定這個(gè)文件塊需要存儲(chǔ)的具體節(jié)點(diǎn)Ni=HASH(FUUID+Xi)。當(dāng)需要讀取這些文件塊的時(shí)候,同樣通過OFFSET和WSIZE計(jì)算出文件塊的編號(hào)組,使用哈希算法查找到塊所在的節(jié)點(diǎn)位置,從該節(jié)點(diǎn)讀出文件塊。需要明確的是,由于FUUID+Xi在全局是唯一的,所以在存儲(chǔ)文件塊的各個(gè)節(jié)點(diǎn),依然用FUUID+Xi這個(gè)標(biāo)識(shí)來在全局確定一個(gè)文件塊。
本發(fā)明的實(shí)施例還公開了一種元數(shù)據(jù)結(jié)構(gòu)的切分方法,包括:
A1:將元數(shù)據(jù)操作分為訪問控制型操作和文件定位型操作。
A2:將元數(shù)據(jù)字段分為訪問控制類型的元數(shù)據(jù)和描述文件空間分布的元數(shù)據(jù)字段。其中,訪問控制類型的元數(shù)據(jù)包括訪問時(shí)間、訪問模式、用戶標(biāo)識(shí)和組標(biāo)識(shí),描述文件空間分布的元數(shù)據(jù)字段包括:修改時(shí)間、文件的內(nèi)容的訪問時(shí)間、文件的大小、文件塊的大小和文件元數(shù)據(jù)的全局唯一標(biāo)識(shí)。
A3:將文件系統(tǒng)元數(shù)據(jù)操作分為需要訪問所有的元數(shù)據(jù)操作、需要改變訪問控制類型的操作和需要改變描述文件空間分布的元數(shù)據(jù)操作。其中,需要訪問所有的元數(shù)據(jù)操作包括獲取文件元數(shù)據(jù)操作、刪除文件操作和重命名文件操作,需要改變訪問控制類型的操作包括改變用戶組操作、改變用戶權(quán)限操作、創(chuàng)建文件操作和打開文件操作,需要改變描述文件空間分布的元數(shù)據(jù)操作包括讀文件內(nèi)容操作、寫文件內(nèi)容操作和改變文件大小操作。
A4:基于A1-A3的分類,將元數(shù)據(jù)字段進(jìn)行聚集,聚集訪問控制類型的元數(shù)據(jù)字段為訪問控制元數(shù)據(jù)塊,聚集描述文件空間分布的元數(shù)據(jù)字段為文件空間描述元數(shù)據(jù)塊。
在本發(fā)明的一個(gè)實(shí)施例中,元數(shù)據(jù)結(jié)構(gòu)的切分方法還包括:對需要改變訪問控制類型的操作和需要改變描述文件空間分布的元數(shù)據(jù)操作時(shí),每次的更改和讀取將讀取和修改的一種類型的元數(shù)據(jù);當(dāng)處理一個(gè)修改類型的元數(shù)據(jù)操作時(shí),從鍵值系統(tǒng)中獲得需要修改的元數(shù)據(jù),替換數(shù)據(jù)后直接寫入鍵值數(shù)據(jù)庫。
具體地,在圖4中列出了主要的針對文件元數(shù)據(jù)操作,并標(biāo)記出各種操作所管轄的元數(shù)據(jù)區(qū)域。從圖3中可以歸納出三類操作,包括第一類操作,其需要訪問所有的元數(shù)據(jù),包括獲取文件元數(shù)據(jù)操作(getattr),刪除文件操作(remove)和重命名文件操作(rename)。第二類操作,其需要改變訪問控制類型的操作,包括改變用戶組操作(chown),改變用戶權(quán)限操作(chmod),創(chuàng)建文件操作(create),打開文件操作(open)。第三類操作,其需要改變描述文件空間分布的元數(shù)據(jù),包括讀文件內(nèi)容操作(read),寫文件內(nèi)容操作(write),改變文件大小操作(truncate)。
下面就從三種類型中各選出一個(gè)代表來描述這種存儲(chǔ)方法。在第一類的存儲(chǔ)方法中,選擇getattr操作,當(dāng)客戶端執(zhí)行這個(gè)操作時(shí),文件元數(shù)據(jù)服務(wù)端接收到這個(gè)請求后,根據(jù)請求的文件路徑,如圖2和圖3的鍵值數(shù)據(jù)庫中分別根據(jù)請求的文件路徑查找出需要讀取的字段,返回客戶端。在第二類的create方法中,當(dāng)客戶端創(chuàng)建一個(gè)文件的時(shí)候,文件服務(wù)器端產(chǎn)生一個(gè)文件元數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),根據(jù)客戶端請求給出的信息,填充MODE、UID和GID字段,根據(jù)服務(wù)器的時(shí)間填充CTIME字段。之后將這個(gè)數(shù)據(jù)寫入鍵值數(shù)據(jù)庫中。需要注意的是,在這個(gè)過程中另一個(gè)描述元數(shù)據(jù)分布的鍵值數(shù)據(jù)庫并未寫入任何數(shù)據(jù)。當(dāng)客戶端向剛才創(chuàng)建文件的寫入信息的時(shí)候,出現(xiàn)了第三類方法write,當(dāng)服務(wù)器端接受到給出的信息后,服務(wù)器端創(chuàng)建一個(gè)如圖3所示的文件分布的元數(shù)據(jù)結(jié)構(gòu),填充各個(gè)字段,并為改文件分配一個(gè)全局唯一標(biāo)識(shí)。之后將這段內(nèi)容寫入鍵值數(shù)據(jù)庫。類似的,這三類方法都會(huì)根據(jù)各自訪問的數(shù)據(jù)情況訪問一個(gè)或者兩個(gè)鍵值數(shù)據(jù)庫。這樣做的優(yōu)勢是在使用鍵值數(shù)據(jù)庫直接存儲(chǔ)元數(shù)據(jù)的時(shí)候,長長由于某些元數(shù)據(jù)操作僅僅修改一部分元數(shù)據(jù)而導(dǎo)致整個(gè)值需要重新修改,寫入,造成了寫放大。這種方法解決了這樣的問題。
圖5是本發(fā)明一個(gè)實(shí)施例的總體結(jié)構(gòu)圖,本領(lǐng)人員根據(jù)以上說明,可以將本發(fā)明中的元數(shù)據(jù)結(jié)構(gòu)和基于其的操作方法、定位方法、切分方法有機(jī)的串聯(lián)組合為一體。
另外,本發(fā)明實(shí)施例的元數(shù)據(jù)結(jié)構(gòu)和基于其的操作方法、定位方法、切分方法的其它構(gòu)成以及作用對于本領(lǐng)域的技術(shù)人員而言都是已知的,為了減少冗余,不做贅述。
在本說明書的描述中,參考術(shù)語“一個(gè)實(shí)施例”、“一些實(shí)施例”、“示例”、“具體示例”、或“一些示例”等的描述意指結(jié)合該實(shí)施例或示例描述的具體特征、結(jié)構(gòu)、材料或者特點(diǎn)包含于本發(fā)明的至少一個(gè)實(shí)施例或示例中。在本說明書中,對上述術(shù)語的示意性表述不一定指的是相同的實(shí)施例或示例。而且,描述的具體特征、結(jié)構(gòu)、材料或者特點(diǎn)可以在任何的一個(gè)或多個(gè)實(shí)施例或示例中以合適的方式結(jié)合。
盡管已經(jīng)示出和描述了本發(fā)明的實(shí)施例,本領(lǐng)域的普通技術(shù)人員可以理解:在不脫離本發(fā)明的原理和宗旨的情況下可以對這些實(shí)施例進(jìn)行多種變化、修改、替換和變型,本發(fā)明的范圍由權(quán)利要求及其等同限定。