基于虛擬節(jié)點(diǎn)存儲(chǔ)優(yōu)化的Swift負(fù)載均衡方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明設(shè)及一種基于虛擬節(jié)點(diǎn)存儲(chǔ)優(yōu)化的Swift負(fù)載均衡方法,該方法可W用于 實(shí)現(xiàn)大規(guī)模、分布式的存儲(chǔ)系統(tǒng),屬于互聯(lián)網(wǎng)技術(shù)領(lǐng)域。
【背景技術(shù)】
[0002] Swift是開源云計(jì)算平臺(tái)化enStack中的云存儲(chǔ)服務(wù)組件,是目前業(yè)界非常重要的 一種云存儲(chǔ)解決方案。Swift的對(duì)象存取策略主要采取兩層映射機(jī)制,該機(jī)制在對(duì)象與存儲(chǔ) 服務(wù)器之間增加一個(gè)虛擬節(jié)點(diǎn)層,一起形成兩層映射:(1)對(duì)象層與虛擬節(jié)點(diǎn)層之間的映 射,該映射主要通過一致性哈希算法完成;(2)虛擬節(jié)點(diǎn)層與存儲(chǔ)服務(wù)器層之間的映射,該 映射主要根據(jù)存儲(chǔ)服務(wù)器的物理位置,將虛擬節(jié)點(diǎn)分散地分布于服務(wù)器集群中。其中第一 層映射較為復(fù)雜,也是影響整個(gè)Swift存取性能的關(guān)鍵。在兩層映射關(guān)系下,Swift中對(duì)象的 存取過程如圖1所示,主要分為兩步:第一步,利用哈希函數(shù)對(duì)請(qǐng)求中的對(duì)象進(jìn)行哈希,根據(jù) 哈希計(jì)算的結(jié)果找到對(duì)應(yīng)的虛擬節(jié)點(diǎn);第二步,根據(jù)第二層映射找到該虛擬節(jié)點(diǎn)對(duì)應(yīng)的存 儲(chǔ)服務(wù)器,進(jìn)而完成對(duì)象的存儲(chǔ)或讀取。
[0003] 一致性哈希算法(Consistent化sh)在Swift存取過程中起到非常重要的作用,其 原理如圖2所示:該算法維護(hù)一個(gè)邏輯環(huán)(Ring環(huán)),它可視為一個(gè)環(huán)形的化sh空間,對(duì)象和 虛擬節(jié)點(diǎn)都將映射到此化sh空間中。當(dāng)有存儲(chǔ)對(duì)象的請(qǐng)求到來時(shí),利用哈希函數(shù)將對(duì)象映 射到環(huán)上某一點(diǎn),并W該位置為起點(diǎn),沿環(huán)順時(shí)針方向遇到的第一個(gè)虛擬節(jié)點(diǎn)為該對(duì)象所 對(duì)應(yīng)的虛擬節(jié)點(diǎn)。如圖2所示,對(duì)象Objects在環(huán)上的位置是L2,則Objects映射到虛擬節(jié)點(diǎn) 化ode3。Swift將虛擬節(jié)點(diǎn)均勻地分布在Ring環(huán)上,確保每個(gè)虛擬節(jié)點(diǎn)可存儲(chǔ)的對(duì)象個(gè)數(shù)相 等。但是,由于每個(gè)對(duì)象所占存儲(chǔ)空間大小存在差異,所W運(yùn)樣做并不能保證存儲(chǔ)服務(wù)器的 空間利用率負(fù)載均衡。此外,當(dāng)在Ring環(huán)上順時(shí)針方向遇到的第一個(gè)虛擬節(jié)點(diǎn)不滿足存儲(chǔ) 條件時(shí),Swift將繼續(xù)沿順時(shí)針方向直至找到合適的虛擬節(jié)點(diǎn)為止,最壞情況下將繞環(huán)一 周,影響對(duì)象的存取效率。
[0004] 由于Swift存儲(chǔ)對(duì)象具有隨機(jī)性,并且不同存儲(chǔ)服務(wù)器的性能不同,為了避免因存 儲(chǔ)服務(wù)器負(fù)載不均而使個(gè)別存儲(chǔ)服務(wù)器出現(xiàn)存儲(chǔ)瓶頸,Swift在存儲(chǔ)對(duì)象時(shí)需要對(duì)各存儲(chǔ) 服務(wù)器進(jìn)行負(fù)載均衡。實(shí)現(xiàn)負(fù)載均衡的關(guān)鍵在于,如何W盡可能小的開銷來平衡各服務(wù)器 的負(fù)載,從而提高存儲(chǔ)系統(tǒng)的資源利用率。從Swift存儲(chǔ)的負(fù)載均衡需求來看,目前已有的 一些動(dòng)態(tài)負(fù)載均衡方法,在效率、可擴(kuò)展性和性能等方面仍存在欠缺。例如,基于加權(quán)最小 連接(wei曲ted least-connections)的方法,用權(quán)值來反映各服務(wù)器間的性能差異,并采 用請(qǐng)求的連接數(shù)作為衡量負(fù)載量的標(biāo)準(zhǔn),在分配請(qǐng)求時(shí)盡可能使服務(wù)器的連接數(shù)與性能權(quán) 值成比例,但該方法并沒有考慮請(qǐng)求之間的差異。而基于雙加權(quán)最小連接的方法雖然考慮 了請(qǐng)求之間的差異,并因此增加了表示請(qǐng)求的權(quán)值,但該方法對(duì)于Swift而言,由于比較次 數(shù)過多,致使效率較低。
【發(fā)明內(nèi)容】
[0005] 發(fā)明目的:針對(duì)現(xiàn)有技術(shù)中存在的問題與不足,本發(fā)明提供一種基于虛擬節(jié)點(diǎn)存 儲(chǔ)優(yōu)化的Swift負(fù)載均衡方法。該方法綜合考慮了存儲(chǔ)服務(wù)器的性能差異和對(duì)象所占空間 的大小差異,通過采用分組、合并的機(jī)制,可實(shí)現(xiàn)全局和局部相結(jié)合的動(dòng)態(tài)負(fù)載均衡,提升 云存儲(chǔ)系統(tǒng)的資源利用率和提高云存儲(chǔ)系統(tǒng)的存取效率,更加適用于大規(guī)模、分布式云存 儲(chǔ)服務(wù)需求。
[0006] 技術(shù)方案:一種基于虛擬節(jié)點(diǎn)存儲(chǔ)優(yōu)化的Swift負(fù)載均衡方法,包括如下步驟:
[0007] (1)與虛擬節(jié)點(diǎn)相關(guān)參數(shù)的初始化。為了達(dá)到存儲(chǔ)負(fù)載均衡的效果,Swift存儲(chǔ)系 統(tǒng)需要記錄虛擬節(jié)點(diǎn)的相關(guān)參數(shù),包括虛擬節(jié)點(diǎn)的相對(duì)空閑度、虛擬節(jié)點(diǎn)所屬類別、虛擬節(jié) 點(diǎn)類別鏈表、虛擬節(jié)點(diǎn)的組別數(shù)、虛擬節(jié)點(diǎn)所屬組別號(hào)等。在Swift存儲(chǔ)系統(tǒng)開始運(yùn)行時(shí),需 要對(duì)運(yùn)些參數(shù)進(jìn)行初始化。
[0008] (2)對(duì)象的存儲(chǔ)過程。該過程將主要根據(jù)系統(tǒng)中虛擬節(jié)點(diǎn)是否已經(jīng)進(jìn)行過分組,而 分情況實(shí)施。若系統(tǒng)中虛擬節(jié)點(diǎn)尚未進(jìn)行過分組,緊接著判斷采用虛擬節(jié)點(diǎn)分組時(shí)間點(diǎn)判 別方法,判斷當(dāng)前時(shí)刻是否需要對(duì)虛擬節(jié)點(diǎn)進(jìn)行分組。如果無需分組,直接進(jìn)行對(duì)象存儲(chǔ); 如果需要分組,則先按照虛擬節(jié)點(diǎn)的分組過程對(duì)虛擬節(jié)點(diǎn)進(jìn)行分組。一旦系統(tǒng)中虛擬節(jié)點(diǎn) 進(jìn)行過分組,判斷對(duì)象被映射到的分組是否能夠存儲(chǔ)該對(duì)象。如果能夠存儲(chǔ),將對(duì)象存儲(chǔ)在 合適的存儲(chǔ)服務(wù)器;否則,先按照分組合并過程將對(duì)象被映射到的分組與另一個(gè)分組進(jìn)行 合并,然后在合并后的分組中完成對(duì)象存儲(chǔ)。
[0009] (3)對(duì)象的檢索過程。當(dāng)系統(tǒng)收到讀取某一對(duì)象的請(qǐng)求時(shí),首先根據(jù)Swift中的 Ring環(huán)找到該對(duì)象對(duì)應(yīng)的虛擬節(jié)點(diǎn),然后查詢?cè)撎摂M節(jié)點(diǎn)所對(duì)應(yīng)的存儲(chǔ)服務(wù)器。如果在存 儲(chǔ)服務(wù)器中找到所請(qǐng)求的對(duì)象,則直接讀取;否則,先找出該虛擬節(jié)點(diǎn)所在的分組,然后遍 歷分組內(nèi)所有虛擬節(jié)點(diǎn)對(duì)應(yīng)的存儲(chǔ)服務(wù)器,直至找到所請(qǐng)求的對(duì)象。
[0010] 第一,與虛擬節(jié)點(diǎn)相關(guān)的參數(shù)及其計(jì)算。本方法在實(shí)現(xiàn)負(fù)載均衡時(shí)的主要依據(jù)是 與虛擬節(jié)點(diǎn)有關(guān)的一些參數(shù),運(yùn)些參數(shù)主要包括:虛擬節(jié)點(diǎn)的相對(duì)空閑度、虛擬節(jié)點(diǎn)所屬類 另IJ、虛擬節(jié)點(diǎn)類別鏈表、虛擬節(jié)點(diǎn)的組別數(shù)、虛擬節(jié)點(diǎn)所屬組別號(hào)等。
[0011 ]虛擬節(jié)點(diǎn)的相對(duì)空閑度。假定Ring環(huán)上共有η個(gè)虛擬節(jié)點(diǎn),W其中一個(gè)虛擬節(jié)點(diǎn)為 起始點(diǎn),順時(shí)針進(jìn)行編號(hào)為虛擬節(jié)點(diǎn)0、虛擬節(jié)點(diǎn)1、···、虛擬節(jié)點(diǎn)η-1,則編號(hào)為i(0 < i < η- 1)的虛擬節(jié)點(diǎn)化1的相對(duì)空閑度RFi是指其剩余空間占總存儲(chǔ)空間的百分比,取值范圍為區(qū) 間[0%,100% ]。具體采用公式1進(jìn)行計(jì)算:
[oon]
(公式 1)
[001引其中,取η,表示編號(hào)為i的虛擬節(jié)點(diǎn)Vm的存儲(chǔ)空間大小,mi表示編號(hào)為i的虛擬節(jié) 點(diǎn)目前已存儲(chǔ)的對(duì)象個(gè)數(shù),表示編號(hào)為i的虛擬節(jié)點(diǎn)存儲(chǔ)的第j(0含j含ΠΗ)個(gè)對(duì)象的大小。 當(dāng)編號(hào)為i的虛擬節(jié)點(diǎn)新增一個(gè)大小為a的存儲(chǔ)對(duì)象時(shí),則其相對(duì)空閑度RFi采用公式2進(jìn)行 更新:
[0014]
(公式 2)
[0015] 相對(duì)空閑度反映了虛擬節(jié)點(diǎn)的存儲(chǔ)負(fù)載狀態(tài),相對(duì)空閑度高代表負(fù)載高,相對(duì)空 閑度低則代表負(fù)載低。同時(shí),用長(zhǎng)度為η的數(shù)組化ode_left_pe;rcentage來記錄化ng環(huán)上η個(gè) 虛擬節(jié)點(diǎn)的相對(duì)空閑度,其中化〇de_lef ^percentage [ i ]表示編號(hào)為i的虛擬節(jié)點(diǎn)的相對(duì) 空閑度,初始化時(shí)將該數(shù)組所有元素初值設(shè)為100 %。
[0016] 虛擬節(jié)點(diǎn)所屬類別。它是在對(duì)虛擬節(jié)點(diǎn)進(jìn)行分組時(shí)的重要參考因素,區(qū)分類別的 基礎(chǔ)是虛擬節(jié)點(diǎn)的相對(duì)空閑度。假定類別數(shù)目為cn(此處Wcn=10為例),首先將相對(duì)空閑 度取值區(qū)間[0 %,100 % ]劃分成cn個(gè)等間隔的子區(qū)間,得到10個(gè)子區(qū)間(90 %,100 % ]、 (80% ,90% ]、(70% ,80% ]、(60% ,70% ]、···、[0%,10%],記為子區(qū)間9、子區(qū)間8、子區(qū)間 7、···、子區(qū)間0。相對(duì)空閑度落在同一子區(qū)間中的所有虛擬節(jié)點(diǎn)視為同一類別,則總共得到 10個(gè)類別,記為類別9、類別8、類別7、···、類別0。用長(zhǎng)度為cn(此處cn=10)的數(shù)組Vnode_ counts_by_key來記錄屬于某一類別的虛擬節(jié)點(diǎn)個(gè)數(shù),如化ode_counts_by_key [ 0 ]代表類 別0(對(duì)應(yīng)子區(qū)間[0%,10% ])的虛擬節(jié)點(diǎn)個(gè)數(shù)。該數(shù)組在初始化時(shí)Vnode_counts_by_key kn-l ] =n,其余數(shù)組元素全為0。
[0017] 虛擬節(jié)點(diǎn)類別鏈表。用10個(gè)鏈表Listo,Listi,…,Lists存儲(chǔ)屬于對(duì)應(yīng)類別號(hào)下的 所有虛擬節(jié)點(diǎn)編號(hào)。在初始化時(shí),Lists中存儲(chǔ)虛擬節(jié)點(diǎn)編號(hào)0、1、2、…、n-l (表示初始時(shí)所 有虛擬節(jié)點(diǎn)都屬于類別9),其他9個(gè)鏈表均初始化為空表。
[0018] 虛擬節(jié)點(diǎn)的組別數(shù)。對(duì)虛擬節(jié)點(diǎn)進(jìn)行分組的原則是:保證每個(gè)分組中虛擬節(jié)點(diǎn)所 屬的類別盡可能最多,同時(shí)每個(gè)類別在所有分組中只能出現(xiàn)一次。虛擬節(jié)點(diǎn)的組別數(shù)gn表 示所有虛擬節(jié)點(diǎn)的當(dāng)前分組總數(shù),在初始時(shí)其值設(shè)為0,表示初始時(shí)尚未進(jìn)行虛擬節(jié)點(diǎn)分 組。當(dāng)前的所有即個(gè)組別記為分組0、分組1、…、分組即-1,并且用VNGo、VNGi、…、VNGgn-i表示 屬于運(yùn)些分組的虛擬節(jié)點(diǎn)編號(hào)集合(集合中元素是虛擬節(jié)點(diǎn)的編號(hào))。
[0019] 虛擬節(jié)點(diǎn)所屬組別號(hào)。用長(zhǎng)度為η的數(shù)組Vnode_map記錄各虛擬節(jié)點(diǎn)所屬的組別 號(hào),化ode_map[i]代表編號(hào)為i的虛擬節(jié)點(diǎn)所屬的組別號(hào)。該數(shù)組在初始化時(shí)將所有元素置 為-1。
[0020] 第二,判別對(duì)虛擬節(jié)點(diǎn)進(jìn)行分組的時(shí)間點(diǎn)。存儲(chǔ)系統(tǒng)并不需要一開始就對(duì)虛擬節(jié) 點(diǎn)進(jìn)行分組,因?yàn)樵诔跏紶顟B(tài)時(shí)虛擬節(jié)點(diǎn)的相對(duì)空閑度都為100%,此時(shí)可認(rèn)為虛擬節(jié)點(diǎn)的 負(fù)載量是均衡的(所有虛擬節(jié)點(diǎn)的負(fù)載量都為0)。隨著存儲(chǔ)對(duì)象的不斷增加,虛擬節(jié)點(diǎn)的相 對(duì)空閑度會(huì)逐漸發(fā)生變化,為了使多個(gè)虛擬節(jié)點(diǎn)實(shí)現(xiàn)負(fù)載均衡,需要在一定條件下對(duì)虛擬 節(jié)點(diǎn)進(jìn)行分組。確定虛擬節(jié)點(diǎn)分組時(shí)間點(diǎn)的標(biāo)準(zhǔn)是:保證每個(gè)分組至少包含兩種類別的虛 擬節(jié)點(diǎn),并且在同一分組中屬于一種類別的虛擬節(jié)點(diǎn)只有1個(gè)。
[0021] 在系統(tǒng)開始運(yùn)行后的短期內(nèi),所有虛擬節(jié)點(diǎn)的相對(duì)空閑度值將集中在子區(qū)間 (90%,100% ],即所有虛擬節(jié)點(diǎn)都屬于類別9,此時(shí)也不滿足虛擬節(jié)點(diǎn)分組時(shí)間點(diǎn)的鑒別標(biāo) 準(zhǔn)。所W,對(duì)虛擬節(jié)點(diǎn)進(jìn)行分組只會(huì)發(fā)生在系統(tǒng)運(yùn)行一段時(shí)間之后,具體采用如下方法判別 對(duì)虛擬節(jié)點(diǎn)進(jìn)行分組的合理時(shí)間點(diǎn):
[0022] (21)創(chuàng)建與化〇(16_(3〇11]113_67_4巧相同的數(shù)組化〇(16_(3〇11]113_67_4巧_64,將當(dāng)前 化 ode_counts_by_key 中的值復(fù)制到化 ode_counts_by_key_bk 中。
[0023] (22)遍歷數(shù)組¥]1〇(16_(3〇11]113_67_467_化,選出非零的最小值1;[]1_(3〇11]11:,然后將 化ode_counts_by_key_bk中所有非零元素都減去Min_count。
[0024] (23)若此時(shí)數(shù)組所有元素都為0,則返回化ue,結(jié)束;若此時(shí)數(shù)組只有一個(gè)元素不