本發(fā)明涉及一種基于glusterfs的高容錯的分布式存儲方法,特別針對具有高速在線和低速離線備份雙存儲的以文件夾為原子單位的數(shù)據(jù)存儲。
背景技術(shù):
近年來,隨著計算機(jī)和信息技術(shù)的迅猛發(fā)展和普及應(yīng)用,行業(yè)應(yīng)用系統(tǒng)的規(guī)模迅速擴(kuò)大,所產(chǎn)生的數(shù)據(jù)呈爆炸性增長。動輒達(dá)到數(shù)百tb甚至數(shù)百pb規(guī)模的行業(yè)/企業(yè)大數(shù)據(jù)已遠(yuǎn)遠(yuǎn)超出了傳統(tǒng)的計算機(jī)存儲能力,因此,分布式存儲的使用已經(jīng)越來越普及。
glusterfs是目前較為成熟的開源分布式存儲軟件,是一個支持pb級數(shù)據(jù)存儲的無元數(shù)據(jù)服務(wù)器的分布式存儲系統(tǒng),支持線性性能擴(kuò)展。通過解除對元數(shù)據(jù)服務(wù)器的要求,消除了單點故障的性能瓶頸,真正實現(xiàn)了并行化數(shù)據(jù)訪問。
對于許多大數(shù)據(jù)應(yīng)用而言,雖然數(shù)據(jù)總體規(guī)模非常大,但在特定時間段內(nèi)需要訪問的數(shù)據(jù)通常僅占其中很小部分。因此,對于類似的大數(shù)據(jù)應(yīng)用,不僅需要大規(guī)模的存儲數(shù)據(jù),還需要快速的訪問部分?jǐn)?shù)據(jù),而目前的數(shù)據(jù)訪問瓶頸大部分仍然是磁盤性能。為了解決磁盤性能瓶頸,可以使用訪問速度高的高速磁盤,如固態(tài)硬盤。但是目前磁盤的訪問速度與其單位存儲價格基本成正比,即訪問速度越高的存儲介質(zhì)單位存儲成本往往更高。因此,對于一個擁有海量數(shù)據(jù)且某一時間段內(nèi)只需要訪問一部分?jǐn)?shù)據(jù)的應(yīng)用而言,全部使用高速磁盤或者全部使用普通廉價磁盤都是不合理的,全部使用高速磁盤由于很多數(shù)據(jù)在很長時間基本不會被訪問,造成了存儲成本的浪費;如果全部使用普通廉價磁盤,則不能滿足快速訪問數(shù)據(jù)的需求。對于此類應(yīng)用,可以將多個普通磁盤和少量的高速磁盤通過網(wǎng)絡(luò)連接成glusterfs集群,用高速磁盤當(dāng)做存儲節(jié)點創(chuàng)建高速訪問distributed類型數(shù)據(jù)卷,用普通磁盤當(dāng)做存儲節(jié)點創(chuàng)建低速訪問distributed類型數(shù)據(jù)卷。實現(xiàn)在存儲成本限制下,提供接近高速磁盤的數(shù)據(jù)訪問服務(wù)。
對于許多應(yīng)用而言,其存儲數(shù)據(jù)是一個文件夾,并且文件夾中的文件相互依賴,一旦一個文件損壞或者丟失,則整個應(yīng)用數(shù)據(jù)文件夾損壞。如果應(yīng)用需要存儲的是大量這樣不可分割的數(shù)據(jù)文件夾,對于每個一個數(shù)據(jù)文件夾,目前的glusterfs存儲機(jī)制是文件會根據(jù)文件名hash分布存儲在不同的節(jié)點的磁盤上,這樣面臨的一個問題是,一旦一個節(jié)點出現(xiàn)故障,幾乎所有的數(shù)據(jù)文件夾可能都會缺少部分文件,造成所有的數(shù)據(jù)文件夾損壞不可使用。
以上glusterfs集群中的高速數(shù)據(jù)卷是為了加快數(shù)據(jù)訪問速度,其中存儲的數(shù)據(jù)低速數(shù)據(jù)卷中都有備份,所以可以允許節(jié)點損壞造成的部分?jǐn)?shù)據(jù)丟失,但是對于存儲整體數(shù)據(jù)文件夾,一個節(jié)點的故障則會造成數(shù)據(jù)的全部損壞,這是不能容忍的。并且由于高速數(shù)據(jù)卷采用高速磁盤做存儲介質(zhì),代價比較昂貴,而glusterfs的replicated數(shù)據(jù)卷的存儲利用率非常低,同時,使用備份存儲因為寫數(shù)據(jù)的時候需要寫多份,會降低寫性能,對于高速訪問數(shù)據(jù)卷是不合適的。所以需要一個替代方案能夠滿足以下要求:
1.存儲利用率高,由于高速代價非常高,不能以較大的犧牲存儲保證數(shù)據(jù)安全性。
2.數(shù)據(jù)是相對安全的,一個節(jié)點的故障不能影響其他節(jié)點的數(shù)據(jù),高速存儲區(qū)中的數(shù)據(jù)在低速廉價存儲區(qū)都有備份,少量的數(shù)據(jù)文件夾的丟失可以接受,只需重新從低速存儲區(qū)再復(fù)制一份即可。
3.不會對數(shù)據(jù)的訪問和存儲速度造成較大影響。
目前還沒有一個完整的存儲方案能夠滿足以上要求,glusterfs是基于彈性hash算法定位文件,所以文件的分布具有隨機(jī)性,對于同一個整體數(shù)據(jù)文件夾中的文件不能保證存儲在同一節(jié)點上,而這種整體數(shù)據(jù)文件夾中文件損壞或者丟失一個,整體數(shù)據(jù)文件夾即損壞。所以,需要一種能夠?qū)⒄w文件夾中的文件存儲在同一節(jié)點上的高可用分布式存儲系統(tǒng)。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于針對現(xiàn)有存儲技術(shù)的不足,針對整體數(shù)據(jù)文件夾的高效可靠存儲的需求,提出的基于glusterfs分布式存儲的以文件夾為單位分布的高效可靠分布式存儲方法。
一種基于glusterfs的高容錯分布式存儲方法,包括:
步驟101、搭建glusterfs集群,并創(chuàng)建包含若干存儲節(jié)點的distributed類型數(shù)據(jù)卷,設(shè)置數(shù)據(jù)卷閾值,數(shù)據(jù)文件夾將以文件夾為單位分布存儲在數(shù)據(jù)卷中;
步驟102、在所有節(jié)點中創(chuàng)建數(shù)據(jù)文件夾;
步驟103、尋找最優(yōu)節(jié)點,將最優(yōu)節(jié)點上創(chuàng)建的所述數(shù)據(jù)文件夾的哈希區(qū)間定為最大,使所有的文件哈希值落在所述最優(yōu)節(jié)點上,以使所述數(shù)據(jù)文件夾的所有文件都存儲在所述最優(yōu)節(jié)點上,其他節(jié)點上創(chuàng)建的所述數(shù)據(jù)文件夾的哈希區(qū)間設(shè)置為0,以使所述數(shù)據(jù)文件夾的所有文件哈希值不會落在這些其他節(jié)點的哈希區(qū)間內(nèi);
步驟104、在每個節(jié)點創(chuàng)建的所述數(shù)據(jù)文件夾的擴(kuò)展屬性trusted.glusterfs.dht中記錄分配到的哈希區(qū)間;
步驟105、使用glusterfs環(huán)境下的哈希計算方法,根據(jù)創(chuàng)建的將要存儲的所述數(shù)據(jù)文件夾中某個文件的文件名計算哈希值;
步驟106、根據(jù)計算得出的文件的哈希值,查看所有節(jié)點的所述數(shù)據(jù)文件夾的擴(kuò)展屬性中記錄的已被分配到的哈希區(qū)間,確定計算得出的文件的哈希值所在的節(jié)點;
步驟107、在確定的待存儲節(jié)點上的所述數(shù)據(jù)文件夾下創(chuàng)建文件;依據(jù)相同的方法完成其他文件的創(chuàng)建,完成數(shù)據(jù)文件夾的存儲。
進(jìn)一步地,步驟103中所述尋找最優(yōu)節(jié)點進(jìn)一步包括:
步驟1031、掃描數(shù)據(jù)卷的所有節(jié)點的可用容量大小和已經(jīng)存儲數(shù)據(jù)的容量大??;步驟1032、查看所有節(jié)點的可用容量大小是否大于數(shù)據(jù)卷閾值,如果都小于閾值則選擇可用容量最大的節(jié)點為最優(yōu)節(jié)點;如果存在可用容量大于閾值的節(jié)點則在可用容量大于閾值的節(jié)點中選擇已經(jīng)存儲數(shù)據(jù)最少的節(jié)點作為最優(yōu)節(jié)點。
進(jìn)一步地,當(dāng)數(shù)據(jù)卷已經(jīng)存儲一定量數(shù)據(jù)時新增節(jié)點使得數(shù)據(jù)不均衡時,執(zhí)行再均衡操作使所有節(jié)點的負(fù)載均衡,所述再均衡操作具體包括:
步驟a、當(dāng)用戶進(jìn)行再均衡操作時,遍歷所有節(jié)點,對每個節(jié)點,查看其可用容量是否大于數(shù)據(jù)卷創(chuàng)建時配置的閾值,如該節(jié)點可用容量大于閾值,則該節(jié)點數(shù)據(jù)不需要均衡,遍歷下一個節(jié)點;否則,進(jìn)行步驟b對該節(jié)點進(jìn)行數(shù)據(jù)均衡;當(dāng)數(shù)據(jù)卷中的所有節(jié)點都被遍歷后結(jié)束再均衡操作。
步驟b、循環(huán)遷移需要進(jìn)行數(shù)據(jù)均衡的節(jié)點的最小數(shù)據(jù)文件夾,每次找到大小最小的數(shù)據(jù)文件夾,尋找數(shù)據(jù)卷中的最優(yōu)節(jié)點,如果最優(yōu)節(jié)點可用容量也小于閾值,則整個數(shù)據(jù)均衡操作結(jié)束;否則,進(jìn)行步驟c遷移所述最小數(shù)據(jù)文件夾到最優(yōu)節(jié)點上;
步驟c、對需要遷移的數(shù)據(jù)文件夾中的每個文件,將其復(fù)制到確定出的最優(yōu)節(jié)點上的對應(yīng)文件夾中,所述對應(yīng)文件夾在創(chuàng)建文件夾的時已在每個節(jié)點都已被創(chuàng)建。
步驟d、在需要遷移的文件夾下的所有文件復(fù)制完成后,重新設(shè)置文件夾的擴(kuò)展屬性trusted.glusterfs.dht表示的哈希區(qū)間,將文件被遷移到的節(jié)點上文件夾的哈希區(qū)間設(shè)置為最大,而把文件遷出的節(jié)點上文件夾的哈希區(qū)間設(shè)置為最小,刪除文件遷出的節(jié)點上文件夾下的所有文件,該數(shù)據(jù)文件夾遷移完成,再次判斷文件遷出的節(jié)點的可用容量是否大于數(shù)據(jù)卷閾值,如果是,則遍歷數(shù)據(jù)卷的下一個節(jié)點,否則,重復(fù)步驟b。
進(jìn)一步地,再均衡操作步驟b中尋找數(shù)據(jù)卷中的最優(yōu)節(jié)點包括,掃描數(shù)據(jù)卷的所有節(jié)點的可用容量大小和已經(jīng)存儲數(shù)據(jù)的容量大?。徊榭此泄?jié)點的可用容量大小是否大于數(shù)據(jù)卷閾值,如果都小于閾值則選擇可用容量最大的節(jié)點為最優(yōu)節(jié)點;如果存在可用容量大于閾值的節(jié)點則在可用容量大于閾值的節(jié)點中選擇已經(jīng)存儲數(shù)據(jù)最少的節(jié)點作為最優(yōu)節(jié)點。
采用本發(fā)明可以達(dá)到以下技術(shù)效果:
在基于glusterfs的分布式文件存儲系統(tǒng)中,配置特定的文件夾名稱,該文件夾下的所有的文件都會分布在同一節(jié)點上,以保證glusterfs某個節(jié)點損壞的情況下,其他節(jié)點上的數(shù)據(jù)文件夾可以正常使用,成功的解決了glusterfs一個節(jié)點損壞會使數(shù)據(jù)卷中所有數(shù)據(jù)損壞的問題。同時,如數(shù)據(jù)卷節(jié)點的增加等可能會引起數(shù)據(jù)分布的不均衡,新節(jié)點負(fù)載較輕,原節(jié)點負(fù)載較重,會導(dǎo)致集群速度和穩(wěn)定性降低,glusterfs通過用戶會手動執(zhí)行再均衡操作使數(shù)據(jù)重新均衡。但是glusterfs的再均衡操作會將破壞數(shù)據(jù)文件夾的統(tǒng)一存儲,所以,還需要改進(jìn)再均衡操作以解決數(shù)據(jù)再均衡操作時數(shù)據(jù)文件的統(tǒng)一存儲。
附圖說明
圖1為本發(fā)明數(shù)據(jù)文件夾的存儲的流程圖;
圖2為本發(fā)明數(shù)據(jù)卷負(fù)載不均衡時,用戶進(jìn)行改進(jìn)后的再均衡操作使數(shù)據(jù)卷負(fù)載均衡時候的流程圖。
具體實施方式
本發(fā)明的技術(shù)方案包括兩個方面,數(shù)據(jù)文件夾的存儲和數(shù)據(jù)卷的再均衡操作。
本發(fā)明中涉及的術(shù)語定義如下:
節(jié)點:一定數(shù)量的存儲磁盤作為存儲節(jié)點;
集群:由節(jié)點通過網(wǎng)絡(luò)連接成glusterfs集群;
數(shù)據(jù)卷:在glusterfs集群環(huán)境下創(chuàng)建的包含多個節(jié)點的distributed類型數(shù)據(jù)卷。
數(shù)據(jù)卷閾值:數(shù)據(jù)卷容量閾值(閾值的設(shè)定應(yīng)參考需要存儲的單位數(shù)據(jù)的大小),用于判斷數(shù)據(jù)卷各節(jié)點的可用容量是否充足,如果節(jié)點可用容量大于閾值則說明該節(jié)點可用容量充足,否則說明可用容量不足。
最優(yōu)節(jié)點:在節(jié)點可用容量充足的情況下,最優(yōu)節(jié)點為存儲數(shù)據(jù)最少的節(jié)點(即已用容量最小的節(jié)點)為最優(yōu)節(jié)點,保證數(shù)據(jù)存儲的負(fù)載盡可能均衡;當(dāng)可用容量不足時候,則選擇可用容量最大的節(jié)點為最優(yōu)節(jié)點以保證數(shù)據(jù)文件夾能夠完整的存儲,盡可能的不出現(xiàn)空間不足的情況。
如圖1所示,為本發(fā)明數(shù)據(jù)文件夾的存儲流程圖,具體執(zhí)行以下步驟:
步驟101、搭建集群并創(chuàng)建distributed類型數(shù)據(jù)卷。
例如,搭建一個glusterfs集群gs,并創(chuàng)建包含a,b,c三個節(jié)點的數(shù)據(jù)卷x,并設(shè)置數(shù)據(jù)卷x的閾值為xt。以下步驟是將testfolder數(shù)據(jù)文件夾(其中包含數(shù)個文件)以文件夾為單位分布存儲在數(shù)據(jù)卷x中,即將testfolder中的所有文件存儲在一個節(jié)點;
步驟102、在所有節(jié)點中創(chuàng)建文件夾testfolder。
例如在所有節(jié)點a,b,c上創(chuàng)建數(shù)據(jù)文件夾testfolder;
步驟103、尋找最優(yōu)節(jié)點(具體步驟參見1031-1032),將最優(yōu)節(jié)點上testfolder的hash區(qū)間定為最大即0x00000000到0xffffffff,使所有的文件hash值落在a上以保證testfolder的所有文件都存儲在最優(yōu)節(jié)點a上,其他節(jié)點上testfolder的hash區(qū)間設(shè)置為0,即0x00000000到0x00000000,以保證testfolder的所有文件hash值不會落在這些節(jié)點hash區(qū)間內(nèi),即文件不會分布到這些節(jié)點。
例如在節(jié)點a,b,c上找到最優(yōu)的節(jié)點a,將a上的testfolder的hash區(qū)間分配為0x00000000到0xffffffff,其他節(jié)點b,c上的testfolder的hash區(qū)間分配為0x00000000到0x00000000;
步驟1031、掃描數(shù)據(jù)卷的所有節(jié)點a,b,c的可用容量大小分別是a1,b1,c1和已經(jīng)存儲數(shù)據(jù)的容量大小分別是a2,b2,c2;
步驟1032、查看a1,b1,c1是否大于數(shù)據(jù)卷x的閾值xt,如果都小于閾值則選擇可用容量最大的節(jié)點為最優(yōu)節(jié)點;如果存在可用容量大于閾值的節(jié)點則在可用容量大于閾值的節(jié)點中選擇已經(jīng)存儲數(shù)據(jù)最少的節(jié)點作為最優(yōu)節(jié)點,例如a1,b1大于xt,a2大于b2,則選擇b節(jié)點作為最優(yōu)節(jié)點。
步驟104、在每個節(jié)點的testfolder文件夾的擴(kuò)展屬性trusted.glusterfs.dht中記錄分配到的hash區(qū)間。
例如在a節(jié)點的testfolder文件夾的trusted.glusterfs.dht擴(kuò)展屬性的值為0x00000000ffffffff(表示hash區(qū)間是0x00000000到0xffffffff),其他節(jié)點b,c上的testfolder文件夾的trusted.glusterfs.dht擴(kuò)展屬性的值為0x0000000000000000。
步驟105、根據(jù)將要存儲的數(shù)據(jù)文件夾中某個文件的文件名計算hash值;
例如,利用glusterfs的davies-meyer算法計算待存儲數(shù)據(jù)文件夾testfolder中某個文件testfile文件名的hash值m;
步驟106、根據(jù)文件所在文件夾的hash區(qū)間確定文件名計算得到的hash值所在的節(jié)點;
例如,根據(jù)testfile的hash值m,查看所有節(jié)點的testfolder的trusted.glusterfs.dht的值,確定m在a節(jié)點testfolder的trusted.glusterfs.dht區(qū)間內(nèi),即testfile應(yīng)該被存儲在a節(jié)點上。
步驟107、在確定的待存儲節(jié)點上的文件夾下創(chuàng)建文件。
例如,在節(jié)點a的testfolder下面創(chuàng)建文件testfile。
每個文件的創(chuàng)建方法相同,主要是在文件夾的擴(kuò)展屬性中記錄該文件夾應(yīng)該存儲的節(jié)點,所以其他文件仍然按照testfile文件的方法創(chuàng)建即可。
以上方法是針對指定數(shù)據(jù)文件夾中的所有文件相互依賴,一個文件損壞或者丟失則整個數(shù)據(jù)文件夾不可用的情況,需要更改glusterfs數(shù)據(jù)文件夾中擴(kuò)展屬性記錄的hash區(qū)間的分配算法,將hash區(qū)間分配在一個節(jié)點上,保證該數(shù)據(jù)文件夾下所有文件能夠存儲在一個節(jié)點上,保持集群的高容錯性。
但是當(dāng)數(shù)據(jù)卷已經(jīng)存儲一定量數(shù)據(jù)時新增節(jié)點,會出現(xiàn)新節(jié)點上面沒有數(shù)據(jù)而舊節(jié)點數(shù)據(jù)太多導(dǎo)致整個數(shù)據(jù)卷節(jié)點的數(shù)據(jù)不均衡,當(dāng)用戶發(fā)現(xiàn)數(shù)據(jù)不均衡現(xiàn)象時,可以手動執(zhí)行再均衡操作使所有節(jié)點的負(fù)載均衡。glusterfs的再均衡操作同樣有可能使同一個數(shù)據(jù)文件夾下的文件分散存儲到不同的節(jié)點,所以,需要改進(jìn)再均衡,以下步驟為改進(jìn)再均衡的具體步驟。
步驟a、當(dāng)用戶進(jìn)行再均衡操作時,遍歷所有節(jié)點,對每個節(jié)點,查看其可用容量(即節(jié)點的剩余磁盤空間)是否大于數(shù)據(jù)卷創(chuàng)建時候配置的閾值,如該節(jié)點可用容量大于閾值,則該節(jié)點數(shù)據(jù)不需要均衡,遍歷下一個節(jié)點;否則,進(jìn)行步驟b對該節(jié)點進(jìn)行數(shù)據(jù)均衡。
步驟b、循環(huán)遷移該節(jié)點的最小數(shù)據(jù)文件夾,每次找到大小最小的數(shù)據(jù)文件夾,用步驟103的方法尋找數(shù)據(jù)卷中的最優(yōu)節(jié)點,如果最優(yōu)節(jié)點可用容量也小于閾值,則整個數(shù)據(jù)均衡操作結(jié)束;否則,進(jìn)行步驟c遷移該節(jié)點最小數(shù)據(jù)文件夾到最優(yōu)節(jié)點上。
步驟c、對需要遷移的數(shù)據(jù)文件夾中的每個文件,將其復(fù)制到新節(jié)點(步驟b中的最優(yōu)節(jié)點)的對應(yīng)文件夾(創(chuàng)建文件夾的時候在每個節(jié)點都創(chuàng)建了)中。
步驟d、需要遷移文件夾下的所有文件復(fù)制完成后,重新設(shè)置文件夾的擴(kuò)展屬性trusted.glusterfs.dht表示的hash區(qū)間,將目的節(jié)點(文件被遷移到的節(jié)點)文件夾的hash區(qū)間設(shè)置為最大,即trusted.glusterfs.dht為0x00000000ffffffff,而把源節(jié)點(即文件遷出的節(jié)點)文件夾的hash區(qū)間設(shè)置為最小,即trusted.glusterfs.dht為0x0000000000000000,然后刪除源節(jié)點文件夾下的所有文件,該數(shù)據(jù)文件夾遷移完成,再次判斷源節(jié)點的可用容量是否大于數(shù)據(jù)卷閾值,如果是,則遍歷數(shù)據(jù)卷的下一個節(jié)點,否則,重復(fù)步驟b。
假設(shè)數(shù)據(jù)卷x中目前已經(jīng)存儲了一定量的數(shù)據(jù),此時,為數(shù)據(jù)卷添加一個節(jié)點d導(dǎo)致數(shù)據(jù)卷的負(fù)載不均衡,用戶進(jìn)行了再均衡操作,具體步驟如圖2所示,
步驟201、對于數(shù)據(jù)卷x執(zhí)行再均衡操作;
步驟202、遍歷數(shù)據(jù)卷x中的所有節(jié)點,對于其中一個節(jié)點a獲取其可用容量s;
步驟203、判斷s是否大于閾值xt,如果是執(zhí)行209,否則執(zhí)行204;
步驟204、獲取節(jié)點a上的大小最小的一個數(shù)據(jù)文件夾e;
步驟205、使用步驟103所示的方法尋找數(shù)據(jù)卷x中的一個最優(yōu)節(jié)點o;
步驟206、如果o節(jié)點的可用容量也小于閾值xt,則結(jié)束再均衡操作;否則進(jìn)行步驟207;
步驟207、將節(jié)點a中文件夾e下的所有文件復(fù)制到節(jié)點o下的e文件夾下;
步驟208、復(fù)制完成后,將o節(jié)點下的e文件夾擴(kuò)展屬性trusted.glusterfs.dht設(shè)為0x00000000ffffffff,把a節(jié)點下e文件夾擴(kuò)展屬性trusted.glusterfs.dht設(shè)為0x0000000000000000,刪除a節(jié)點下e文件夾下的所有文件,更新a節(jié)點可用容量s,重復(fù)203;
步驟209、遍歷數(shù)據(jù)卷x中的下一個節(jié)點,如果所有節(jié)點都已被遍歷,則數(shù)據(jù)均衡結(jié)束執(zhí)行步驟210,否則,對于下一個節(jié)點,重復(fù)步驟202;
步驟210數(shù)據(jù)均衡結(jié)束。
最后所應(yīng)說明的是,以上實施例僅用以說明本發(fā)明的技術(shù)方案而非限制,盡管參照較佳實施例對本發(fā)明進(jìn)行了詳細(xì)說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,可以對本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本發(fā)明技術(shù)方案的精神和范圍。