曹衛(wèi)東,孫曉君,周 原,王 靜
(1.中國(guó)民航大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院, 天津 300300; 2.中國(guó)民航大學(xué) 天津市智能信號(hào)與圖像處理重點(diǎn)實(shí)驗(yàn)室,天津 300300)
逐年增長(zhǎng)的航空旅客運(yùn)輸量產(chǎn)生大量的訂票需求,新一代旅客服務(wù)系統(tǒng)(passenger service system,PSS)等大規(guī)模分布式集群系統(tǒng)能夠共同分擔(dān)海量用戶請(qǐng)求,其上部署的負(fù)載均衡算法可以提供一種有效透明的方法,提高集群系統(tǒng)中服務(wù)器的帶寬、吞吐量、數(shù)據(jù)處理能力等[1]。
民航業(yè)一直在積極建設(shè)新一代PSS,JCF(java core framework)中間件平臺(tái)是Java環(huán)境后臺(tái)交易平臺(tái),也是新一代PSS的核心模塊之一。在JCF中間件平臺(tái)上,由于系統(tǒng)結(jié)構(gòu)和業(yè)務(wù)需求原因,部分服務(wù)的上下文環(huán)境被存儲(chǔ)在處理該服務(wù)請(qǐng)求的服務(wù)器上,不被其它服務(wù)器共享,而在處理同一個(gè)用戶后續(xù)請(qǐng)求過(guò)程中需要用到這些環(huán)境,此外在處理同一個(gè)用戶的后續(xù)請(qǐng)求時(shí),需要用到前面請(qǐng)求的處理結(jié)果,所以該類用戶請(qǐng)求需分配到同一服務(wù)器上按時(shí)間順序進(jìn)行處理,稱之為服務(wù)的親和性。
若服務(wù)的親和性無(wú)法滿足,會(huì)出現(xiàn)用戶請(qǐng)求分配不合理、請(qǐng)求無(wú)法響應(yīng)等問(wèn)題。因此,本文在研究JCF平臺(tái)負(fù)載均衡機(jī)制及多種負(fù)載均衡算法基礎(chǔ)上,提出一種親和性動(dòng)態(tài)負(fù)載均衡算法,算法提取用戶標(biāo)識(shí)信息作為哈希映射鍵值,并使不同用戶請(qǐng)求均勻分布,保證了服務(wù)的親和性、系統(tǒng)負(fù)載均衡性能和穩(wěn)定性。
負(fù)載均衡的主要功能是縮短請(qǐng)求響應(yīng)時(shí)間以及能夠動(dòng)態(tài)適應(yīng)集群中單個(gè)服務(wù)器狀態(tài)的變化。早期的負(fù)載均衡算法較簡(jiǎn)單考慮因素較少,隨著研究的深入,提出一些適用于不同場(chǎng)景的算法[2]。從民航業(yè)務(wù)服務(wù)的親和性角度,按照用戶請(qǐng)求分配方式,對(duì)已有算法進(jìn)行了如下分析和總結(jié)。
一類是以輪詢機(jī)制分配請(qǐng)求。將用戶的請(qǐng)求依次分配給集群系統(tǒng)中的服務(wù)節(jié)點(diǎn),循環(huán)往復(fù),如輪詢算法[3]。在其基礎(chǔ)上,通過(guò)為服務(wù)器分配比例因子或權(quán)值的方式,調(diào)配服務(wù)器接受請(qǐng)求的比例,如固定比例因子算法[4]、加權(quán)輪詢算法[5]。另一類是按照特定規(guī)則分配請(qǐng)求。例如,文獻(xiàn)[6]提出最小未完成交易數(shù)算法,選擇當(dāng)前未完成交易數(shù)最小的服務(wù)器分配用戶請(qǐng)求;文獻(xiàn)[7]提出改進(jìn)的動(dòng)態(tài)告警負(fù)載均衡算法,綜合考慮請(qǐng)求類型、節(jié)點(diǎn)工作能力和實(shí)時(shí)負(fù)載值,再確定轉(zhuǎn)發(fā)的目標(biāo)服務(wù)器;文獻(xiàn)[8]提出基于空間填充曲線的動(dòng)態(tài)負(fù)載均衡算法,使均衡器根據(jù)實(shí)時(shí)收集的各項(xiàng)負(fù)載指標(biāo)快速定位到最優(yōu)編碼的服務(wù)器;文獻(xiàn)[9]提出一種數(shù)據(jù)段交換算法,將內(nèi)存帶寬負(fù)載不均衡服務(wù)器上的數(shù)據(jù)段進(jìn)行相互交換,使集群的帶寬負(fù)載達(dá)到均衡。
以上多種負(fù)載均衡算法,對(duì)于來(lái)自同一用戶的連續(xù)請(qǐng)求,可能會(huì)被分配到不同的服務(wù)器上,不能有效滿足服務(wù)的親和性需求。結(jié)合民航業(yè)務(wù)服務(wù)的親和性以及負(fù)載均衡需求,本文設(shè)計(jì)了一種親和性動(dòng)態(tài)負(fù)載均衡算法。
為了使集群系統(tǒng)在進(jìn)行用戶請(qǐng)求分配過(guò)程中,滿足服務(wù)的親和性需求。面向JCF中間件平臺(tái),提出了一種親和性動(dòng)態(tài)負(fù)載均衡算法,該算法在進(jìn)行用戶請(qǐng)求分配過(guò)程中,優(yōu)先滿足服務(wù)的親和性需求,其次通過(guò)引入虛擬節(jié)點(diǎn),有效保證了集群系統(tǒng)負(fù)載均衡性能,并結(jié)合實(shí)際應(yīng)用情景,設(shè)計(jì)集群規(guī)模動(dòng)態(tài)調(diào)整策略。
JCF中間件平臺(tái)位于服務(wù)管理平臺(tái)和新一代PSS核心組件之間,Java語(yǔ)言編寫的各種應(yīng)用可以部署到JCF中間件平臺(tái)上運(yùn)行。基于該平臺(tái)可以實(shí)現(xiàn)不同系統(tǒng)之間的信息交換,并最終達(dá)到資源實(shí)時(shí)調(diào)度。JCF架構(gòu)中的分布式運(yùn)行系統(tǒng)是由多個(gè)服務(wù)器組成的分布式環(huán)境,允許通過(guò)擴(kuò)展服務(wù)器個(gè)數(shù)進(jìn)行集群規(guī)模擴(kuò)展,在進(jìn)行調(diào)用分布部署的服務(wù)時(shí)提供負(fù)載均衡功能[10-12]。JCF負(fù)載均衡功能模型如圖1所示,用戶的各類服務(wù)請(qǐng)求通過(guò)TSI(travelsky service integration)總線接入到內(nèi)部集群系統(tǒng),再分發(fā)到相應(yīng)的集群中。
圖1 JCF負(fù)載均衡功能模型
親和性動(dòng)態(tài)負(fù)載均衡算法基于帶有虛擬節(jié)點(diǎn)的一致性哈希算法,其基本原理如下:首先根據(jù)鍵值的比特?cái)?shù)N(一般取N=32)可以得到一個(gè)0~232-1的哈希環(huán);接著定義虛擬節(jié)點(diǎn)個(gè)數(shù),一個(gè)實(shí)際服務(wù)器節(jié)點(diǎn)對(duì)應(yīng)若干個(gè)虛擬節(jié)點(diǎn);再計(jì)算虛擬節(jié)點(diǎn)的哈希值,映射到哈希環(huán)上;然后計(jì)算用戶請(qǐng)求的哈希值再映射到環(huán)上,按順時(shí)針映射到距離其最近的虛擬節(jié)點(diǎn),該虛擬節(jié)點(diǎn)所對(duì)應(yīng)的實(shí)際服務(wù)器節(jié)點(diǎn),即為該用戶請(qǐng)求的實(shí)際處理節(jié)點(diǎn)。
本文在處理用戶請(qǐng)求時(shí),對(duì)用戶請(qǐng)求的頭部攜帶的具體標(biāo)識(shí),進(jìn)行信息提取和轉(zhuǎn)化得到用戶標(biāo)識(shí)信息,作為哈希函數(shù)的輸入。由于民航系統(tǒng)實(shí)際應(yīng)用中,同一航空公司的用戶請(qǐng)求的標(biāo)識(shí)是固定的,哈希環(huán)上的服務(wù)器節(jié)點(diǎn)也固定,因此,同一個(gè)用戶請(qǐng)求的鍵值映射到哈希環(huán)上以后,會(huì)映射到相同的服務(wù)器節(jié)點(diǎn),以此保證服務(wù)的親和性。
本文算法引入虛擬節(jié)點(diǎn)機(jī)制,并使用運(yùn)算性能高、碰撞率低和隨機(jī)分布特征更良好的MurmurHash3算法進(jìn)行具體哈希值計(jì)算??梢允沟霉-h(huán)上更加均勻的分布更多的虛擬節(jié)點(diǎn),用戶請(qǐng)求將更加均勻的映射到每一個(gè)實(shí)際服務(wù)器節(jié)點(diǎn)上,這樣可以有效減少服務(wù)器過(guò)載和輕載問(wèn)題出現(xiàn)。保證集群系統(tǒng)的負(fù)載均衡性能。
算法如圖2所示,實(shí)際服務(wù)器節(jié)點(diǎn)Server A對(duì)應(yīng)圖中Server A1和Server A2兩個(gè)虛擬節(jié)點(diǎn),實(shí)際服務(wù)器節(jié)點(diǎn)Server B對(duì)應(yīng)圖中Server B1和Server B2兩個(gè)虛擬節(jié)點(diǎn),req1通過(guò)哈希函數(shù)計(jì)算得到key1,并順時(shí)針映射到距離其最近的虛擬節(jié)點(diǎn)Server A2上,根據(jù)對(duì)應(yīng)關(guān)系,最終分配到Server A處理,req2、req3、req4同理,根據(jù)算法映射到各個(gè)節(jié)點(diǎn)進(jìn)行處理。
圖2 算法
算法流程如圖3所示。
首先定義虛擬節(jié)點(diǎn)數(shù)量記為VNN,將實(shí)際服務(wù)器節(jié)點(diǎn)
圖3 算法流程
與虛擬節(jié)點(diǎn)進(jìn)行映射,即一個(gè)實(shí)際服務(wù)器節(jié)點(diǎn)對(duì)應(yīng)VNN個(gè)虛擬節(jié)點(diǎn)
(1)
其中,N為當(dāng)前集群中實(shí)際服務(wù)器節(jié)點(diǎn)總數(shù),k為常數(shù),W為整個(gè)集群的權(quán)重之和,wi為第i個(gè)服務(wù)器的權(quán)重。
(1)根據(jù)式(1)計(jì)算出虛擬節(jié)點(diǎn)個(gè)數(shù),對(duì)于每個(gè)虛擬節(jié)點(diǎn)其編號(hào)Virtual_Nodeit,(1≤i≤N),(1≤t≤VNN),表示第i個(gè)實(shí)際服務(wù)器節(jié)點(diǎn)對(duì)應(yīng)的第t個(gè)虛擬節(jié)點(diǎn);
(2)建立虛擬節(jié)點(diǎn)和實(shí)際服務(wù)器節(jié)點(diǎn)之間的對(duì)應(yīng)關(guān)系,一個(gè)實(shí)際服務(wù)器節(jié)點(diǎn)對(duì)應(yīng)VNN個(gè)虛擬節(jié)點(diǎn);
(3)計(jì)算實(shí)際服務(wù)器節(jié)點(diǎn)的哈希值。在JCF中間件平臺(tái)的服務(wù)庫(kù)中,每個(gè)服務(wù)器注冊(cè)一個(gè)元數(shù)據(jù)表,根據(jù)表中服務(wù)器節(jié)點(diǎn)配置的server_name,通過(guò)MurmurHash3算法計(jì)算得到每個(gè)服務(wù)器節(jié)點(diǎn)的哈希值Node_hashi,(1≤i≤N);
(4)計(jì)算虛擬節(jié)點(diǎn)的哈希值。對(duì)于某個(gè)虛擬節(jié)點(diǎn),將Node_hashi加Virtual_Nodeit的值作為MurmurHash3算法輸入,計(jì)算得到每個(gè)虛擬節(jié)點(diǎn)的哈希值,記為Virtual_Node_hashit,(1≤i≤N),(1≤t≤VNN),表示第i個(gè)實(shí)際服務(wù)器節(jié)點(diǎn)對(duì)應(yīng)的第t個(gè)虛擬節(jié)點(diǎn)的哈希值;
(5)根據(jù)Virtual_Node_hashit的值將虛擬節(jié)點(diǎn)映射到環(huán)上;
(6)用戶請(qǐng)求的處理。用戶根據(jù)設(shè)定規(guī)則設(shè)置請(qǐng)求內(nèi)容,算法解析用戶發(fā)送的http請(qǐng)求,從用戶請(qǐng)求的消息頭headers中獲取請(qǐng)求頭部的host值,若值的類型為字符串,首先要應(yīng)用函數(shù)將字符串類型數(shù)據(jù)轉(zhuǎn)換成整形數(shù)據(jù)。使用Fowler-NOll-Vo函數(shù)完成這個(gè)目的
keyuser=Fowler-NOLL-Vo(host)
(2)
(7)計(jì)算用戶請(qǐng)求的哈希值,根據(jù)keyuser通過(guò)MurmurHash3算法計(jì)算用戶請(qǐng)求的哈希值User_hash;
(8)處理用戶請(qǐng)求,將User_hash映射到環(huán)上,按順時(shí)針?lè)较蛴成涞骄嚯x最近的虛擬節(jié)點(diǎn)上,根據(jù)實(shí)際服務(wù)器節(jié)點(diǎn)和虛擬節(jié)點(diǎn)的對(duì)應(yīng)關(guān)系,該請(qǐng)求實(shí)際是映射到對(duì)應(yīng)的實(shí)際服務(wù)器節(jié)點(diǎn)上去處理;
(9)當(dāng)有新的請(qǐng)求發(fā)送到集群時(shí),重復(fù)(6)~(8)步。
在實(shí)際的使用中,集群中能夠正常提供服務(wù)的服務(wù)器的個(gè)數(shù)可能會(huì)發(fā)生變化。分為以下兩類情況:當(dāng)業(yè)務(wù)量增加,需要增加新的服務(wù)器以滿足新的業(yè)務(wù)需求,或者已宕機(jī)服務(wù)器經(jīng)過(guò)維護(hù)重新投入使用,會(huì)造成集群規(guī)模擴(kuò)展。另外,由于服務(wù)器性能下降,負(fù)載量長(zhǎng)時(shí)間過(guò)大,運(yùn)行的程序出現(xiàn)死循環(huán),線路或者服務(wù)器發(fā)生物理故障時(shí),會(huì)造成集群規(guī)??s減。
當(dāng)集群規(guī)模發(fā)生動(dòng)態(tài)變化時(shí),需要對(duì)服務(wù)請(qǐng)求做平滑處理,保證集群負(fù)載均衡的同時(shí),最大程度減少受影響的用戶個(gè)數(shù),保證絕大部分用戶服務(wù)的親和性能夠得到滿足,保證系統(tǒng)的穩(wěn)定性。本文算法針對(duì)集群規(guī)模變化,設(shè)計(jì)了如下動(dòng)態(tài)調(diào)整策略:
(1)集群規(guī)模擴(kuò)展。當(dāng)需要增加服務(wù)器時(shí),首先將服務(wù)器信息添加到服務(wù)庫(kù)中。再根據(jù)規(guī)則生成新的服務(wù)器節(jié)點(diǎn)的虛擬節(jié)點(diǎn),并映射到環(huán)上。服務(wù)請(qǐng)求根據(jù)規(guī)則映射到新服務(wù)器上進(jìn)行處理。
如圖4所示,原先集群系統(tǒng)中有服務(wù)器Server A、Server B、Server C,req1映射到Server A處理,req4映射到Server B處理,req2和req3映射到Server C處理,當(dāng)集群中增加一個(gè)服務(wù)器Server D后,此時(shí)req2順時(shí)針尋找到距離其最近的服務(wù)器節(jié)點(diǎn)為Server D,則req2映射到Ser-ver D處理。其余用戶請(qǐng)求不受影響。
圖4 增加Server D節(jié)點(diǎn)
(2)集群規(guī)??s減。當(dāng)需要?jiǎng)h除服務(wù)器時(shí),將服務(wù)器從服務(wù)庫(kù)中刪除,并從環(huán)中刪除該服務(wù)器的所有虛擬節(jié)點(diǎn)映射,原來(lái)發(fā)送到該服務(wù)器上的用戶請(qǐng)求,沿順時(shí)針再繼續(xù)尋找離自己最近的服務(wù)器作為新的服務(wù)器節(jié)點(diǎn),由新的服務(wù)器節(jié)點(diǎn)處理請(qǐng)求。
圖5中顯示集群中原先有4個(gè)服務(wù)器,請(qǐng)求映射情況為req1映射到Server A,req2映射到Server D,req3 映 射 到Server C,req4映射到Server B,此時(shí)Server B發(fā)生故障,req4按順時(shí)針?lè)较蛴成涞脚c其距離最近的Server D,其它請(qǐng)求映射關(guān)系不變。
圖5 刪除Server B節(jié)點(diǎn)
如圖4、圖5所示,當(dāng)增加服務(wù)器ServerD和刪除服務(wù)器ServerB后,重分布的用戶分別為req2和req4,環(huán)上其余用戶不受影響。由此表明,當(dāng)集群規(guī)模發(fā)生動(dòng)態(tài)變化時(shí),受影響的用戶僅包括,從變化服務(wù)器逆時(shí)針到距離其最近的服務(wù)器節(jié)點(diǎn)之間這一段哈希環(huán)上的用戶,其余用戶不受影響,這保證了絕大部分用戶服務(wù)的親和性,避免了大部分用戶重分布帶來(lái)的損失。當(dāng)服務(wù)器減少時(shí),集群系統(tǒng)的負(fù)載均衡性能相對(duì)減弱,使得部分服務(wù)器負(fù)載增大。但從總體上來(lái)看,由于動(dòng)態(tài)調(diào)整策略的存在,服務(wù)的親和性受影響的用戶較少,且受影響的用戶能夠得到及時(shí)有效的調(diào)整,集群系統(tǒng)的負(fù)載均衡性能受到的沖擊較小,系統(tǒng)相對(duì)穩(wěn)定。
實(shí)驗(yàn)?zāi)MJCF中間件平臺(tái),搭建了一套仿真實(shí)驗(yàn)環(huán)境,由7臺(tái)Dell服務(wù)器組成一個(gè)小型集群系統(tǒng)。其中一臺(tái)作為服務(wù)庫(kù),一臺(tái)作為適配器,其它作為處理用戶請(qǐng)求的目標(biāo)服務(wù)器,服務(wù)器的配置為:CPU型號(hào):Intel(R) Core 2 Duo E7500;CPU內(nèi)核:2 core;RAM:6 GB,硬盤:300 G;操作系統(tǒng):Ubuntu 14.04;運(yùn)行環(huán)境Myeclipse,jdk1.8,相關(guān)軟件:Apache JMeter。
服務(wù)庫(kù)上安裝服務(wù)注冊(cè)表,包含各臺(tái)服務(wù)器節(jié)點(diǎn)的信息,適配器上安裝Nginx反向代理服務(wù)器,為了進(jìn)行算法對(duì)比,在Nginx反向代理服務(wù)器上部署了4種算法,分別為固定比例因子算法、最小未完成交易數(shù)算法、輪詢算法和本文算法,其中固定比例因子算法和最小未完成交易數(shù)算法為JCF平臺(tái)上原有算法。
實(shí)驗(yàn)中使用Apache JMeter軟件,構(gòu)造大量的http請(qǐng)求,在一定的時(shí)間周期內(nèi)發(fā)送到適配器上,適配器根據(jù)當(dāng)前配置的負(fù)載均衡算法,將請(qǐng)求轉(zhuǎn)發(fā)給后端服務(wù)器。
根據(jù)本文算法的特點(diǎn),并且結(jié)合實(shí)際的應(yīng)用需求,本文實(shí)驗(yàn)場(chǎng)景分為4個(gè)部分:
(1)場(chǎng)景一:系統(tǒng)處于穩(wěn)定狀態(tài),集群中有4個(gè)服務(wù)器處理用戶請(qǐng)求,使用Apache JMeter構(gòu)造大量用戶請(qǐng)求,在一定的時(shí)間周期內(nèi),發(fā)送到集群系統(tǒng),通過(guò)適配器上部署的4種不同的負(fù)載均衡算法,分配到服務(wù)器上去處理。觀察實(shí)驗(yàn)結(jié)果,統(tǒng)計(jì)實(shí)驗(yàn)數(shù)據(jù),計(jì)算4種算法的親和率。
親和率計(jì)算方法如下,在一個(gè)實(shí)驗(yàn)時(shí)間周期內(nèi),一共有num個(gè)用戶訪問(wèn)了集群系統(tǒng),第i個(gè)用戶共發(fā)送NRi(1≤i≤N)個(gè)連續(xù)請(qǐng)求,記該用戶首次映射的服務(wù)器為目標(biāo)服務(wù)器,則第i個(gè)用戶的所有連續(xù)請(qǐng)求命中目標(biāo)服務(wù)器的總次數(shù)記為NOi(1≤i≤N),則第i個(gè)用戶命中目標(biāo)服務(wù)器的命中率記為Hi
(3)
則整個(gè)集群系統(tǒng)的親和率記為A
(4)
式(4)表示,在一個(gè)實(shí)驗(yàn)時(shí)間周期內(nèi),所有訪問(wèn)該集群系統(tǒng)的用戶,命中目標(biāo)服務(wù)器的命中率之和,取其平均數(shù),即為該集群系統(tǒng)的親和率。
在配置了負(fù)載均衡算法的集群系統(tǒng)中,親和率為所有用戶的連續(xù)請(qǐng)求發(fā)送到其目標(biāo)服務(wù)器次數(shù)占其發(fā)送請(qǐng)求總次數(shù)的比率。親和率越高,即表示越多的用戶連續(xù)請(qǐng)求被分配到相同服務(wù)器處理,則更加滿足服務(wù)的親和性需求。通過(guò)親和率的大小,可以觀察當(dāng)前集群系統(tǒng)在滿足服務(wù)的親和性方面的表現(xiàn)。
如圖6所示為在不同用戶請(qǐng)求總數(shù)情況下,4種算法的親和率。系統(tǒng)的親和率隨著請(qǐng)求數(shù)量的增加基本處于穩(wěn)定狀態(tài),對(duì)于固定比例因子算法、輪詢算法和最小未完成交易數(shù)算法,當(dāng)請(qǐng)求總數(shù)為200時(shí),親和率分別為23.5%、26.5%和25.5%;當(dāng)請(qǐng)求總數(shù)為800時(shí),親和率分別為26.6%、23.4%和22.6%;當(dāng)請(qǐng)求總數(shù)為2000時(shí),親和率分別為25.3%、26.2%和26.6%;實(shí)驗(yàn)結(jié)果表明,以上3種算法的親和率基本穩(wěn)定在24%、25%和25%左右。本文算法的親和率在不同請(qǐng)求總數(shù)情況下均為99%。對(duì)比實(shí)驗(yàn)結(jié)果表明,本文算法的親和率比其它3種算法的親和率高很多,這表示本文算法能夠?qū)⒔^大部分的用戶連續(xù)請(qǐng)求發(fā)送到目標(biāo)服務(wù)器上去處理,有效滿足服務(wù)的親和性需求。
圖6 4種算法的親和率
(2)場(chǎng)景二:系統(tǒng)處于穩(wěn)定狀態(tài),集群中有4個(gè)服務(wù)器處理用戶請(qǐng)求,使用Apache JMeter構(gòu)造大量用戶請(qǐng)求,在一定時(shí)間周期內(nèi),發(fā)送到集群系統(tǒng),模擬不同的請(qǐng)求并發(fā)數(shù),并發(fā)數(shù)由少至多。統(tǒng)計(jì)請(qǐng)求總響應(yīng)時(shí)間和系統(tǒng)吞吐量,請(qǐng)求總響應(yīng)時(shí)間為系統(tǒng)處理請(qǐng)求并響應(yīng)的總時(shí)間,系統(tǒng)吞吐量表示每秒完成的請(qǐng)求數(shù)。
如圖7所示,當(dāng)請(qǐng)求并發(fā)數(shù)遞增時(shí),固定比例因子算法的請(qǐng)求響應(yīng)時(shí)間從0.09 s增加到0.26 s;輪詢算法的請(qǐng)求響應(yīng)時(shí)間從0.076 s增加到0.275 s;最小未完成交易數(shù)算法的請(qǐng)求響應(yīng)時(shí)間從0.02 s增加到0.2 s;本文算法的請(qǐng)求相應(yīng)時(shí)間從0.02 s增加到0.18 s,4種算法的請(qǐng)求總響應(yīng)時(shí)間,隨著請(qǐng)求并發(fā)數(shù)的增加不斷增加,其中本文算法請(qǐng)求響應(yīng)時(shí)間相對(duì)較短。
圖7 4種算法的請(qǐng)求總響應(yīng)時(shí)間
這是由于固定比例因子算法、輪詢算法和最小未完成交易數(shù)算法,這3種算法的請(qǐng)求分配機(jī)制均不能保證連續(xù)請(qǐng)求被分配到同一服務(wù)器。由于此時(shí)未滿足服務(wù)的親和性,會(huì)導(dǎo)致該請(qǐng)求無(wú)法及時(shí)響應(yīng)或者無(wú)法響應(yīng),增加系統(tǒng)的請(qǐng)求總響應(yīng)時(shí)間。
本文算法在處理同一用戶的連續(xù)請(qǐng)求時(shí),由于標(biāo)識(shí)固定,會(huì)將這些連續(xù)請(qǐng)求發(fā)送到同一服務(wù)器的服務(wù)隊(duì)列中,按照時(shí)間順序處理,避免由于服務(wù)所需資源與服務(wù)器綁定,而導(dǎo)致的請(qǐng)求無(wú)法響應(yīng)問(wèn)題,同時(shí)減少由于后續(xù)請(qǐng)求需要前面請(qǐng)求處理結(jié)果的等待時(shí)間,因此使得服務(wù)的親和性得以保證,負(fù)載均衡情況下請(qǐng)求響應(yīng)時(shí)間相對(duì)較短。
如圖8所示,當(dāng)請(qǐng)求并發(fā)數(shù)為60 個(gè)/s時(shí),固定比例因子算法、輪詢算法、最小未完成交易數(shù)算法和本文算法的吞吐量分別為:36.2個(gè)/s、37.5個(gè)/s、38.3個(gè)/s、38.4個(gè)/s;當(dāng)請(qǐng)求并發(fā)數(shù)為500個(gè)/s時(shí),4種算法的吞吐量分別為:119.0個(gè)/s、101.6個(gè)/s、117.6個(gè)/s、118.1個(gè)/s。4種算法的系統(tǒng)吞吐量隨著請(qǐng)求并發(fā)數(shù)量的增多呈上升趨勢(shì),本文算法的系統(tǒng)吞吐量和其它算法的系統(tǒng)吞吐量接近,并發(fā)量高時(shí)略低于其它算法。
圖8 4種算法的吞吐量
這是由于當(dāng)多個(gè)用戶在一定時(shí)間周期內(nèi),發(fā)送來(lái)多個(gè)連續(xù)請(qǐng)求,并且這些用戶請(qǐng)求映射到相同的服務(wù)器上去處理,該服務(wù)器的處理壓力會(huì)增大,極端情況時(shí)服務(wù)器會(huì)由于過(guò)載而宕機(jī)。此時(shí),服務(wù)器處理能力會(huì)明顯降低,集群系統(tǒng)吞吐量相應(yīng)的會(huì)降低。
(3)場(chǎng)景三:集群系統(tǒng)規(guī)模擴(kuò)展,新增加一個(gè)服務(wù)器,先到服務(wù)注冊(cè)庫(kù)中注冊(cè),此時(shí)服務(wù)器總數(shù)增加至5臺(tái),適配器上部署本文算法,用戶請(qǐng)求的映射根據(jù)2.4節(jié)介紹的動(dòng)態(tài)調(diào)整策略變化。觀察同一類請(qǐng)求的分布情況,分析請(qǐng)求在系統(tǒng)規(guī)模擴(kuò)展情況下,多少用戶請(qǐng)求受到了影響,若在一個(gè)實(shí)驗(yàn)周期內(nèi),由于服務(wù)器增加,導(dǎo)致某一用戶請(qǐng)求需重映射到新的目標(biāo)服務(wù)器,則記變化一次,統(tǒng)計(jì)總的變化次數(shù)CT,記該周期內(nèi)所有用戶發(fā)送請(qǐng)求的總數(shù)為num_req,記系統(tǒng)的變化率為CR,則
(5)
(4)場(chǎng)景四:集群系統(tǒng)規(guī)??s減,模擬集群系統(tǒng)中有一臺(tái)服務(wù)器出現(xiàn)故障,從服務(wù)器注冊(cè)庫(kù)中刪除了一個(gè)服務(wù)器,服務(wù)器總數(shù)減少至3臺(tái),適配器上部署本文算法,用戶請(qǐng)求的映射根據(jù)2.4節(jié)介紹的動(dòng)態(tài)調(diào)整策略變化。觀察同一類請(qǐng)求分布情況,統(tǒng)計(jì)系統(tǒng)變化率。
場(chǎng)景三和場(chǎng)景四,分別模擬了給集群增加一個(gè)服務(wù)器和減少一個(gè)服務(wù)器的情況,并統(tǒng)計(jì)集群的變化率,實(shí)驗(yàn)結(jié)果見表1。
表1 變化率統(tǒng)計(jì)
兩種狀態(tài)下本文算法的變化率分別為21%和34%,即表明變化節(jié)點(diǎn)沿逆時(shí)針到距離其最近的服務(wù)器節(jié)點(diǎn)之間這一段哈希環(huán)上的用戶請(qǐng)求數(shù)占總請(qǐng)求數(shù)的21%和34%。這說(shuō)明分別有21%和34%的用戶的連續(xù)請(qǐng)求受到影響,并根據(jù)動(dòng)態(tài)調(diào)整策略重分布到新的服務(wù)器處理。實(shí)驗(yàn)結(jié)果表明,本文算法保證了絕大多數(shù)用戶的請(qǐng)求處理不受到集群系統(tǒng)規(guī)模變化的影響,避免了所有用戶重分布的情況發(fā)生,保證了絕大多數(shù)用戶服務(wù)的親和性。同時(shí)受影響的一部分用戶請(qǐng)求,能根據(jù)動(dòng)態(tài)調(diào)整策略重映射到新的服務(wù)器上處理,由于算法設(shè)置的虛擬節(jié)點(diǎn)在哈希環(huán)上分布較均勻,部分請(qǐng)求重映射不會(huì)造成某一服務(wù)器嚴(yán)重過(guò)載現(xiàn)象,對(duì)集群系統(tǒng)的負(fù)載均衡沖擊較小,保證了系統(tǒng)的穩(wěn)定性。
不同場(chǎng)景下的實(shí)驗(yàn)結(jié)果表明,本文提出的親和性動(dòng)態(tài)負(fù)載均衡算法,優(yōu)先保證服務(wù)的親和性,雖犧牲了一部分負(fù)載均衡性能,使得負(fù)載均衡效果沒(méi)有優(yōu)于其它算法,但是集群系統(tǒng)的負(fù)載均衡仍得以保證。根據(jù)實(shí)際生產(chǎn)需求,而設(shè)計(jì)的集群規(guī)模變化實(shí)驗(yàn)結(jié)果表明,系統(tǒng)的親和性和穩(wěn)定性均能夠得到保證。
為了解決民航業(yè)大規(guī)模分布式集群系統(tǒng)在進(jìn)行用戶請(qǐng)求負(fù)載分配過(guò)程中,出現(xiàn)服務(wù)的親和性和負(fù)載均衡問(wèn)題,分析了JCF中間件平臺(tái)上原有的負(fù)載均衡算法以及其它常見負(fù)載均衡算法的特點(diǎn),基于帶有虛擬節(jié)點(diǎn)的一致性哈希算法,提出一種親和性動(dòng)態(tài)負(fù)載均衡算法,通過(guò)設(shè)計(jì)對(duì)比實(shí)驗(yàn),驗(yàn)證了該算法能夠使得用戶請(qǐng)求得到合理的分配,滿足服務(wù)的親和性需求,同時(shí)具有負(fù)載均衡功能,并保證集群系統(tǒng)的穩(wěn)定性和可伸縮性。
但是,該算法還有許多不足,如何在此基礎(chǔ)上,進(jìn)一步提升算法的負(fù)載均衡效果,將是下一步重點(diǎn)研究?jī)?nèi)容。