專利名稱:一種云存儲(chǔ)中數(shù)據(jù)均衡分布方法
技術(shù)領(lǐng)域:
本發(fā)明屬于云存儲(chǔ)領(lǐng)域,具體涉及一種云存儲(chǔ)中數(shù)據(jù)如何均衡分布的策略。
背景技術(shù):
云存儲(chǔ)是在云計(jì)算(cloud computing)概念上延伸和發(fā)展出來的一個(gè)新的概念。 它是指通過集群應(yīng)用、網(wǎng)格技術(shù)或分布式文件系統(tǒng)等功能,將網(wǎng)絡(luò)中大量各種不同類型的存儲(chǔ)設(shè)備通過應(yīng)用軟件集合起來協(xié)同工作,共同對(duì)外提供數(shù)據(jù)存儲(chǔ)和業(yè)務(wù)訪問功能的一個(gè)系統(tǒng)。當(dāng)云計(jì)算系統(tǒng)運(yùn)算和處理的核心是大量數(shù)據(jù)的存儲(chǔ)和管理時(shí),云計(jì)算系統(tǒng)中就需要配置大量的存儲(chǔ)設(shè)備,那么云計(jì)算系統(tǒng)就轉(zhuǎn)變?yōu)橐粋€(gè)云存儲(chǔ)系統(tǒng),所以云存儲(chǔ)是一個(gè)以數(shù)據(jù)存儲(chǔ)和管理為核心的云計(jì)算系統(tǒng)。云存儲(chǔ)就如同云狀的廣域網(wǎng)和互聯(lián)網(wǎng)一樣,對(duì)使用者來講,并不是指一個(gè)具體的存儲(chǔ)節(jié)點(diǎn),而是指一個(gè)由許許多多個(gè)存儲(chǔ)節(jié)點(diǎn)所構(gòu)成的一個(gè)集合體。而只有均勻分布數(shù)據(jù)才可以保證負(fù)載均衡和云存儲(chǔ)系統(tǒng)良好的可擴(kuò)展性。因此,在云存儲(chǔ)系統(tǒng)中,如何均衡分布用戶存儲(chǔ)的數(shù)據(jù)是其中一項(xiàng)非常關(guān)鍵的技術(shù)。目前,在分配存儲(chǔ)的數(shù)據(jù)時(shí),一般是采用一致性哈希方法。該方法分兩步進(jìn)行首先求出存儲(chǔ)節(jié)點(diǎn)的哈希值,將該存儲(chǔ)節(jié)點(diǎn)映射到環(huán)上的一個(gè)存儲(chǔ)節(jié)點(diǎn)(環(huán)上的每個(gè)點(diǎn)代表一個(gè)哈希值);接著計(jì)算數(shù)據(jù)的哈希值,按順時(shí)針方向?qū)⑵溆成涞江h(huán)上距其最近的存儲(chǔ)節(jié)點(diǎn)。添加新設(shè)備存儲(chǔ)節(jié)點(diǎn)時(shí),按照上述規(guī)則,調(diào)整相關(guān)數(shù)據(jù)到新的存儲(chǔ)節(jié)點(diǎn)上。刪除存儲(chǔ)節(jié)點(diǎn)和添加存儲(chǔ)節(jié)點(diǎn)過程相反。使用一致性哈希方法分配數(shù)據(jù)的好處是每個(gè)存儲(chǔ)節(jié)點(diǎn)只需要處理落在它和它的前驅(qū)存儲(chǔ)節(jié)點(diǎn)之間的數(shù)據(jù),這樣在增加/刪除設(shè)備存儲(chǔ)節(jié)點(diǎn)時(shí)系統(tǒng)振蕩較小。但是一致性哈希函數(shù)是一種隨機(jī)性的函數(shù),在存儲(chǔ)節(jié)點(diǎn)數(shù)量較少的情況下很可能造成環(huán)上存儲(chǔ)節(jié)點(diǎn)分布的不均勻,導(dǎo)致負(fù)載不均勻因?yàn)樵谶x擇存儲(chǔ)節(jié)點(diǎn)位置時(shí),并沒有考慮不同存儲(chǔ)節(jié)點(diǎn)的性能差異。
發(fā)明內(nèi)容
為了解決這些問題,本發(fā)明在每個(gè)存儲(chǔ)節(jié)點(diǎn)中引入“虛擬節(jié)點(diǎn)”(partition)的概念。一個(gè)云存儲(chǔ)系統(tǒng)中有大量的“虛擬節(jié)點(diǎn)”,每個(gè)“虛擬節(jié)點(diǎn)”屬于某一個(gè)實(shí)際的存儲(chǔ)節(jié)點(diǎn),一個(gè)存儲(chǔ)節(jié)點(diǎn)可以擁有多個(gè)“虛擬節(jié)點(diǎn)”,且一個(gè)存儲(chǔ)節(jié)點(diǎn)的性能取決于它所擁有的“虛擬節(jié)點(diǎn)”的個(gè)數(shù)。而每個(gè)存儲(chǔ)節(jié)點(diǎn)所擁有的“虛擬節(jié)點(diǎn)”的個(gè)數(shù)又取決于該存儲(chǔ)節(jié)點(diǎn)的權(quán)值 (weight),系統(tǒng)中總的“虛擬節(jié)點(diǎn)”個(gè)數(shù)是固定的,在云存儲(chǔ)系統(tǒng)初始化時(shí)確定。本發(fā)明在保證了可用性和可靠性的前提下,可以在很大程度上提高用戶數(shù)據(jù)分布的均衡性,具有較高的實(shí)用價(jià)值和商業(yè)價(jià)值。本發(fā)明的目的在于提供一種云存儲(chǔ)系統(tǒng)中數(shù)據(jù)均衡分布的方法,旨在解決現(xiàn)有云存儲(chǔ)系統(tǒng)中不同存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)分布不均衡的問題。本發(fā)明所涉及的云存儲(chǔ)系統(tǒng)中數(shù)據(jù)均衡分布的方法包括下述步驟
1、設(shè)置當(dāng)前云存儲(chǔ)系統(tǒng)總的“虛擬節(jié)點(diǎn)”(partition)個(gè)數(shù),副本個(gè)數(shù)(默認(rèn)為 3);2、設(shè)置當(dāng)前云存儲(chǔ)系統(tǒng)中各個(gè)存儲(chǔ)節(jié)點(diǎn)的分布權(quán)值(weight),該值大小由存儲(chǔ)節(jié)點(diǎn)的存儲(chǔ)能力決定,取值范圍為weight >= 0,即存儲(chǔ)節(jié)點(diǎn)的存儲(chǔ)能力與該值成正比;3、根據(jù)當(dāng)前云存儲(chǔ)系統(tǒng)中總的虛擬節(jié)點(diǎn)個(gè)數(shù),副本個(gè)數(shù)以及各個(gè)存儲(chǔ)節(jié)點(diǎn)的分布權(quán)值,確定每個(gè)存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù);4、根據(jù)當(dāng)前云存儲(chǔ)系統(tǒng)中每個(gè)存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù),采用一定的策略,將所有虛擬節(jié)點(diǎn)的三個(gè)副本均衡地分布到存儲(chǔ)節(jié)點(diǎn)上,并使每個(gè)虛擬節(jié)點(diǎn)的副本分布在不同的存儲(chǔ)節(jié)點(diǎn)上;5、當(dāng)有數(shù)據(jù)需要存儲(chǔ)時(shí),通過哈希函數(shù),將該數(shù)據(jù)映射到某個(gè)虛擬節(jié)點(diǎn),然后將該數(shù)據(jù)的三個(gè)副本分別存放在已獲取的虛擬節(jié)點(diǎn)的三個(gè)副本中;6、當(dāng)云存儲(chǔ)系統(tǒng)中添加或者移除存儲(chǔ)節(jié)點(diǎn)時(shí),獲取要重新分配的虛擬節(jié)點(diǎn)信息, 重新計(jì)算每個(gè)可用存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù),然后重新分配這些虛擬節(jié)點(diǎn)。
圖1為本發(fā)明初始化虛擬節(jié)點(diǎn)均衡分布流程圖;圖2為本發(fā)明云存儲(chǔ)系統(tǒng)中數(shù)據(jù)、虛擬節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)映射關(guān)系圖。
具體實(shí)施例方式為了使本發(fā)明的目的、技術(shù)方案及有益效果更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅用以解釋本發(fā)明,并不用于限定本發(fā)明。以下1 4步驟講述云存儲(chǔ)系統(tǒng)中初始化均衡分布虛擬節(jié)點(diǎn)的內(nèi)容,具體實(shí)現(xiàn)流程如圖1所示。1、設(shè)置當(dāng)前云存儲(chǔ)系統(tǒng)的總虛擬節(jié)點(diǎn)個(gè)數(shù)及虛擬節(jié)點(diǎn)的副本個(gè)數(shù)。通常情況下, 為了保證數(shù)據(jù)分布的均衡性,平均每個(gè)存儲(chǔ)節(jié)點(diǎn)上的虛擬節(jié)點(diǎn)個(gè)數(shù)最好都在100以上。各個(gè)存儲(chǔ)節(jié)點(diǎn)上虛擬節(jié)點(diǎn)個(gè)數(shù)相加為當(dāng)前云存儲(chǔ)系統(tǒng)擬總虛擬節(jié)點(diǎn)個(gè)數(shù);除此之外,當(dāng)前云存儲(chǔ)系統(tǒng)總的虛擬機(jī)節(jié)點(diǎn)個(gè)數(shù)滿足以下條件當(dāng)前云云存儲(chǔ)系統(tǒng)總的虛擬節(jié)點(diǎn)個(gè)數(shù)為2的 η次方,其中,η的取值為大于等于1且小于等于31的整數(shù)。每個(gè)虛擬節(jié)點(diǎn)副本個(gè)數(shù)在2個(gè)以上,在本實(shí)施例中存儲(chǔ)節(jié)點(diǎn)副本個(gè)數(shù)取為3個(gè)。2、設(shè)置當(dāng)前云存儲(chǔ)系統(tǒng)中每個(gè)存儲(chǔ)節(jié)點(diǎn)的分布權(quán)值(weight)。該值表示節(jié)點(diǎn)的性能。一般分布權(quán)值(weight)的值與該存儲(chǔ)節(jié)點(diǎn)的存儲(chǔ)能力成正比。存儲(chǔ)能力越強(qiáng),容量越大,該值越大;反之越少。3、根據(jù)1和2設(shè)置的參數(shù)值,分配每個(gè)存儲(chǔ)節(jié)點(diǎn)的虛擬節(jié)點(diǎn)個(gè)數(shù)1)平均每個(gè)分布權(quán)值應(yīng)該分配的虛擬節(jié)點(diǎn)個(gè)數(shù),用partS_Weight表示parts_weight =總虛擬節(jié)點(diǎn)個(gè)數(shù)*副本個(gè)數(shù)/所有存儲(chǔ)節(jié)點(diǎn)weight值相加和;2)第i個(gè)存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù)(partS_Wanted[i])為,1)中獲取的 parts_weight*該存儲(chǔ)節(jié)點(diǎn)的分布權(quán)值weight,即parts_wanted[i] = Parts_weight* 該存儲(chǔ)節(jié),點(diǎn)的 weight 權(quán)值;
3)初始化每個(gè)存儲(chǔ)節(jié)點(diǎn)已分配虛擬節(jié)點(diǎn)個(gè)數(shù)為0,即parts_assigned[i] = 0,i = 0,1,.......4、根據(jù)當(dāng)前云存儲(chǔ)系統(tǒng)中各個(gè)存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù)partjanted數(shù)值,決定每個(gè)存儲(chǔ)節(jié)點(diǎn)上的虛擬節(jié)點(diǎn)分布,所述虛擬節(jié)點(diǎn)使用一個(gè)3*n的二維數(shù)組表示,即 replica2part2node [replica] [partitions],胃中,replicai ^ giJ^W id 號(hào) nl, nl的取值范圍為大于等于零且小于虛擬節(jié)點(diǎn)副本總數(shù),默認(rèn)副本數(shù)為3 ;partitions為虛擬節(jié)點(diǎn)的id號(hào)π2,η2的取值范圍為大于等于零且小于虛擬節(jié)點(diǎn)總數(shù)。本發(fā)明確保每個(gè)虛擬節(jié)點(diǎn)的三個(gè)副本分布在不同的存儲(chǔ)節(jié)點(diǎn)上,保證數(shù)據(jù)的可用性和可靠性;詳細(xì)的步驟如下對(duì)于當(dāng)前云存儲(chǔ)系統(tǒng)中每個(gè)虛擬節(jié)點(diǎn),執(zhí)行以下步驟1)對(duì)所有可用的存儲(chǔ)節(jié)點(diǎn),根據(jù)partsjanted值,進(jìn)行從小大到的排序。為了防止出現(xiàn)partsjanted值相同的情況,取(0,0xffff)之間的一個(gè)隨機(jī)值,添加到part_ wanted的小數(shù)點(diǎn)后面。這樣一般情況下不會(huì)出現(xiàn)值相同的情況;2)從1)的排序結(jié)果中,找出part_Wanted值最大的存儲(chǔ)節(jié)點(diǎn),用于存放當(dāng)前虛擬節(jié)點(diǎn)的第一個(gè)副本。并對(duì)該節(jié)點(diǎn)進(jìn)行標(biāo)記,以防止另外的任何一個(gè)副本存放在該存儲(chǔ)節(jié)點(diǎn)上;3)對(duì)幻中選擇的節(jié)點(diǎn)的partjanted值減去1,已分配出去的虛擬節(jié)點(diǎn)個(gè)數(shù) parts_assigned 值力口 1 ;4)數(shù)據(jù)的第二個(gè)副本,第三個(gè)副本的分布方法同上所述,確保將其分配在parts_ wanted值最大且與另外兩個(gè)副本不同的存儲(chǔ)節(jié)點(diǎn)上;5)重復(fù)1),對(duì)所有可用存儲(chǔ)節(jié)點(diǎn)進(jìn)行排序。正常下,經(jīng)過以上步驟,當(dāng)前云存儲(chǔ)系統(tǒng)中每個(gè)存儲(chǔ)節(jié)點(diǎn)的partsjants值變?yōu)?0,M parts_assigned 為 parts_wanted5、當(dāng)有數(shù)據(jù)需要存儲(chǔ)時(shí),通過哈希函數(shù),將該數(shù)據(jù)映射到某個(gè)虛擬節(jié)點(diǎn),然后將該數(shù)據(jù)的三個(gè)副本分別存放在已獲取的虛擬節(jié)點(diǎn)的三個(gè)副本所在存儲(chǔ)節(jié)點(diǎn)上,如圖2所示, 具體的執(zhí)行步驟如下(1)根據(jù)數(shù)據(jù)的用戶信息、目錄信息、對(duì)象信息,通過哈希函數(shù)計(jì)算該數(shù)據(jù)對(duì)象的哈希值;(2)根據(jù)(1)獲取的哈希值,再計(jì)算映射的虛擬節(jié)點(diǎn)值,具體計(jì)算方法為哈希值由字符串轉(zhuǎn)換為整型數(shù)組后,將數(shù)組中的第1個(gè)整數(shù)值右移shift位,shift的值設(shè)置為 32-n,其中η為步驟1中的η值;(3) Iflig replica2part2node[replica] [partitions] (replica 為虛擬節(jié)點(diǎn)副本的id號(hào),默認(rèn)副本數(shù)為3,partitions為虛擬節(jié)點(diǎn)的id號(hào)),獲取2)得到的 part三個(gè)副本所在存儲(chǔ)節(jié)點(diǎn);(4)最后,上傳數(shù)據(jù)的三個(gè)副本至相應(yīng)存儲(chǔ)節(jié)點(diǎn)上相應(yīng)的虛擬節(jié)點(diǎn)part中。6、當(dāng)云存儲(chǔ)系統(tǒng)中添加或者移除存儲(chǔ)節(jié)點(diǎn)時(shí),獲取要重新分配的虛擬節(jié)點(diǎn)信息, 重新計(jì)算每個(gè)可用存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù),然后重新分配這些虛擬節(jié)點(diǎn)。以下分別從移除存儲(chǔ)節(jié)點(diǎn)和新增存儲(chǔ)節(jié)點(diǎn)兩個(gè)方面講述如何重新分配虛擬節(jié)點(diǎn)。6. 1、當(dāng)移除其中一個(gè)或多個(gè)存儲(chǔ)節(jié)點(diǎn)時(shí),詳細(xì)步驟如下所示
1)重設(shè)被移除存儲(chǔ)節(jié)點(diǎn)的weight值為0 ;并將其添加到被移除節(jié)點(diǎn)隊(duì)列中,該隊(duì)列用 remove_nodes 表不;2)重新分配當(dāng)前云存儲(chǔ)系統(tǒng)中可用存儲(chǔ)節(jié)點(diǎn)的partsjants值平均每個(gè)weight應(yīng)該分配的虛擬節(jié)點(diǎn)個(gè)數(shù)為parts_weight =總虛擬節(jié)點(diǎn)個(gè)數(shù)*副本個(gè)數(shù)/所有存儲(chǔ)節(jié)點(diǎn)weight值相加和;第i個(gè)可用存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù)(partsjantedti])為parts_wanted[i] = Parts_weight氺該存儲(chǔ)節(jié)點(diǎn)的 weight 權(quán)值-parts_ assigned[i], i =0,1,......;3)最后執(zhí)行重新均衡操作(rebalance),詳細(xì)操作步驟見6. 3。6. 2、當(dāng)向當(dāng)前云存儲(chǔ)系統(tǒng)添加一個(gè)或多個(gè)存儲(chǔ)節(jié)點(diǎn)時(shí),詳細(xì)步驟如下所示1)首先判斷新添加進(jìn)來的節(jié)點(diǎn)是否已經(jīng)存在于當(dāng)前云存儲(chǔ)系統(tǒng)中,如果重復(fù)添力口,則報(bào)出異常;2)根據(jù)傳進(jìn)來的參數(shù),獲取新添加存儲(chǔ)節(jié)點(diǎn)的weight值;并初始化該節(jié)點(diǎn)的 parts_assigned為0 ;將其添加到可用存儲(chǔ)節(jié)點(diǎn)序列中;3)重新分配當(dāng)前云存儲(chǔ)系統(tǒng)中可用存儲(chǔ)節(jié)點(diǎn)的partsjants值平均每個(gè)分布權(quán)值weight應(yīng)該分配的虛擬節(jié)點(diǎn)個(gè)數(shù)為Parts_weight =總虛擬節(jié)點(diǎn)個(gè)數(shù)*副本個(gè)數(shù)/所有存儲(chǔ)節(jié)點(diǎn)weight值相加和;第i個(gè)可用存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù)(partS_Wanted[i])為parts_wanted[i] = Parts_weight氺該存儲(chǔ)節(jié)點(diǎn)的 weight 權(quán)值-parts_ assigned[i],i =0,1,......由于新增存儲(chǔ)節(jié)點(diǎn),那么正常情況下,Parts_weight*該存儲(chǔ)節(jié)點(diǎn)的weight權(quán)值會(huì)小于 parts_assigned[i],因此,parts_wanted[i]為負(fù)值,艮口 <0 ;4)最后執(zhí)行均衡rebalance操作,詳細(xì)操作步驟見6. 3。6. 3、重新均衡各個(gè)可用存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)分布狀況,步驟如下獲取當(dāng)前云存儲(chǔ)系統(tǒng)中要重新分配的虛擬節(jié)點(diǎn)信息,步驟如下A、判斷被移除節(jié)點(diǎn)隊(duì)列,即removejodes隊(duì)列是否為空,若非空,則執(zhí)行以下步驟;B、遍歷每個(gè)虛擬節(jié)點(diǎn)的每個(gè)副本,查看該副本所在的存儲(chǔ)節(jié)點(diǎn)是否屬于被移除節(jié)點(diǎn)隊(duì)列,即removejodes隊(duì)列。如果屬于,則取消該副本與該存儲(chǔ)節(jié)點(diǎn)的映射關(guān)系,將該虛擬節(jié)點(diǎn)添加到reassigruparts隊(duì)列中,設(shè)置該虛擬節(jié)點(diǎn)該副本的存儲(chǔ)節(jié)點(diǎn)id位為 Oxffff ;C、遍歷每個(gè)虛擬節(jié)點(diǎn)的每個(gè)副本,查看該副本距離上次被移動(dòng)的時(shí)間值。如果該值大于某個(gè)最小移動(dòng)時(shí)間值,比如M小時(shí),并且該副本所在存儲(chǔ)節(jié)點(diǎn)的partsjanted值小于0,則將該副本添加到reassigruparts隊(duì)列中,設(shè)置該虛擬節(jié)點(diǎn)該副本的存儲(chǔ)節(jié)點(diǎn)id位為 Oxffff ;D、對(duì)當(dāng)前云存儲(chǔ)系統(tǒng)中需要重新分配虛擬節(jié)點(diǎn),進(jìn)行重新分布,步驟如下A)、對(duì)所有可用的存儲(chǔ)節(jié)點(diǎn),根據(jù)partsjanted值,進(jìn)行從小大到的排序。為了防止出現(xiàn)partsjanted值相同的情況,取(0,Oxffff)之間的一個(gè)隨機(jī)值,添加到part_ wanted的小數(shù)點(diǎn)后面。這樣一般情況下不會(huì)出現(xiàn)值相同的情況;對(duì)于reassigned_parts隊(duì)列中的每個(gè)part執(zhí)行以下步驟B) D),
8
B)、遍歷該part的每個(gè)副本,查看副本的存儲(chǔ)節(jié)點(diǎn)id位是否為Oxffff,如果是,則從A)的排序結(jié)果中,找出partjanted值最大且與其他兩個(gè)副本不同存儲(chǔ)節(jié)點(diǎn)的節(jié)點(diǎn),用于存放當(dāng)前虛擬節(jié)點(diǎn)的這個(gè)副本;并對(duì)該節(jié)點(diǎn)進(jìn)行標(biāo)記,以防止另外的任何一個(gè)副本存放在該節(jié)點(diǎn)上;C)、對(duì)B)中選擇的節(jié)點(diǎn)的part_wanted值減去1,已分配出去的parts_assigned 值加1 ;D)、重復(fù)A),重新對(duì)所有可用存儲(chǔ)節(jié)點(diǎn)進(jìn)行排序。以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所做的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種云存儲(chǔ)系統(tǒng)中用戶數(shù)據(jù)均衡分布的方法,其特征在于,其包括下述步驟1)設(shè)置當(dāng)前云存儲(chǔ)系統(tǒng)總的虛擬節(jié)點(diǎn)個(gè)數(shù)及虛擬節(jié)點(diǎn)的副本個(gè)數(shù);2)設(shè)置當(dāng)前云存儲(chǔ)系統(tǒng)中各個(gè)存儲(chǔ)節(jié)點(diǎn)的分布權(quán)值,以下用weight表示分布權(quán)值,該值大小由存儲(chǔ)節(jié)點(diǎn)的存儲(chǔ)能力決定,取值范圍為weight >= 0,即存儲(chǔ)節(jié)點(diǎn)的存儲(chǔ)能力與該值成正比;3)根據(jù)當(dāng)前云存儲(chǔ)系統(tǒng)中總的虛擬節(jié)點(diǎn)個(gè)數(shù)、副本個(gè)數(shù)以及各個(gè)存儲(chǔ)節(jié)點(diǎn)的分布權(quán)值,確定每個(gè)存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù);4)根據(jù)當(dāng)前云存儲(chǔ)系統(tǒng)中每個(gè)存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù),將所有虛擬節(jié)點(diǎn)的副本均衡地分布到存儲(chǔ)節(jié)點(diǎn)上,并使每個(gè)虛擬節(jié)點(diǎn)的副本分布在不同的存儲(chǔ)節(jié)點(diǎn)上;5)當(dāng)有數(shù)據(jù)需要存儲(chǔ)時(shí),通過哈希函數(shù),將該數(shù)據(jù)映射到某個(gè)虛擬節(jié)點(diǎn),然后將該數(shù)據(jù)的各副本分別存放在已獲取的虛擬節(jié)點(diǎn)的各副本中;6)當(dāng)云存儲(chǔ)系統(tǒng)中添加或者移除存儲(chǔ)節(jié)點(diǎn)時(shí),獲取要重新分配的虛擬節(jié)點(diǎn)信息,重新計(jì)算每個(gè)可用存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù),然后重新分配這些虛擬節(jié)點(diǎn)。
2.如權(quán)利要求1所述的方法,其特征在于在所述步驟1)中,平均每個(gè)存儲(chǔ)節(jié)點(diǎn)上的虛擬節(jié)點(diǎn)個(gè)數(shù)在100以上,且每個(gè)虛擬節(jié)點(diǎn)副本個(gè)數(shù)在2個(gè)以上。
3.如權(quán)利要求1所述的方法,其特征在于在所述步驟1)中,存儲(chǔ)節(jié)點(diǎn)副本個(gè)數(shù)為3 個(gè);各個(gè)存儲(chǔ)節(jié)點(diǎn)上虛擬節(jié)點(diǎn)個(gè)數(shù)相加為當(dāng)前云存儲(chǔ)系統(tǒng)總虛擬節(jié)點(diǎn)個(gè)數(shù),且當(dāng)前云存儲(chǔ)系統(tǒng)總的虛擬節(jié)點(diǎn)個(gè)數(shù)為2的η次方,η的取值為大于等于1且小于等于31的整數(shù)。
4.如權(quán)利要求1所述的方法,其特征在于在所述步驟3)中,分配每個(gè)存儲(chǔ)節(jié)點(diǎn)的虛擬節(jié)點(diǎn)個(gè)數(shù)的步驟如下(1)首先計(jì)算平均每個(gè)分布權(quán)值應(yīng)該分配的虛擬節(jié)點(diǎn)個(gè)數(shù),用partS_weight表示parts_weight =總虛擬節(jié)點(diǎn)個(gè)數(shù)*副本個(gè)數(shù)/所有存儲(chǔ)節(jié)點(diǎn)分布權(quán)值weight相加和;(2)第i個(gè)存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù)partS_wanted[i]為(1)中獲取的parts_ weight*該存儲(chǔ)節(jié)點(diǎn)的分布權(quán)值weight,即parts_wanted[i] = Parts_weight* 該存儲(chǔ)節(jié)點(diǎn)的分布權(quán)值 weight ;(3)初始化每個(gè)存儲(chǔ)節(jié)點(diǎn)已分配虛擬節(jié)點(diǎn)個(gè)數(shù)partsjssigned為0,即parts_ assigned[i] = 0, i =0,1,......;
5.如權(quán)利要求3中所述的方法,其特征在于在所述步驟4)中,根據(jù)當(dāng)前云存儲(chǔ)系統(tǒng)中各個(gè)存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù)partjanted數(shù)值,決定每個(gè)存儲(chǔ)節(jié)點(diǎn)上的虛擬節(jié)點(diǎn)分布,詳細(xì)的步驟如下對(duì)于當(dāng)前云存儲(chǔ)系統(tǒng)中每個(gè)虛擬節(jié)點(diǎn),執(zhí)行以下步驟(1)取(0,Oxffff)之間的一個(gè)隨機(jī)值,添加到待分配虛擬節(jié)點(diǎn)個(gè)數(shù)part_wanted的小數(shù)點(diǎn)后面以防止出現(xiàn)待分配虛擬節(jié)點(diǎn)個(gè)數(shù)parts_Wanted值相同的情況,然后對(duì)所有可用的存儲(chǔ)節(jié)點(diǎn),根據(jù)待分配虛擬節(jié)點(diǎn)個(gè)數(shù)parts^anted值,進(jìn)行從小大到的排序;(2)從⑴的排序結(jié)果中,找出待分配虛擬節(jié)點(diǎn)個(gè)數(shù)partjanted值最大的存儲(chǔ)節(jié)點(diǎn), 用于存放當(dāng)前虛擬節(jié)點(diǎn)的第一個(gè)副本,并對(duì)該存儲(chǔ)節(jié)點(diǎn)進(jìn)行標(biāo)記,以防止另外的任何一個(gè)副本存放在該存儲(chǔ)節(jié)點(diǎn)上;(3)對(duì)(2)中選擇的存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù)partjanted值減去1,已分配出去的虛擬節(jié)點(diǎn)個(gè)數(shù)parts_assigned值加1 ;(4)數(shù)據(jù)的第二個(gè)副本,第三個(gè)副本的分布方法同上所述,以將其分配在待分配虛擬節(jié)點(diǎn)個(gè)數(shù)partsjanted值最大且與另外兩個(gè)副本不同的存儲(chǔ)節(jié)點(diǎn)上;(5)重復(fù)(1),對(duì)所有可用存儲(chǔ)節(jié)點(diǎn)進(jìn)行排序。
6.如權(quán)利要求3中所述的方法,其特征在于在所述步驟5)中,當(dāng)有數(shù)據(jù)需要存儲(chǔ)時(shí), 通過哈希函數(shù),將該數(shù)據(jù)映射到某個(gè)虛擬節(jié)點(diǎn),然后將該數(shù)據(jù)的三個(gè)副本分別存放在已獲取的虛擬節(jié)點(diǎn)的三個(gè)副本所在存儲(chǔ)節(jié)點(diǎn)上,具體的執(zhí)行步驟如下(1)根據(jù)數(shù)據(jù)的用戶信息、目錄信息、對(duì)象信息,通過哈希函數(shù)計(jì)算該數(shù)據(jù)對(duì)象的哈希值;(2)根據(jù)(1)獲取的哈希值,再計(jì)算映射的虛擬節(jié)點(diǎn)值,具體計(jì)算方法為哈希值由字符串轉(zhuǎn)換為整型數(shù)組后,將數(shù)組中的第1個(gè)整數(shù)值右移shift位,shift的值設(shè)置為32-n ;(3)獲取( 得到的虛擬節(jié)點(diǎn)part三個(gè)副本所在存儲(chǔ)節(jié)點(diǎn);(4)然后,上傳數(shù)據(jù)的三個(gè)副本至相應(yīng)存儲(chǔ)節(jié)點(diǎn)上相應(yīng)的虛擬節(jié)點(diǎn)part中。
7.如權(quán)利要求1中所述的方法,其特征在于在所述步驟6)中,當(dāng)移除其中一個(gè)或多個(gè)存儲(chǔ)節(jié)點(diǎn)時(shí),需要重新分配虛擬節(jié)點(diǎn),詳細(xì)步驟如下(1)重設(shè)被移除存儲(chǔ)節(jié)點(diǎn)的分布權(quán)值weight值為0,并將其添加到被移除節(jié)點(diǎn)隊(duì)列中;(2)重新分配當(dāng)前云存儲(chǔ)系統(tǒng)中可用存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù)partsjants值平均每個(gè)分布權(quán)值weight應(yīng)該分配的虛擬節(jié)點(diǎn)個(gè)數(shù)為 parts_weight =總虛擬節(jié)點(diǎn)個(gè)數(shù)*副本個(gè)數(shù)/所有存儲(chǔ)節(jié)點(diǎn)weight值相加和; 第i個(gè)可用存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù)parts_wanted[i]為 parts_wanted[i] = Parts_weight氺該存儲(chǔ)節(jié)點(diǎn)的 weight 權(quán)值-parts_assigned[i], i = 0,1,......;(3)然后執(zhí)行重新均衡操作。
8.如權(quán)利要求1中所述的方法,其特征在于在所述步驟6)中,當(dāng)向當(dāng)前云存儲(chǔ)系統(tǒng)添加一個(gè)或多個(gè)存儲(chǔ)節(jié)點(diǎn)時(shí),需要重新分配虛擬節(jié)點(diǎn),詳細(xì)步驟如下(1)首先判斷新添加進(jìn)來的節(jié)點(diǎn)是否已經(jīng)存在于當(dāng)前云存儲(chǔ)系統(tǒng)中,如果重復(fù)添加,則報(bào)出異常;(2)根據(jù)傳進(jìn)來的參數(shù),獲取新添加存儲(chǔ)節(jié)點(diǎn)的分布權(quán)值weight;并初始化該節(jié)點(diǎn)的已分配虛擬節(jié)點(diǎn)個(gè)數(shù)parts^ssigned為0 ;將其添加到可用存儲(chǔ)節(jié)點(diǎn)序列中;(3)重新分配當(dāng)前云存儲(chǔ)系統(tǒng)中可用存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù)partsjants值平均每個(gè)分布權(quán)值weight應(yīng)該分配的虛擬節(jié)點(diǎn)個(gè)數(shù)為 parts_weight =總虛擬節(jié)點(diǎn)個(gè)數(shù)*副本個(gè)數(shù)/所有存儲(chǔ)節(jié)點(diǎn)weight值相加和; 第i個(gè)可用存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù)parts_wanted[i]為 parts_wanted[i] = Parts_weight氺該存儲(chǔ)節(jié)點(diǎn)的 weight 權(quán)值-parts_assigned[i], i = 0,1,......;(4)然后執(zhí)行重新均衡操作。
9.如權(quán)利要求7或8中所述的方法,其特征在于重新均衡各個(gè)可用存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)分布狀況的實(shí)現(xiàn)步驟如下①獲取當(dāng)前云存儲(chǔ)系統(tǒng)中要重新分配的虛擬節(jié)點(diǎn)信息,步驟如下A、判斷被移除節(jié)點(diǎn)隊(duì)列是否為空,若非空,則執(zhí)行以下步驟;B、遍歷每個(gè)虛擬節(jié)點(diǎn)的每個(gè)副本,查看該副本所在的存儲(chǔ)節(jié)點(diǎn)是否屬于被移除節(jié)點(diǎn)隊(duì)列;如果屬于,則取消該副本與該存儲(chǔ)節(jié)點(diǎn)的映射關(guān)系,將該虛擬節(jié)點(diǎn)添加到reassigru parts隊(duì)列中,設(shè)置該虛擬節(jié)點(diǎn)該副本的存儲(chǔ)節(jié)點(diǎn)id位Oxffff ;C、遍歷每個(gè)虛擬節(jié)點(diǎn)的每個(gè)副本,查看該副本距離上次被移動(dòng)的時(shí)間值,如果該值大于一個(gè)預(yù)定的最小移動(dòng)時(shí)間值,并且該副本所在存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù)parts_ wanted值小于0,則將該副本添加到reassigr^parts隊(duì)列中,設(shè)置該虛擬節(jié)點(diǎn)該副本的存儲(chǔ)節(jié)點(diǎn)id位為Oxffff ;②對(duì)當(dāng)前云存儲(chǔ)系統(tǒng)中需要重新分配虛擬節(jié)點(diǎn),進(jìn)行重新分布,步驟如下A、首先取(0,0xffff)之間的一個(gè)隨機(jī)值,添加到partjanted的小數(shù)點(diǎn)后面以防止出現(xiàn)partsjanted值相同的情況,然后對(duì)所有可用的存儲(chǔ)節(jié)點(diǎn),根據(jù)待分配虛擬節(jié)點(diǎn)個(gè)數(shù) parts_wanted值,進(jìn)行從小大到的排序;并對(duì)于reassigned—parts隊(duì)列中的每個(gè)part執(zhí)行以下步驟B D ;B、遍歷該part的每個(gè)副本,查看各副本的存儲(chǔ)節(jié)點(diǎn)id位是否為OxfTfT,如果是,則從 A的排序結(jié)果中,找出待分配虛擬節(jié)點(diǎn)個(gè)數(shù)partjanted值最大且與其他兩個(gè)副本不同存儲(chǔ)節(jié)點(diǎn)的節(jié)點(diǎn),用于存放當(dāng)前虛擬節(jié)點(diǎn)的這個(gè)副本,并對(duì)該節(jié)點(diǎn)進(jìn)行標(biāo)記,以防止另外的任何一個(gè)副本存放在該節(jié)點(diǎn)上;C、對(duì)B中選擇的節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù)partjanted值減去1,已分配出去的已分配虛擬節(jié)點(diǎn)個(gè)數(shù)parts_assigned值加1 ;D、重復(fù)A,對(duì)所有可用存儲(chǔ)節(jié)點(diǎn)進(jìn)行排序。
全文摘要
一種云存儲(chǔ)系統(tǒng)中用戶數(shù)據(jù)均衡分布的方法,包括設(shè)置云存儲(chǔ)系統(tǒng)總的虛擬節(jié)點(diǎn)個(gè)數(shù)、副本個(gè)數(shù);設(shè)置云存儲(chǔ)系統(tǒng)中各個(gè)存儲(chǔ)節(jié)點(diǎn)的分布權(quán)值;根據(jù)云存儲(chǔ)系統(tǒng)中總的虛擬節(jié)點(diǎn)個(gè)數(shù)、副本個(gè)數(shù)以及各個(gè)節(jié)點(diǎn)的分布權(quán)值確定每個(gè)存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù);根據(jù)云存儲(chǔ)系統(tǒng)中每個(gè)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù),將所有虛擬節(jié)點(diǎn)的三個(gè)副本均衡地分布到不同的存儲(chǔ)節(jié)點(diǎn)上;當(dāng)有數(shù)據(jù)需要存儲(chǔ)時(shí),通過哈希函數(shù),將該數(shù)據(jù)映射到某個(gè)虛擬節(jié)點(diǎn),然后將該數(shù)據(jù)的三個(gè)副本分別存放在已獲取的虛擬節(jié)點(diǎn)的三個(gè)副本中。當(dāng)云存儲(chǔ)系統(tǒng)中添加或者移除存儲(chǔ)節(jié)點(diǎn)時(shí),獲取要重新分配的虛擬節(jié)點(diǎn)信息,重新計(jì)算每個(gè)可用存儲(chǔ)節(jié)點(diǎn)的待分配虛擬節(jié)點(diǎn)個(gè)數(shù),然后重新分配這些虛擬節(jié)點(diǎn)。
文檔編號(hào)H04L29/08GK102457571SQ20111027297
公開日2012年5月16日 申請(qǐng)日期2011年9月15日 優(yōu)先權(quán)日2011年9月15日
發(fā)明者蘭雨晴, 夏穎, 宋瀟豫, 張永軍, 李俊麗 申請(qǐng)人:中標(biāo)軟件有限公司