本發(fā)明涉及數(shù)據(jù)處理技術(shù)領(lǐng)域,特別涉及一種基于虛擬環(huán)負載均衡算法的分布式存儲控制方法。
背景技術(shù):
隨著分布式云存儲技術(shù)的發(fā)展和應(yīng)用,業(yè)界逐漸接受在云存儲系統(tǒng)中采用分片存儲、分布式負載均衡為主要的技術(shù)實現(xiàn)手段,將大容量文件切分為多個對象(object),分別存儲到不同的物理介質(zhì)中。
在分布式對象存儲中的一個關(guān)鍵問題是數(shù)據(jù)該如何存放。環(huán)狀映射空間是其中最重要的概念,它用于記錄存儲對象與物理位置間映射關(guān)系。
映射環(huán)用來確定數(shù)據(jù)駐留在集群中的位置。映射環(huán)空間中每個節(jié)點的位置由邏輯“環(huán)”來維護,并存儲在映射中。環(huán)空間使用映射的概念來保證數(shù)據(jù)的隔離。每個節(jié)點都確保對應(yīng)不同的映射,一個映射可以是一個硬盤,一個服務(wù)器,一個機架,一個交換機,甚至是一個數(shù)據(jù)中心。
如一個普通hash算法與場景分析的例子,假設(shè)有n臺存儲服務(wù)器(以下簡稱node),打算用于圖片文件存儲,為了使服務(wù)器的負載均衡,需要把對象均勻地映射到每臺服務(wù)器上,通常會使用哈希算法來實現(xiàn),計算步驟如下:
1.計算object的hash值key
2.計算keymodn值
有n個存儲節(jié)點,將key模n得到的余數(shù)就是該key對應(yīng)的值需要存放的節(jié)點。比如,n是2,那么值為0、1、2、3、4的key需要分別存放在0、1、0、1和0號節(jié)點上。如果哈希算法是均勻的,數(shù)據(jù)就會被平均分配到兩個節(jié)點中。如果每個數(shù)據(jù)的訪問量比較平均,負載也會被平均分配到兩個節(jié)點上。
但是,當數(shù)據(jù)量和訪問量進一步增加,兩個節(jié)點無法滿足需求的時候,需要增加一個節(jié)點來服務(wù)客戶端的請求。這時,n變成了3,映射關(guān)系變成了keymod(n+1),因此,上述哈希值為2、3、4的數(shù)據(jù)需要重新分配(2->server2,3->server0,4->server1)。如果數(shù)據(jù)量很大的話,那么數(shù)據(jù)量的遷移工作將會非常大。當n已經(jīng)很大,從n加入一個節(jié)點變成n+1個節(jié)點的過程,會導(dǎo)致整個哈希環(huán)的重新分配,這個過程幾乎是無法容忍的,幾乎全部的數(shù)據(jù)都要重新移動一遍。
舉例說明,假設(shè)有100個node的集群,將107項數(shù)據(jù)使用md5hash算法分配到每個node中。通過計算我們發(fā)現(xiàn),為了提高集群1%的存儲能力,需要移動9900989個數(shù)據(jù)項,也就是99.01%的數(shù)據(jù)項!顯然,這種算法嚴重地影響了系統(tǒng)的性能和可擴展性。
顯然該種低效率、高成本的實現(xiàn)方法不是好的解決方案,有必要設(shè)計出一種新的存儲控制方法,通過使用普通硬件來構(gòu)建冗余的、可擴展的分布式對象存儲集群,使存儲容量可達更高量級,并且實現(xiàn)成本可控。
技術(shù)實現(xiàn)要素:
有鑒于此,本發(fā)明的目的是提供一種基于虛擬環(huán)負載均衡算法的分布式存儲控制方法,本方法通過引入“虛擬環(huán)”概念,并采用基于“虛擬環(huán)”映射空間的分布式存儲映射計算方法,從而能夠在改變集群的node數(shù)量時(增加/刪除服務(wù)器),能夠盡可能少地改變已存在key和node的映射關(guān)系,以滿足單調(diào)性,使存儲容量可達更高量級,并且實現(xiàn)成本可控。
本發(fā)明的目的是通過以下技術(shù)方案實現(xiàn)的:
本發(fā)明的方法包括以下步驟:
步驟一:用戶通過客戶端遠程上傳保存大容量數(shù)據(jù);
步驟二:對數(shù)據(jù)作切分處理;
步驟三:對每個數(shù)據(jù)切分塊做hash算法計算key值;
步驟四:客戶端將切分數(shù)據(jù)塊的key值、數(shù)據(jù)唯一標識信息和時間戳信息等進行處理封裝,提交到服務(wù)器,服務(wù)器回傳每個數(shù)據(jù)分塊對應(yīng)的節(jié)點ip地址給客戶端,隨后開始并發(fā)數(shù)據(jù)上傳;
步驟五:虛擬環(huán)節(jié)點根據(jù)數(shù)據(jù)的時間戳和歷史模數(shù)獲取相應(yīng)的映射存儲節(jié)點,將接收到的數(shù)據(jù)保存到物理介質(zhì)中,具體是依據(jù)存儲時間戳,判斷有無歷史存儲;如果有,則進入步驟六,如果沒有,根據(jù)當前存儲節(jié)點模數(shù)映射到相應(yīng)存儲節(jié)點,保存數(shù)據(jù),得到物理存儲節(jié)點;
步驟六:根據(jù)存儲節(jié)點歷史模數(shù)記錄,取模運算,映射到歷史存儲節(jié)點,得到物理存儲節(jié)點;
用戶需要遠程下載數(shù)據(jù)時,通過遠程客戶端提交數(shù)據(jù)讀取請求,給出數(shù)據(jù)的唯一標識信息和時間戳,從服務(wù)器獲取所有相關(guān)key值和映射到的虛擬環(huán)節(jié)點ip,訪問節(jié)點下載數(shù)據(jù)。
所述虛擬環(huán)上的節(jié)點數(shù)量在環(huán)形空間保持恒定不變,而每個節(jié)點對應(yīng)了若干個物理存儲節(jié)點,虛擬環(huán)節(jié)點在哈??臻g中以哈希值排列。
進一步,所述步驟二中,原始數(shù)據(jù)經(jīng)過切分后進入map函數(shù)處理,經(jīng)過map函數(shù)處理的數(shù)據(jù)會在整個環(huán)形緩沖區(qū)里進行第一次排序。
進一步,所述步驟三中,map函數(shù)的輸出結(jié)果根據(jù)key值進行hash映射,將數(shù)據(jù)量龐大的map輸出分割為n份來實現(xiàn)數(shù)據(jù)的并行處理,n為reduce數(shù)目
本發(fā)明的有益效果是:
本發(fā)明通過引用一致性哈希算法,可以減少由于增加結(jié)點導(dǎo)致數(shù)據(jù)項的數(shù)量來提高單調(diào)性,通過引入虛擬環(huán)和歷史模數(shù)表,可以避免由于存儲節(jié)點數(shù)變化導(dǎo)致數(shù)據(jù)移動的問題。通過本發(fā)明的方法,消除了存儲介質(zhì)規(guī)模對數(shù)據(jù)映射的影響,在保證負載均衡的基礎(chǔ)上,實現(xiàn)了云存儲容量的良好的冗余特性和高擴展性。
本發(fā)明的其他優(yōu)點、目標和特征在某種程度上將在隨后的說明書中進行闡述,并且在某種程度上,基于對下文的考察研究對本領(lǐng)域技術(shù)人員而言將是顯而易見的,或者可以從本發(fā)明的實踐中得到教導(dǎo)。本發(fā)明的目標和其他優(yōu)點可以通過下面的說明書和權(quán)利要求書來實現(xiàn)和獲得。
附圖說明
為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合附圖對本發(fā)明作進一步的詳細描述,其中:
圖1為本發(fā)明的方法流程示意圖;
圖2為本發(fā)明的虛擬環(huán)結(jié)構(gòu)示意圖;
圖3為本發(fā)明所述系統(tǒng)的結(jié)構(gòu)示意圖。
具體實施方式
以下將參照附圖,對本發(fā)明的優(yōu)選實施例進行詳細的描述。應(yīng)當理解,優(yōu)選實施例僅為了說明本發(fā)明,而不是為了限制本發(fā)明的保護范圍。
如圖1所示,本發(fā)明的方法包括以下步驟:
步驟一:用戶通過客戶端遠程上傳保存大容量數(shù)據(jù);
步驟二:對數(shù)據(jù)作切分處理;
步驟三:對每個數(shù)據(jù)切分塊做hash算法計算key值;
步驟四:客戶端將切分數(shù)據(jù)塊的key值、數(shù)據(jù)唯一標識信息和時間戳信息等進行處理封裝,提交到服務(wù)器,服務(wù)器回傳每個數(shù)據(jù)分塊對應(yīng)的節(jié)點ip地址給客戶端,隨后開始并發(fā)數(shù)據(jù)上傳;
步驟五:虛擬環(huán)節(jié)點根據(jù)數(shù)據(jù)的時間戳和歷史模數(shù)獲取相應(yīng)的映射存儲節(jié)點,將接收到的數(shù)據(jù)保存到物理介質(zhì)中,具體是依據(jù)存儲時間戳,判斷有無歷史存儲;如果有,則進入步驟六,如果沒有,根據(jù)當前存儲節(jié)點模數(shù)映射到相應(yīng)存儲節(jié)點,保存數(shù)據(jù),得到物理存儲節(jié)點;
步驟六:根據(jù)存儲節(jié)點歷史模數(shù)記錄,取模運算,映射到歷史存儲節(jié)點,得到物理存儲節(jié)點;
用戶需要遠程下載數(shù)據(jù)時,通過遠程客戶端提交數(shù)據(jù)讀取請求,給出數(shù)據(jù)的唯一標識信息和時間戳,從服務(wù)器獲取所有相關(guān)key值和映射到的虛擬環(huán)節(jié)點ip,訪問節(jié)點下載數(shù)據(jù)。
其中,在步驟二中,原始數(shù)據(jù)經(jīng)過切分后進入map函數(shù)處理,經(jīng)過map函數(shù)處理的數(shù)據(jù)會在整個環(huán)形緩沖區(qū)里進行第一次排序。
步驟三中,map函數(shù)的輸出結(jié)果根據(jù)key值進行hash映射,將數(shù)據(jù)量龐大的map輸出分割為n份來實現(xiàn)數(shù)據(jù)的并行處理,n為reduce數(shù)目。
有鑒于哈希算法在改變node數(shù)時會帶來巨大的數(shù)據(jù)遷移。為了解決這個問題,本方法引入“虛擬環(huán)”的概念,并采用基于“虛擬環(huán)”映射空間的分布式存儲映射計算方法,主要目的是在改變集群的node數(shù)量時(增加/刪除服務(wù)器),能夠盡可能少地改變已存在key和node的映射關(guān)系,以滿足單調(diào)性。在該方法中,引入“虛擬環(huán)”映射空間概念,通過計算虛結(jié)點,能夠減少移動為特點來實現(xiàn)集群容量的自適應(yīng)性。具體步驟如下:
1、引入“虛擬環(huán)”映射空間
“虛擬環(huán)”上的節(jié)點數(shù)量在環(huán)形空間保持恒定不變,而每個節(jié)點對應(yīng)了若干個“物理”存儲節(jié)點,“虛擬環(huán)”節(jié)點在哈希空間中以哈希值排列。如圖2所示,引入了“虛擬環(huán)”后,映射關(guān)系就從【object--->node】轉(zhuǎn)換成了【object--->virtualnode--->cachenode】。
2、虛擬環(huán)節(jié)點到存儲節(jié)點的映射
由于虛擬環(huán)節(jié)點個數(shù)在集群的整個生命周期中是恒定不變的,它與數(shù)據(jù)項的映射關(guān)系不會發(fā)生變化,改變的僅是虛擬環(huán)node與存儲node的映射關(guān)系,所以需對以上代碼進行優(yōu)化。在虛擬環(huán)節(jié)點上建立“存儲節(jié)點歷史模數(shù)表”,表中的數(shù)據(jù)項記錄虛擬環(huán)節(jié)點在某個歷史時間點所映射到的存儲節(jié)點的模數(shù)。
如1000個虛結(jié)點對應(yīng)著100個存儲結(jié)點,存儲結(jié)點變動時,虛結(jié)點就需要重新分配到結(jié)點。當100個結(jié)點擴展到101個結(jié)點時,此時至少有一個結(jié)點分配不到虛結(jié)點,那么就需要再在歷史模數(shù)表中增加一項新的存儲節(jié)點數(shù)記錄,而虛結(jié)點是與數(shù)據(jù)項對應(yīng)的哈希關(guān)系,如果改變了虛節(jié)點數(shù),那么就需要重新分配所有的數(shù)據(jù)項,這將導(dǎo)致移動大量的數(shù)據(jù)。
3、預(yù)設(shè)合理的存儲節(jié)點數(shù)
所以在設(shè)置虛結(jié)點數(shù)的時候,需要對系統(tǒng)預(yù)期的規(guī)模做充分考慮,假如集群的規(guī)模不會超過6000個結(jié)點,那么可以將虛結(jié)點數(shù)設(shè)置為結(jié)點數(shù)的100倍。這樣,變動任意一個結(jié)點的負載僅影響1%的數(shù)據(jù)項。此時有6百萬個vnode數(shù),使用2bytes來存儲結(jié)點數(shù)(0~65535)?;镜膬?nèi)存占用是6*106*2bytes=12mb,對于服務(wù)器來說完全可以承受。
4、存儲節(jié)點映射的取模運算
由于在虛擬環(huán)的節(jié)點上記錄了歷史模數(shù)表,存取數(shù)據(jù)時訪問端數(shù)據(jù)應(yīng)攜帶時間戳,根據(jù)時間在虛擬環(huán)節(jié)點上通過獲取歷史模數(shù)表來進行取模運算,從而獲取數(shù)據(jù)的具體存儲節(jié)點。
如圖3所示,根據(jù)本發(fā)明的方法思路,本發(fā)明的系統(tǒng)包括云存儲客戶端和云存儲服務(wù)器端,云存儲客戶端包括若干終端和hash算法模塊,云存儲服務(wù)器端包括云存儲服務(wù)器、虛擬環(huán)控制模塊、存儲節(jié)點映射模塊、hash算法模塊、http數(shù)據(jù)傳輸接口模塊、物理介質(zhì)讀寫模塊和數(shù)據(jù)庫訪問接口模塊。各組成部分有機結(jié)合,用于實現(xiàn)如前述的方法各步驟。本發(fā)明的方法和系統(tǒng)引用一致性哈希算法是為了減少由于增加結(jié)點導(dǎo)致數(shù)據(jù)項的數(shù)量來提高單調(diào)性,引入虛擬環(huán)和歷史模數(shù)表的目的是為了避免由于存儲節(jié)點數(shù)變化導(dǎo)致數(shù)據(jù)移動的問題。通過本發(fā)明的方法從理論上消除了存儲介質(zhì)規(guī)模對數(shù)據(jù)映射的影響,在保證負載均衡的基礎(chǔ)上,實現(xiàn)了云存儲容量的良好的冗余特性和高擴展性。
最后說明的是,以上實施例僅用以說明本發(fā)明的技術(shù)方案而非限制,盡管參照較佳實施例對本發(fā)明進行了詳細說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當理解,可以對本發(fā)明的技術(shù)方案進行修改或者等同替換,而不脫離本技術(shù)方案的宗旨和范圍,其均應(yīng)涵蓋在本發(fā)明的權(quán)利要求范圍當中。