專利名稱:一種分布式文件系統(tǒng)的存儲方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)處理技術(shù)領(lǐng)域,具體涉及一種分布式文件系統(tǒng)的存儲方法,以及,一種分布式文件系統(tǒng)的存儲裝置。
背景技術(shù):
隨著信息系統(tǒng)的快速發(fā)展,海量的信息需要可靠存儲的同時,還能被大量的使用者快速地訪問。傳統(tǒng)的存儲方案已經(jīng)從構(gòu)架上越來越難以適應(yīng)近幾年來的信息系統(tǒng)業(yè)務(wù)的飛速發(fā)展,成為了業(yè)務(wù)發(fā)展的瓶頸和障礙。HDFS (Hadoop Distributed File System,Hadoop分布式文件系統(tǒng))通過一個高效的分布式算法,將數(shù)據(jù)的訪問和存儲分布在大量服務(wù)器之中,在可靠地多備份存儲的同時還能將訪問分布在集群中的各個服務(wù)器之上,是傳統(tǒng)存儲構(gòu)架的一個顛覆性的發(fā)展。HDFS作為Hadoop中的一個分布式文件系統(tǒng),而且是專門為它的MapReduce (—種編程模型,用于大規(guī)模數(shù)據(jù)集(大于1TB)的并行運算)設(shè)計,所以HDFS除了必須滿足自己作為分布式文件系統(tǒng)的高可靠性外,還必須為MapReduce提供高效的讀寫性能,那么HDFS是如何做到這些的呢?首先,HDFS將每一個文件的數(shù)據(jù)進行分塊存儲,同時每一個數(shù)據(jù)塊(Block)又保存有多個副本,一般是3副本。每個副本存儲在獨立的存儲節(jié)點上。這樣,每個文件的內(nèi)容都被存儲在了多個不同存儲節(jié)點(DataNode)上,一旦個別節(jié)點巖機,整個文件的數(shù)據(jù)仍然可以從存儲該文件的其他副本的存儲節(jié)點上獲取。傳統(tǒng)的Block分配策略如下:第一份副本:如果Writer不是集群內(nèi)節(jié)點,貝U在全局范圍內(nèi)隨機選擇一個DataNode ;如果節(jié)點是集群內(nèi)存節(jié)點,優(yōu)先選擇該節(jié)點,否則隨機選擇。第二份副本:第一存儲節(jié)點所在的不同機架上,隨機選擇一個存儲節(jié)點;如果選擇失敗,則全局隨機選擇DataNode。第三份副本:第二個副本所在存儲節(jié)點所在的機架上隨機選擇一個DataNode ;第一個副本所在存儲節(jié)點所在的不同機架上,隨機選擇一個存儲節(jié)點。其他副本位置的選擇:全集群范圍內(nèi)隨機選擇存儲節(jié)點。然而,上述的Block分配策略只是考慮了數(shù)據(jù)的可靠性方面及數(shù)據(jù)副本節(jié)省網(wǎng)絡(luò)帶寬方面的效果,很難滿足后續(xù)使用Raid技術(shù)實現(xiàn)文件存儲可靠性的需求。因此,目前需要本領(lǐng)域技術(shù)人員迫切解決的一個技術(shù)問題是:提出一種分布式文件系統(tǒng)的存儲機制,用以在考慮后續(xù)使用Raid技術(shù)實現(xiàn)文件存儲可靠性的需求的情況下使得集群中每個節(jié)點的容量更加均衡,提高集群的穩(wěn)定性。
發(fā)明內(nèi)容
鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的一種分布式文件系統(tǒng)的存儲方法,相應(yīng)的一種分布式文件系統(tǒng)的存儲裝置。依據(jù)本發(fā)明的一個方面,提供了一種分布式文件系統(tǒng)的存儲方法,包括:
接收客戶端發(fā)送的文件信息,所述文件信息包括組成文件的至少一個條帶,所述條帶包括多個數(shù)據(jù)塊;確定每個數(shù)據(jù)塊的目標存儲節(jié)點,所述目標存儲節(jié)點包括第一存儲節(jié)點、第二存儲節(jié)點、第三存儲節(jié)點,其中,所述第一存儲節(jié)點為客戶端所在的存儲節(jié)點或集群內(nèi)隨機選取的存儲節(jié)點;所述第二存儲節(jié)點為所述數(shù)據(jù)塊所在條帶上的其他數(shù)據(jù)塊沒有分配到的存儲節(jié)點或集群內(nèi)隨機選取的存儲節(jié)點;所述第三存儲節(jié)點為在集群內(nèi)隨機選取的存儲節(jié)
占.
將所述數(shù)據(jù)塊依次寫入所述第一存儲節(jié)點、第二存儲節(jié)點、第三存儲節(jié)點中??蛇x地,所述確定每個數(shù)據(jù)塊的目標存儲節(jié)點的步驟包括:獲取客戶端所在的存儲節(jié)點;若所述客戶端所在的存儲節(jié)點為集群內(nèi)的節(jié)點,則將所述客戶端所在的存儲節(jié)點作為第一存儲節(jié)點;若所述客戶端所在的存儲節(jié)點不為集群內(nèi)的節(jié)點,則在集群內(nèi)隨機選取一個存儲節(jié)點作為第一存儲節(jié)點;獲取條帶中數(shù)據(jù)塊的個數(shù),以及已經(jīng)寫入的各數(shù)據(jù)塊的存儲地址信息;依據(jù)所述條帶中數(shù)據(jù)塊的個數(shù)以及各數(shù)據(jù)塊的存儲地址信息查找集群中所述條帶的數(shù)據(jù)塊沒有分配到的存儲節(jié)點作為候選存儲節(jié)點,隨機選取一個候選存儲節(jié)點作為第二存儲節(jié)點;若所述候選存儲節(jié)點的剩余存儲空間小于所述數(shù)據(jù)塊的大小,則在集群內(nèi)隨機選擇一個存儲節(jié)點作為第二存儲節(jié)點;獲取集群中的各個存儲節(jié)點的剩余存儲空間,依據(jù)所述各個存儲節(jié)點的剩余存儲空間計算各個存儲節(jié)點在集群中的剩余空間百分比,依據(jù)所述各個存儲節(jié)點在集群中的剩余空間百分比在集群內(nèi)隨機選取一個存儲節(jié)點作為第三存儲節(jié)點??蛇x地,所述將數(shù)據(jù)塊依次寫入所述第一存儲節(jié)點、第二存儲節(jié)點、第三存儲節(jié)點中的步驟包括:將所述目標存儲節(jié)點發(fā)送至客戶端;第一存儲節(jié)點接收客戶端發(fā)送的數(shù)據(jù)塊,將所述數(shù)據(jù)塊寫入本地數(shù)據(jù)庫,同時將所述數(shù)據(jù)塊復(fù)制至第二存儲節(jié)點中;所述第二存儲節(jié)點將接收的數(shù)據(jù)塊寫入本地數(shù)據(jù)庫,同時將所述數(shù)據(jù)塊復(fù)制至第三存儲節(jié)點中;所述第三存儲節(jié)點將接收的數(shù)據(jù)塊寫入本地數(shù)據(jù)庫中??蛇x地,所述第一存儲節(jié)點中寫入的數(shù)據(jù)塊為所述數(shù)據(jù)塊的第一副本,所述第二存儲節(jié)點中寫入的數(shù)據(jù)塊為所述數(shù)據(jù)塊的第二副本,所述第三存儲節(jié)點中寫入的數(shù)據(jù)塊為所述數(shù)據(jù)塊的第三副本,所述方法還包括:當(dāng)數(shù)據(jù)塊配置的副本數(shù)大于3時,從第4副本開始在集群內(nèi)隨機選擇的存儲節(jié)點中進行存儲??蛇x地,所述第二存儲節(jié)點與所述第一存儲節(jié)點位于不同的機架上。依據(jù)本發(fā)明的另一個方面,提供了一種分布式文件系統(tǒng)的存儲裝置,包括:文件信息接收模塊,適于接收客戶端發(fā)送的文件信息,所述文件信息包括組成文件的至少一個條帶,所述條帶包括多個數(shù)據(jù)塊;目標存儲節(jié)點確定模塊,適于確定每個數(shù)據(jù)塊的目標存儲節(jié)點,所述目標存儲節(jié)點包括第一存儲節(jié)點、第二存儲節(jié)點、第三存儲節(jié)點,其中,所述第一存儲節(jié)點為客戶端所在的存儲節(jié)點或集群內(nèi)隨機選取的存儲節(jié)點;所述第二存儲節(jié)點為所述數(shù)據(jù)塊所在條帶上的其他數(shù)據(jù)塊沒有分配到的存儲節(jié)點或集群內(nèi)隨機選取的存儲節(jié)點;所述第三存儲節(jié)點為在集群內(nèi)隨機選取的存儲節(jié)點;第一寫入模塊,適于將所述數(shù)據(jù)塊依次寫入所述第一存儲節(jié)點、第二存儲節(jié)點、第三存儲節(jié)點中??蛇x地,所述目標存儲節(jié)點確定模塊包括:第一存儲節(jié)點選取子模塊,適于獲取客戶端所在的存儲節(jié)點;若所述客戶端所在的存儲節(jié)點為集群內(nèi)的節(jié)點,則將所述客戶端所在的存儲節(jié)點作為第一存儲節(jié)點;若所述客戶端所在的存儲節(jié)點不為集群內(nèi)的節(jié)點,則在集群內(nèi)隨機選取一個存儲節(jié)點作為第一存儲節(jié)點;第二存儲節(jié)點選取子模塊,適于獲取條帶中數(shù)據(jù)塊的個數(shù),以及已經(jīng)寫入的各數(shù)據(jù)塊的存儲地址信息;依據(jù)所述條帶中數(shù)據(jù)塊的個數(shù)以及各數(shù)據(jù)塊的存儲地址信息查找集群中所述條帶的數(shù)據(jù)塊沒有分配到的存儲節(jié)點作為候選存儲節(jié)點,隨機選取一個候選存儲節(jié)點作為第二存儲節(jié)點;若所述候選存儲節(jié)點的剩余存儲空間小于所述數(shù)據(jù)塊的大小,則在集群內(nèi)隨機選擇一個存儲節(jié)點作為第二存儲節(jié)點;第三存儲節(jié)點選取子模塊,適于獲取集群中的各個存儲節(jié)點的剩余存儲空間,依據(jù)所述各個存儲節(jié)點的剩余存儲空間計算各個存儲節(jié)點在集群中的剩余空間百分比,依據(jù)所述各個存儲節(jié)點在集群中的剩余空間百分比在集群內(nèi)隨機選取一個存儲節(jié)點作為第三存儲節(jié)點??蛇x地,所述第一寫入模塊包括:目標存儲節(jié)點發(fā)送子模塊,適于將所述目標存儲節(jié)點發(fā)送至客戶端;位于第一存儲節(jié)點的寫入子模塊,適于接收客戶端發(fā)送的數(shù)據(jù)塊,將所述數(shù)據(jù)塊寫入本地數(shù)據(jù)庫,同時將所述數(shù)據(jù)塊復(fù)制至第二存儲節(jié)點中;位于第二存儲節(jié)點的寫入子模塊,適于將接收的數(shù)據(jù)塊寫入本地數(shù)據(jù)庫,同時將所述數(shù)據(jù)塊復(fù)制至第三存儲節(jié)點中;位于第三存儲節(jié)點的寫入子模塊,適于將接收的數(shù)據(jù)塊寫入本地數(shù)據(jù)庫中??蛇x地,所述第一存儲節(jié)點中寫入的數(shù)據(jù)塊為所述數(shù)據(jù)塊的第一副本,所述第二存儲節(jié)點中寫入的數(shù)據(jù)塊為所述數(shù)據(jù)塊的第二副本,所述第三存儲節(jié)點中寫入的數(shù)據(jù)塊為所述數(shù)據(jù)塊的第三副本,所述系統(tǒng)還包括:第二寫入模塊,適于在數(shù)據(jù)塊配置的副本數(shù)大于3時,從第4副本開始在集群內(nèi)隨機選擇的存儲節(jié)點中進行存儲??蛇x地,所述第二存儲節(jié)點與所述第一存儲節(jié)點位于不同的機架上。根據(jù)本發(fā)明的一種分布式文件系統(tǒng)的存儲方法及裝置,可以在選擇存儲節(jié)點存儲當(dāng)前要寫入的數(shù)據(jù)塊副本時,既考慮存儲本地性的特點,又考慮條帶對數(shù)據(jù)塊副本分配策略的影響,使得同一條帶內(nèi)的數(shù)據(jù)塊不在同一機架上,并且,本發(fā)明考慮了集群中每個存儲節(jié)點的容量負載情況,可以使得集群中每個存儲節(jié)點的容量更加均衡,由此解決了背景技術(shù)中傳統(tǒng)的數(shù)據(jù)塊分配策略中沒有考慮文件后續(xù)執(zhí)行Raid技術(shù)的需求的問題取得了大力優(yōu)化RaidNode的效果,減少RaidNode數(shù)據(jù)搬遷率,保證整個集群的負載均衡、增加集群穩(wěn)定性的有益效果。
上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點能夠更明顯易懂,以下特舉本發(fā)明的具體實施方式
。
通過閱讀下文優(yōu)選實施方式的詳細描述,各種其他的優(yōu)點和益處對于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實施方式的目的,而并不認為是對本發(fā)明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中:圖1不出了根據(jù)本發(fā)明一個實施例的HDFS系統(tǒng)架構(gòu)圖;圖2示出了根據(jù)本發(fā)明一個實施例的HDFS集群規(guī)模示意圖;圖3示出了根據(jù)本發(fā)明一個實施例的一種分布式文件系統(tǒng)的存儲方法實施例的步驟流程圖;圖4示出了根據(jù)本發(fā)明一個實施例的一種分布式文件系統(tǒng)的存儲裝置實施例的結(jié)構(gòu)框圖。
具體實施例方式下面將參照附圖更詳細地描述本公開的示例性實施例。雖然附圖中顯示了本公開的示例性實施例,然而應(yīng)當(dāng)理解,可以以各種形式實現(xiàn)本公開而不應(yīng)被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達給本領(lǐng)域的技術(shù)人員。本發(fā)明的實施例描述的是Hadoop分布式文件系統(tǒng)HDFS寫入數(shù)據(jù)塊的過程。分布式文件系統(tǒng)(Distributed File System,簡稱DFS)是指文件系統(tǒng)管理的物理存儲資源不一定直接連接在本地節(jié)點上,而是通過計算機網(wǎng)絡(luò)與節(jié)點相連,分布式文件系統(tǒng)的設(shè)計基于客戶機/服務(wù)器模式。Hadoop分布式文件系統(tǒng)(HDFS)被設(shè)計成適合運行在通用硬件(commodity hardware)上的分布式文件系統(tǒng),它和現(xiàn)有的分布式文件系統(tǒng)有很多共同點,但同時,它和其他的分布式文件系統(tǒng)的區(qū)別也是很明顯的。HDFS是一個高度容錯性的系統(tǒng),適合部署在廉價的機器上;HDFS能提供高吞吐量的數(shù)據(jù)訪問,非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用。參考圖1所示的HDFS系統(tǒng)架構(gòu)圖。大型HDFS實例一般運行在跨越多個機架的計算機組成的集群上,一個HDFS集群是由一個元數(shù)據(jù)節(jié)點NameNode和一定數(shù)目的存儲節(jié)點DataNode組成。NameNode是一個中心服務(wù)器,負責(zé)管理文件系統(tǒng)的命名空間namespace和客戶端Client對文件的訪問。集群中的DataNode —般是一個節(jié)點一個,負責(zé)管理它所在節(jié)點上的存儲。HDFS暴露了文件系統(tǒng)的名字空間,用戶能夠以文件的形式在上面存儲數(shù)據(jù)。從內(nèi)部看,一個文件其實被分成一個或多個數(shù)據(jù)塊,這些數(shù)據(jù)塊存儲在一組DataNode上。NameNode執(zhí)行文件系統(tǒng)的名字空間操作,比如打開、關(guān)閉、重命名文件或目錄。它也負責(zé)確定數(shù)據(jù)塊到具體DataNode節(jié)點的映射;DataNode負責(zé)處理文件系統(tǒng)客戶端的讀寫請求,在NameNode的統(tǒng)一調(diào)度下進行數(shù)據(jù)塊的創(chuàng)建、刪除和復(fù)制。另外,HDFS還包括元數(shù)據(jù)節(jié)點備機SecondaryNameNode,其主要功能就是周期性將元數(shù)據(jù)節(jié)點NameNode的命名空間鏡像文件和修改日志合并,以防日志文件過大,合并過后的命名空間鏡像文件也在SecondaryNameNode中保存了一份,以防元數(shù)據(jù)節(jié)點NameNode失敗的時候,可以恢復(fù)。HDFS被設(shè)計成能夠在一個大集群中跨機器可靠地存儲超大文件。它將每個文件存儲成一系列的數(shù)據(jù)塊,除了最后一個,所有的數(shù)據(jù)塊都是同樣大小的。為了容錯,文件的所有數(shù)據(jù)塊都會有副本,每個文件的數(shù)據(jù)塊大小和副本系數(shù)(文件副本的數(shù)目稱為文件的副本系數(shù))都是可配置的,應(yīng)用程序可以指定某個文件的副本數(shù)目(一般是3副本),副本系數(shù)可以在文件創(chuàng)建的時候指定,也可以在之后改變。HDFS中的文件都是一次性寫入的,并且嚴格要求在任何時候只能有一個寫入者。NameNode全權(quán)管理數(shù)據(jù)塊的復(fù)制,它周期性地從集群中的每個DataNode接收心跳信號和塊狀態(tài)報告(Blockreport),接收到心跳信號意味著該DataNode節(jié)點工作正常;塊狀態(tài)報告包含了一個該DataNode上所有數(shù)據(jù)塊的列表。副本的存放是HDFS可靠性和性能的關(guān)鍵,優(yōu)化的副本存放策略是HDFS區(qū)分于其他大部分分布式文件系統(tǒng)的重要特性。每個副本存儲在獨立的存儲節(jié)點DataNode上,這樣,每個文件的內(nèi)容都被存儲在了多個不同存儲節(jié)點上,一旦個別節(jié)點宕機,整個文件的數(shù)據(jù)仍然可以從存儲該文件的其他副本的存儲節(jié)點上獲取。但是,這樣的方式會造成空間較大的浪費,隨著HDFS集群的不斷擴大,需要更多的磁盤來存儲這些文件塊Block的副本,導(dǎo)致存儲壓力大。參考圖2的HDFS集群規(guī)模示意圖,如果一個HDFS集群達到圖2所示的HDFS集群規(guī)模,可能要考慮一下降低文件副本數(shù)來彌補多副本造成的空間浪費。一般而言,Raid技術(shù)能夠通過糾錯編解碼來實現(xiàn)文件存儲的可靠性。一個磁盤的數(shù)據(jù)發(fā)生損壞,可以通過糾錯編解碼來恢復(fù)該數(shù)據(jù)。雖然它也會產(chǎn)生多余的校驗碼parity,但是原數(shù)據(jù)本身并不會存成多份。作為另外一種提高可靠性的理念,Raid技術(shù)也被引入到了分布式文件系統(tǒng)中。Google新一代文件系統(tǒng)Colossus便采用了 Raid技術(shù)(Reed-Solomon糾錯編解碼)實現(xiàn)了更經(jīng)濟的可靠性,F(xiàn)aceBook也開源了自己基于HadoopHDFS的Raid實現(xiàn)。其中,應(yīng)用了 RAID方案后的HDFS也可以稱為DRFS,DRFS將文件劃分成多個條帶Stripe,每個Stripe包含一或多個數(shù)據(jù)塊Block(Stripe length可配置),DRFS以文件為單位計算校驗數(shù)據(jù)塊(可用X0R、RS等糾刪碼算法計算,本發(fā)明在此不作限制,Stripelength越小,計算出的校驗數(shù)據(jù)塊的量越小,數(shù)據(jù)恢復(fù)時的成本越高;反之,Stripelength越大,存儲空間成本越高,但當(dāng)Block丟失,恢復(fù)時的計算和傳輸成本越低),并將計算出來的校驗數(shù)據(jù)塊存儲為一個HDFS文件。當(dāng)校驗數(shù)據(jù)塊計算完成且存儲到HDFS后,HDFS將降低文件的副本數(shù),以節(jié)省存儲空間。由于HDFS RaidNode (HDFS-RAID 中除 NameNode 外的另一主節(jié)點)構(gòu)建在 Hadoop分布式文件系統(tǒng)HDFS之上,因此RaidNode要保證同一個條帶內(nèi)的數(shù)據(jù)塊不在同一臺機機器上。然而,背景技術(shù)中傳統(tǒng)的Block分配策略并沒有考慮條帶Stripe的影響,很難滿足RaidNode對Block存儲位置的需求。本發(fā)明的實施例通過調(diào)整Block分配策略來解決傳統(tǒng)的Block分配策略,為后續(xù)文件raid化(可以通過配置文件判斷哪些文件/目錄需要raid化)更方便,使得集群能夠高效合理運行時,RaidNode數(shù)據(jù)更加可靠。需要說明的是,本發(fā)明所述的Block分配策略只需在NameNode啟動時調(diào)整。參照圖3,其示出了本發(fā)明的一種分布式文件系統(tǒng)的存儲方法實施例的步驟流程圖,具體可以包括如下步驟:步驟101:接收客戶端發(fā)送的文件信息,所述文件信息包括組成文件的至少一個條帶,所述條帶包括多個數(shù)據(jù)塊;具體而言,數(shù)據(jù)塊是一組按順序連續(xù)排列在一起的幾組記錄,是主存儲器與輸入、輸出設(shè)備或外存儲器之間進行傳輸?shù)囊粋€數(shù)據(jù)單位,是數(shù)據(jù)的物理記錄與數(shù)據(jù)的邏輯記錄(邏輯上有聯(lián)系,在存儲器上占有一組鄰接單元的數(shù)據(jù)單位)之間的對應(yīng)關(guān)系,可以有3種方式:①一個數(shù)據(jù)塊即為一個記錄;②一個數(shù)據(jù)塊包含若干個邏輯記錄;③一個邏輯記錄占有幾個塊。數(shù)據(jù)塊的大小是預(yù)先設(shè)置的,可以是固定的或是可變的,塊與塊之間有間隙。在HDFS中,HDFS將每個文件存儲成一系列的數(shù)據(jù)塊,除了最后一個,所有的數(shù)據(jù)塊都是同樣大小的。每N個數(shù)據(jù)塊可以組成一個條帶,其中N為條帶的stripe length。步驟102:確定每個數(shù)據(jù)塊的目標存儲節(jié)點,所述目標存儲節(jié)點包括第一存儲節(jié)點、第二存儲節(jié)點、第三存儲節(jié)點;其中,所述第一存儲節(jié)點為客戶端所在的存儲節(jié)點或集群內(nèi)隨機選取的存儲節(jié)點;所述第二存儲節(jié)點為所述數(shù)據(jù)塊所在條帶上的其他數(shù)據(jù)塊沒有分配到的存儲節(jié)點或集群內(nèi)隨機選取的存儲節(jié)點;所述第三存儲節(jié)點為在集群內(nèi)隨機選取的存儲節(jié)點;在具體實現(xiàn)中,當(dāng)客戶端向HDFS系統(tǒng)寫入數(shù)據(jù)的時候,一開始是寫到本地臨時文件中,當(dāng)所述本地臨時文件累積到一個數(shù)據(jù)塊的大小時,客戶端會從NameNode獲取一個DataNode列表用于存放數(shù)據(jù)塊副本。在本發(fā)明的一種優(yōu)選實施例中,NameNode確定數(shù)據(jù)塊的DataNode列表的過程具體可以包括如下子步驟:子步驟Sll:獲取客戶端所在的存儲節(jié)點;若所述客戶端所在的存儲節(jié)點為集群內(nèi)的節(jié)點,則將所述客戶端所在的存儲節(jié)點作為第一存儲節(jié)點;若所述客戶端所在的存儲節(jié)點不為集群內(nèi)的節(jié)點,則在集群內(nèi)隨機選取一個存儲節(jié)點作為第一存儲節(jié)點;具體而言,所述第一存儲節(jié)點用于存儲當(dāng)前寫入數(shù)據(jù)塊的第一副本,也稱本地存儲節(jié)點,所述子步驟Sll的實現(xiàn)過程與傳統(tǒng)的Block分配策略中的第一副本分配策略是相同的,也是本地化策略的過程:第一個數(shù)據(jù)塊副本優(yōu)先存儲在與客戶端Client所在的存儲節(jié)點中(如果客戶端Client所在的存儲節(jié)點不在集群范圍內(nèi),則所述第一存儲節(jié)點是隨機選取的,當(dāng)然系統(tǒng)會嘗試不選擇哪些太滿或者太忙的存儲節(jié)點)。子步驟S12:獲取條帶中數(shù)據(jù)塊的個數(shù),以及已經(jīng)寫入的各數(shù)據(jù)塊的存儲地址信息;依據(jù)所述條帶中數(shù)據(jù)塊的個數(shù)以及各數(shù)據(jù)塊的存儲地址信息查找集群中所述條帶的數(shù)據(jù)塊沒有分配到的存儲節(jié)點作為候選存儲節(jié)點,隨機選取一個候選存儲節(jié)點作為第二存儲節(jié)點;若所述候選存儲節(jié)點的剩余存儲空間小于所述數(shù)據(jù)塊的大小,則在集群內(nèi)隨機選擇一個存儲節(jié)點作為第二存儲節(jié)點;在本發(fā)明實施例中,所述子步驟S12相對于傳統(tǒng)的分配策略做了進一步的優(yōu)化,引入了 “條帶”對系統(tǒng)的影響,考慮后續(xù)使用Raid技術(shù)實現(xiàn)文件存儲可靠性的需求的情況下使得集群中每個節(jié)點的容量更加均衡,提高集群的穩(wěn)定性。其中,條帶化(Striping)是把連續(xù)的數(shù)據(jù)分割成相同大小的數(shù)據(jù)塊,把每段數(shù)據(jù)分別寫入到陣列中不同磁盤上的方法。此技術(shù)非常有用,它比單個磁盤所能提供的讀寫速度要快的多,當(dāng)數(shù)據(jù)從第一個磁盤上傳輸完后,第二個磁盤就能確定下一段數(shù)據(jù)。數(shù)據(jù)條帶化正在一些現(xiàn)代數(shù)據(jù)庫和某些Raid硬件設(shè)備中得到廣泛應(yīng)用。因此,本發(fā)明可以針對后續(xù)需要用到Raid技術(shù)的文件進行優(yōu)化,系統(tǒng)通過配置文件獲取預(yù)設(shè)的后續(xù)做Raid的文件或目錄,獲取所述文件的條帶大小(條帶中數(shù)據(jù)塊個數(shù))以及已經(jīng)寫入的各數(shù)據(jù)塊的存儲地址信息。在具體實現(xiàn)中,所述條帶的大小可以從配置文件得到,由于條帶內(nèi)已經(jīng)寫入(已經(jīng)分配副本)的數(shù)據(jù)塊的存儲位置會記錄在NameNode內(nèi)存中,因此可以通過讀取NameNode來獲取已經(jīng)寫入的各數(shù)據(jù)塊的存儲地址信息。分析所述已經(jīng)寫入的各數(shù)據(jù)塊的存儲地址信息,查找集群中沒有所述條帶的數(shù)據(jù)塊沒有分配到的存儲節(jié)點作為候選存儲節(jié)點,隨機選取一個候選存儲節(jié)點作為第二存儲節(jié)點;所述第二存儲節(jié)點用于存儲當(dāng)前寫入數(shù)據(jù)塊的第二副本。由子步驟S12可以看出,存儲當(dāng)前寫入數(shù)據(jù)塊的第二副本的第二存儲節(jié)點在寫入第二副本之前在節(jié)點中是不存在條帶中的數(shù)據(jù)塊的,由于每個存儲節(jié)點處于不同的機架上,因此本發(fā)明實施例可以做到同一條帶內(nèi)的數(shù)據(jù)塊在不同機架上,也可以使得數(shù)據(jù)塊的第一副本以及第二副本在不同機架上,從而可以大大優(yōu)化RaidNode的效果,減少RaidNode的數(shù)據(jù)搬遷率(為了保證數(shù)據(jù)存儲的可靠性,需要同一條帶內(nèi)的Block,不可以在同一臺機器上,因此RaidNode的數(shù)據(jù)搬遷一般是搬遷同一條帶上的處于同一機架中數(shù)據(jù)塊,本發(fā)明實施例可以盡量避免上述情況的發(fā)生,因此減少了數(shù)據(jù)搬遷率,從實際工程環(huán)境情況來看,RaidNode的數(shù)據(jù)塊搬移率從35%下降到15%),集群的穩(wěn)定得到了很大提升。當(dāng)然,如果所述選擇的第二存儲節(jié)點剩余空間不足或者是當(dāng)前負載過重,則可以全集群隨機選擇存儲節(jié)點存儲所述第二副本。子步驟S13:獲取集群中的各個存儲節(jié)點的剩余存儲空間,依據(jù)所述各個存儲節(jié)點的剩余存儲空間計算各個存儲節(jié)點在集群中的剩余空間百分比,依據(jù)所述各個存儲節(jié)點在集群中的剩余空間百分比在集群內(nèi)隨機選取一個存儲節(jié)點作為第三存儲節(jié)點。具體而言,所述第三存儲節(jié)點用于存儲當(dāng)前寫入數(shù)據(jù)塊的第三副本,第三副本也是在集群內(nèi)隨機選擇的。但是,對于每個存儲節(jié)點可以按照其容量大小獲取其剩余存儲空間score,通過所述score計算各存儲節(jié)點相對于集群總空間的剩余空間百分比作為隨機選取的概率值,該隨機選取的概率值越大,剩余存儲空間越大,對應(yīng)的存儲節(jié)點越容易選取至IJ。本發(fā)明實施例在副本分配時考慮了集群中每個存儲節(jié)點的容量負載情況,可以使得集群中每個節(jié)點的容量更加均衡。例如,集群中有三個存儲節(jié)點A、B、C,假設(shè)A的剩余存儲空間是50,B的剩余存儲空間是30,C的剩余存儲空間是20,則集群內(nèi)的剩余存儲空間總數(shù)為100,A的剩余空間百分比為50%,B的剩余空間百分比為30%,C的剩余空間百分比為20%,則A被選擇的概率更大。步驟103:將所述數(shù)據(jù)塊依次寫入所述第一存儲節(jié)點、第二存儲節(jié)點、第三存儲節(jié)點中。在本發(fā)明的一種優(yōu)選實施例中,所述步驟103具體可以包括如下子步驟:子步驟S21:將所述目標存儲節(jié)點發(fā)送至客戶端;子步驟S22:第一存儲節(jié)點接收客戶端發(fā)送的數(shù)據(jù)塊,將所述數(shù)據(jù)塊寫入本地數(shù)據(jù)庫,同時將所述數(shù)據(jù)塊復(fù)制至第二存儲節(jié)點中;子步驟S23:所述第二存儲節(jié)點將接收的數(shù)據(jù)塊寫入本地數(shù)據(jù)庫,同時將所述數(shù)據(jù)塊復(fù)制至第三存儲節(jié)點中;子步驟S24:所述第三存儲節(jié)點將接收的數(shù)據(jù)塊寫入本地數(shù)據(jù)庫中。
需要說明的是,當(dāng)數(shù)據(jù)塊配置的副本數(shù)大于3時,從第4副本開始可以在集群內(nèi)隨機選擇的存儲節(jié)點中進行存儲。具體而言,客戶端從NameNode獲取一個DataNode列表用于存放副本后,客戶端開始向第一存儲節(jié)點傳輸數(shù)據(jù),第一存儲節(jié)點一小部分一小部分(4KB)地接收數(shù)據(jù),將每一部分寫入本地數(shù)據(jù)庫,并同時傳輸該部分到列表中第二存儲節(jié)點。所述第二存儲節(jié)點也是這樣,一小部分一小部分地接收數(shù)據(jù),寫入本地數(shù)據(jù)庫,并同時傳給第三存儲節(jié)點。最后,第三存儲節(jié)點接收數(shù)據(jù)并存儲在本地數(shù)據(jù)庫。因此,DataNode能流水線式地從前一個節(jié)點接收數(shù)據(jù),并在同時轉(zhuǎn)發(fā)給下一個節(jié)點,數(shù)據(jù)以流水線的方式從前一個DataNode復(fù)制到下一個。為了使本領(lǐng)域技術(shù)人員更好地理解本發(fā)明,下面通過兩個例子加以說明:例一:假如集群中有4個存儲節(jié)點DataNode,分別是A1、A2、B、C,其中,A1、A2處于同一機架上,B、C是獨立的機架,A2上面已經(jīng)有同一條帶的Block存在;客戶端Al觸發(fā)寫請求分配塊,第一個副本分配在本地存儲節(jié)點Al上,第二個副本可以優(yōu)先考慮A2,但是A2上面已經(jīng)有條帶內(nèi)的Block存在,所以可以在全集群內(nèi)隨機選擇B,最后一個副本可以在全集群內(nèi)隨機選擇C。例二:假如集群內(nèi)有10個DataNode:A、B、C、D、E、F、G、H、1、J、K、L ;寫如一個文件包括兩個Block,條帶長度是2 ;Client機器是A選擇第一個Block的三個副本:第一份副本:本地化策略,選擇A第二份副本:條帶內(nèi)A已經(jīng)被選擇,隨機選擇除A以外的機器,假設(shè)選擇了 B ;第三份副本:隨機選擇,選擇了 C ;選擇第二個Block的三個副本:第一份副本:本地化策略,選擇A第二份副本:條帶內(nèi)(A,B, C)已經(jīng)被選擇,隨機選擇這些機器以外的機器,假設(shè)選擇了 D第三份副本:隨機選擇,選擇了 B當(dāng)然,上述例子僅僅用作示例,本領(lǐng)域技術(shù)人員根據(jù)實際情況執(zhí)行所述方法也是可行的,本發(fā)明對此無需加以限制。需要說明的是,對于方法實施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明并不受所描述的動作順序的限制,因為依據(jù)本發(fā)明,某些步驟可以采用其他順序或者同時進行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說明書中所描述的實施例均屬于優(yōu)選實施例,所涉及的動作和模塊并不一定是本發(fā)明所必須的。參照圖4,示出了根據(jù)本發(fā)明一個實施例的一種分布式文件系統(tǒng)的存儲裝置實施例的結(jié)構(gòu)框圖,具體可以包括以下模塊:文件信息接收模塊201,適于接收客戶端發(fā)送的文件信息,所述文件信息包括組成文件的至少一個條帶,所述條帶包括多個數(shù)據(jù)塊;目標存儲節(jié)點確定模塊202,適于確定每個數(shù)據(jù)塊的目標存儲節(jié)點,所述目標存儲節(jié)點包括第一存儲節(jié)點、第二存儲節(jié)點、第三存儲節(jié)點,其中,所述第一存儲節(jié)點為客戶端所在的存儲節(jié)點或集群內(nèi)隨機選取的存儲節(jié)點;所述第二存儲節(jié)點為所述數(shù)據(jù)塊所在條帶上的其他數(shù)據(jù)塊沒有分配到的存儲節(jié)點或集群內(nèi)隨機選取的存儲節(jié)點;所述第三存儲節(jié)點為在集群內(nèi)隨機選取的存儲節(jié)點;在本發(fā)明的一種優(yōu)選實施例中,所述目標存儲節(jié)點確定模塊202可以包括如下子模塊:第一存儲節(jié)點選取子模塊,適于獲取客戶端所在的存儲節(jié)點;若所述客戶端所在的存儲節(jié)點為集群內(nèi)的節(jié)點,則將所述客戶端所在的存儲節(jié)點作為第一存儲節(jié)點;若所述客戶端所在的存儲節(jié)點不為集群內(nèi)的節(jié)點,則在集群內(nèi)隨機選取一個存儲節(jié)點作為第一存儲節(jié)點;第二存儲節(jié)點選取子模塊,適于獲取條帶中數(shù)據(jù)塊的個數(shù),以及已經(jīng)寫入的各數(shù)據(jù)塊的存儲地址信息;依據(jù)所述條帶中數(shù)據(jù)塊的個數(shù)以及各數(shù)據(jù)塊的存儲地址信息查找集群中所述條帶的數(shù)據(jù)塊沒有分配到的存儲節(jié)點作為候選存儲節(jié)點,隨機選取一個候選存儲節(jié)點作為第二存儲節(jié)點;若所述候選存儲節(jié)點的剩余存儲空間小于所述數(shù)據(jù)塊的大小,則在集群內(nèi)隨機選擇一個存儲節(jié)點作為第二存儲節(jié)點;其中,所述第二存儲節(jié)點與所述第一存儲節(jié)點位于不同的機架上。第三存儲節(jié)點選取子模塊,適于獲取集群中的各個存儲節(jié)點的剩余存儲空間,依據(jù)所述各個存儲節(jié)點的剩余存儲空間計算各個存儲節(jié)點在集群中的剩余空間百分比,集群內(nèi)隨機選取一個存儲節(jié)點作為第三存儲節(jié)點。其中,存儲節(jié)點的剩余空間百分比越大在隨機選取中被選到的概率越大。第一寫入模塊203,適于將所述數(shù)據(jù)塊依次寫入所述第一存儲節(jié)點、第二存儲節(jié)點、第三存儲節(jié)點中。在本發(fā)明的一種優(yōu)選實施例中,所述第一寫入模塊203可以包括如下子模塊:目標存儲節(jié)點發(fā)送子模塊,適于將所述目標存儲節(jié)點發(fā)送至客戶端;位于第一存儲節(jié)點的寫入子模塊,適于接收客戶端發(fā)送的數(shù)據(jù)塊,將所述數(shù)據(jù)塊寫入本地數(shù)據(jù)庫,同時將所述數(shù)據(jù)塊復(fù)制至第二存儲節(jié)點中;位于第二存儲節(jié)點的寫入子模塊,適于將接收的數(shù)據(jù)塊寫入本地數(shù)據(jù)庫,同時將所述數(shù)據(jù)塊復(fù)制至第三存儲節(jié)點中;位于第三存儲節(jié)點的寫入子模塊,適于將接收的數(shù)據(jù)塊寫入本地數(shù)據(jù)庫中。在具體實現(xiàn)中,所述第一存儲節(jié)點中寫入的數(shù)據(jù)塊為所述數(shù)據(jù)塊的第一副本,所述第二存儲節(jié)點中寫入的數(shù)據(jù)塊為所述數(shù)據(jù)塊的第二副本,所述第三存儲節(jié)點中寫入的數(shù)據(jù)塊為所述數(shù)據(jù)塊的第三副本。在數(shù)據(jù)塊配置的副本數(shù)大于3時,所述系統(tǒng)還包括:第二寫入模塊,適于從第4副本開始在集群內(nèi)隨機選擇的存儲節(jié)點中進行存儲。對于圖4的裝置實施例而言,由于其與方法實施例基本相似,所以描述的比較簡單,相關(guān)之處參見方法實施例的部分說明即可。本說明書中的各個實施例均采用遞進的方式描述,每個實施例重點說明的都是與其他實施例的不同之處,各個實施例之間相同相似的部分互相參見即可。在此提供的算法和顯示不與任何特定計算機、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類系統(tǒng)所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對任何特定編程語言。應(yīng)當(dāng)明白,可以利用各種編程語言實現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對特定語言所做的描述是為了披露本發(fā)明的最佳實施方式。在此處所提供的說明書中,說明了大量具體細節(jié)。然而,能夠理解,本發(fā)明的實施例可以在沒有這些具體細節(jié)的情況下實踐。在一些實例中,并未詳細示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對本說明書的理解。類似地,應(yīng)當(dāng)理解,為了精簡本公開并幫助理解各個發(fā)明方面中的一個或多個,在上面對本發(fā)明的示例性實施例的描述中,本發(fā)明的各個特征有時被一起分組到單個實施例、圖、或者對其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護的本發(fā)明要求比在每個權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個實施例的所有特征。因此,遵循具體實施方式
的權(quán)利要求書由此明確地并入該具體實施方式
,其中每個權(quán)利要求本身都作為本發(fā)明的單獨實施例。本領(lǐng)域那些技術(shù)人員可以理解,可以對實施例中的設(shè)備中的模塊進行自適應(yīng)性地改變并且把它們設(shè)置在與該實施例不同的一個或多個設(shè)備中??梢园褜嵤├械哪K或單元或組件組合成一個模塊或單元或組件,以及此外可以把它們分成多個子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個特征可以由提供相同、等同或相似目的的替代特征來代替。此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實施例包括其它實施例中所包括的某些特征而不是其它特征,但是不同實施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實施例。例如,在下面的權(quán)利要求書中,所要求保護的實施例的任意之一都可以以任意的組合方式來使用。本發(fā)明的各個部件實施例可以以硬件實現(xiàn),或者以在一個或者多個處理器上運行的軟件模塊實現(xiàn),或者以它們的組合實現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實踐中使用微處理器或者數(shù)字信號處理器(DSP)來實現(xiàn)根據(jù)本發(fā)明實施例的分布式文件系統(tǒng)的存儲設(shè)備中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計算機程序和計算機程序產(chǎn)品)。這樣的實現(xiàn)本發(fā)明的程序可以存儲在計算機可讀介質(zhì)上,或者可以具有一個或者多個信號的形式。這樣的信號可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號上提供,或者以任何其他形式提供。應(yīng)該注意的是上述實施例對本發(fā)明進行說明而不是對本發(fā)明進行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計出替換實施例。在權(quán)利要求中,不應(yīng)將位于括號之間的任何參考符號構(gòu)造成對權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個”不排除存在多個這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計算機來實現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個可以是通過同一個硬件項來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。
權(quán)利要求
1.一種分布式文件系統(tǒng)的存儲方法,包括: 接收客戶端發(fā)送的文件信息,所述文件信息包括組成文件的至少一個條帶,所述條帶包括多個數(shù)據(jù)塊; 確定每個數(shù)據(jù)塊的目標存儲節(jié)點,所述目標存儲節(jié)點包括第一存儲節(jié)點、第二存儲節(jié)點、第三存儲節(jié)點,其中,所述第一存儲節(jié)點為客戶端所在的存儲節(jié)點或集群內(nèi)隨機選取的存儲節(jié)點;所述第二存儲節(jié)點為所述數(shù)據(jù)塊所在條帶上的其他數(shù)據(jù)塊沒有分配到的存儲節(jié)點或集群內(nèi)隨機選取的存儲節(jié)點;所述第三存儲節(jié)點為在集群內(nèi)隨機選取的存儲節(jié)點; 將所述數(shù)據(jù)塊依次寫入所述第一存儲節(jié)點、第二存儲節(jié)點、第三存儲節(jié)點中。
2.如權(quán)利要求1所述的方法,所述確定每個數(shù)據(jù)塊的目標存儲節(jié)點的步驟包括: 獲取客戶端所在的存儲節(jié)點;若所述客戶端所在的存儲節(jié)點為集群內(nèi)的節(jié)點,則將所述客戶端所在的存儲節(jié)點作為第一存儲節(jié)點;若所述客戶端所在的存儲節(jié)點不為集群內(nèi)的節(jié)點,則在集群內(nèi)隨機選取一個存儲節(jié)點作為第一存儲節(jié)點; 獲取條帶中數(shù)據(jù)塊的個數(shù),以及已經(jīng)寫入的各數(shù)據(jù)塊的存儲地址信息;依據(jù)所述條帶中數(shù)據(jù)塊的個數(shù)以及各數(shù)據(jù)塊的存儲地址信息查找集群中所述條帶的數(shù)據(jù)塊沒有分配到的存儲節(jié)點作為候選存儲節(jié)點,隨機選取一個候選存儲節(jié)點作為第二存儲節(jié)點;若所述候選存儲節(jié)點的剩余存儲空間小于所述數(shù)據(jù)塊的大小,則在集群內(nèi)隨機選擇一個存儲節(jié)點作為第二存儲節(jié)點; 獲取集群中的各個存儲節(jié)點的剩余存儲空間,依據(jù)所述各個存儲節(jié)點的剩余存儲空間計算各個存儲節(jié)點在集群中的剩余空間百分比,依據(jù)所述各個存儲節(jié)點在集群中的剩余空間百分比在集群內(nèi)隨 機選取一個存儲節(jié)點作為第三存儲節(jié)點。
3.如權(quán)利要求1或2所述的方法,所述將數(shù)據(jù)塊依次寫入所述第一存儲節(jié)點、第二存儲節(jié)點、第三存儲節(jié)點中的步驟包括: 將所述目標存儲節(jié)點發(fā)送至客戶端; 第一存儲節(jié)點接收客戶端發(fā)送的數(shù)據(jù)塊,將所述數(shù)據(jù)塊寫入本地數(shù)據(jù)庫,同時將所述數(shù)據(jù)塊復(fù)制至第二存儲節(jié)點中; 所述第二存儲節(jié)點將接收的數(shù)據(jù)塊寫入本地數(shù)據(jù)庫,同時將所述數(shù)據(jù)塊復(fù)制至第三存儲節(jié)點中; 所述第三存儲節(jié)點將接收的數(shù)據(jù)塊寫入本地數(shù)據(jù)庫中。
4.如權(quán)利要求3所述的方法,所述第一存儲節(jié)點中寫入的數(shù)據(jù)塊為所述數(shù)據(jù)塊的第一副本,所述第二存儲節(jié)點中寫入的數(shù)據(jù)塊為所述數(shù)據(jù)塊的第二副本,所述第三存儲節(jié)點中寫入的數(shù)據(jù)塊為所述數(shù)據(jù)塊的第三副本,所述方法還包括: 當(dāng)數(shù)據(jù)塊配置的副本數(shù)大于3時,從第4副本開始在集群內(nèi)隨機選擇的存儲節(jié)點中進行存儲。
5.如權(quán)利要求1或2所述的方法,所述第二存儲節(jié)點與所述第一存儲節(jié)點位于不同的機架上。
6.一種分布式文件系統(tǒng)的存儲裝置,包括: 文件信息接收模塊,適于接收客戶端發(fā)送的文件信息,所述文件信息包括組成文件的至少一個條帶,所述條帶包括多個數(shù)據(jù)塊; 目標存儲節(jié)點確定模塊,適于確定每個數(shù)據(jù)塊的目標存儲節(jié)點,所述目標存儲節(jié)點包括第一存儲節(jié)點、第二存儲節(jié)點、第三存儲節(jié)點,其中,所述第一存儲節(jié)點為客戶端所在的存儲節(jié)點或集群內(nèi)隨機選取的存儲節(jié)點;所述第二存儲節(jié)點為所述數(shù)據(jù)塊所在條帶上的其他數(shù)據(jù)塊沒有分配到的存儲節(jié)點或集群內(nèi)隨機選取的存儲節(jié)點;所述第三存儲節(jié)點為在集群內(nèi)隨機選取的存儲節(jié)點; 第一寫入模塊,適于將所述數(shù)據(jù)塊依次寫入所述第一存儲節(jié)點、第二存儲節(jié)點、第三存儲節(jié)點中。
7.如權(quán)利要求6所述的裝置,所述目標存儲節(jié)點確定模塊包括: 第一存儲節(jié)點選取子模塊,適于獲取客戶端所在的存儲節(jié)點;若所述客戶端所在的存儲節(jié)點為集群內(nèi)的節(jié)點,則將所述客戶端所在的存儲節(jié)點作為第一存儲節(jié)點;若所述客戶端所在的存儲節(jié)點不為集群內(nèi)的節(jié)點,則在集群內(nèi)隨機選取一個存儲節(jié)點作為第一存儲節(jié)占.第二存儲節(jié)點選取子模塊,適于獲取條帶中數(shù)據(jù)塊的個數(shù),以及已經(jīng)寫入的各數(shù)據(jù)塊的存儲地址信息;依據(jù)所述條帶中數(shù)據(jù)塊的個數(shù)以及各數(shù)據(jù)塊的存儲地址信息查找集群中所述條帶的數(shù)據(jù)塊沒有分配到的存儲節(jié)點作為候選存儲節(jié)點,隨機選取一個候選存儲節(jié)點作為第二存儲節(jié)點;若所述候選存儲節(jié)點的剩余存儲空間小于所述數(shù)據(jù)塊的大小,則在集群內(nèi)隨機選擇一個存儲節(jié)點作為第二存儲節(jié)點; 第三存儲節(jié)點選取子模塊,適于獲取集群中的各個存儲節(jié)點的剩余存儲空間,依據(jù)所述各個存儲節(jié)點的剩余存儲空間計算各個存儲節(jié)點在集群中的剩余空間百分比,依據(jù)所述各個存儲節(jié)點在集群中的剩余空間百分比在集群內(nèi)隨機選取一個存儲節(jié)點作為第三存儲節(jié)點。
8.如權(quán)利要求6或7所述的裝置,所述第一寫入模塊包括: 目標存儲節(jié)點發(fā)送子模塊,適于將所述目標存儲節(jié)點發(fā)送至客戶端; 位于第一存儲節(jié)點的寫入子模塊,適于接收客戶端發(fā)送的數(shù)據(jù)塊,將所述數(shù)據(jù)塊寫入本地數(shù)據(jù)庫,同時將所述數(shù)據(jù)塊復(fù)制至第二存儲節(jié)點中; 位于第二存儲節(jié)點的寫入子模塊,適于將接收的數(shù)據(jù)塊寫入本地數(shù)據(jù)庫,同時將所述數(shù)據(jù)塊復(fù)制至第三存儲節(jié)點中; 位于第三存儲節(jié)點的寫入子模塊,適于將接收的數(shù)據(jù)塊寫入本地數(shù)據(jù)庫中。
9.如權(quán)利要求8所述的裝置,所述第一存儲節(jié)點中寫入的數(shù)據(jù)塊為所述數(shù)據(jù)塊的第一副本,所述第二存儲節(jié)點中寫入的數(shù)據(jù)塊為所述數(shù)據(jù)塊的第二副本,所述第三存儲節(jié)點中寫入的數(shù)據(jù)塊為所述數(shù)據(jù)塊的第三副本,所述系統(tǒng)還包括: 第二寫入模塊,適于 在數(shù)據(jù)塊配置的副本數(shù)大于3時,從第4副本開始在集群內(nèi)隨機選擇的存儲節(jié)點中進行存儲。
10.如權(quán)利要求6或7所述的裝置,所述第二存儲節(jié)點與所述第一存儲節(jié)點位于不同的機架上。
全文摘要
本發(fā)明公開了一種分布式文件系統(tǒng)的存儲方法及裝置,其中所述方法包括接收客戶端發(fā)送的文件信息;確定每個數(shù)據(jù)塊的目標存儲節(jié)點,所述目標存儲節(jié)點包括第一存儲節(jié)點、第二存儲節(jié)點、第三存儲節(jié)點,其中,所述第一存儲節(jié)點為客戶端所在的存儲節(jié)點或集群內(nèi)隨機選取的存儲節(jié)點;所述第二存儲節(jié)點為所述數(shù)據(jù)塊所在條帶上的其他數(shù)據(jù)塊沒有分配到的存儲節(jié)點或集群內(nèi)隨機選取的存儲節(jié)點;所述第三存儲節(jié)點為在集群內(nèi)隨機選取的存儲節(jié)點;將所述數(shù)據(jù)塊依次寫入所述第一存儲節(jié)點、第二存儲節(jié)點、第三存儲節(jié)點中。本發(fā)明可以在考慮后續(xù)使用Raid技術(shù)實現(xiàn)文件存儲可靠性的需求的情況下使得集群中每個節(jié)點的容量更加均衡,提高集群的穩(wěn)定性。
文檔編號H04L29/08GK103152395SQ20131004664
公開日2013年6月12日 申請日期2013年2月5日 優(yōu)先權(quán)日2013年2月5日
發(fā)明者郭東東, 趙彥榮, 趙健博, 洪亮 申請人:北京奇虎科技有限公司, 奇智軟件(北京)有限公司