摘 要:分析了幾種常用的動(dòng)態(tài)負(fù)載均衡算法的不足,并針對(duì)目前大多數(shù)主流J2EE應(yīng)用服務(wù)器的負(fù)載均衡并不具有動(dòng)態(tài)自適應(yīng)性的問題,利用開源JBoss服務(wù)器為開發(fā)平臺(tái),結(jié)合多種設(shè)計(jì)模式設(shè)計(jì)了一種動(dòng)態(tài)自適應(yīng)負(fù)載均衡服務(wù)模型,具體實(shí)現(xiàn)細(xì)節(jié)圍繞負(fù)載定義、負(fù)載收集以及均衡算法。提出了基于更新時(shí)間項(xiàng)的交替負(fù)載收集方式,并在此基礎(chǔ)上實(shí)現(xiàn)了一種基于前K子集相對(duì)負(fù)載均衡度的動(dòng)態(tài)自適應(yīng)算法。測(cè)試結(jié)果表明該算法能較好地均衡系統(tǒng)的負(fù)載。
關(guān)鍵詞:EJB集群;負(fù)載均衡;動(dòng)態(tài)自適應(yīng);負(fù)載指標(biāo);負(fù)載收集
中圖分類號(hào):TP311.5 文獻(xiàn)標(biāo)志碼:A
文章編號(hào):1001-3695(2008)07-2064-04
Design and implementation on selfadaptive dynamicload balance services in EJB cluster system
LIU Yong,WANG Lushan,GUO Gencheng
(College of Electronic Information Engineering, Henan University of Science Technology, Luoyang Henan 471003, China)
Abstract:This paper presented the deficiencies of several common dynamic load balance algorithms and many of the main J2EE(Java 2 enterprise edition)application servers hadn’t selfadaptive dynamic load balance. Using the Open Source JBoss as the developing platform and some of design pattems, this paper designed a model of selfadaptive dynamic load balance services.Centring on load indexes, load collection and balance algorithms, this paper came up with a new idea of alternating load collection based on update_time attribute, and realized a selfadaptive dynamic algorithm of relative load balance degree based on first K subset. The test results show this algorithm can balance the system loads betterly.
Key words:EJB clustering;load balance;selfadaptive dynamic;load indexes;load collection
負(fù)載均衡服務(wù)是解決網(wǎng)絡(luò)擁塞和服務(wù)超載的重要途徑,影響因素諸多,很多論文都對(duì)其作出了相應(yīng)的討論,文獻(xiàn)[1~3]對(duì)負(fù)載指標(biāo)的定義進(jìn)行了研究,指明了負(fù)載指標(biāo)對(duì)負(fù)載均衡的重要意義;文獻(xiàn)[4]認(rèn)為動(dòng)態(tài)負(fù)載均衡的實(shí)際效果依賴于所選擇的負(fù)載分發(fā)策略、負(fù)載度量標(biāo)準(zhǔn)以及運(yùn)行時(shí)數(shù)據(jù)的獲取;文獻(xiàn)[5]從算法、網(wǎng)絡(luò)拓?fù)湟约熬饬6热矫娣治鰧?duì)動(dòng)態(tài)負(fù)載均衡的影響;文獻(xiàn)[6]對(duì)基于各種負(fù)載指標(biāo)的調(diào)度策略進(jìn)行性能對(duì)比,得出負(fù)載指標(biāo)的選擇和負(fù)載反饋的頻率對(duì)性能有很大影響等。
目前負(fù)載均衡算法已得到了廣泛的研究,分為靜態(tài)算法和動(dòng)態(tài)算法與靜態(tài)算法相比,動(dòng)態(tài)算法根據(jù)系統(tǒng)運(yùn)行時(shí)各個(gè)服務(wù)器負(fù)載狀態(tài)信息進(jìn)行動(dòng)態(tài)負(fù)載分配決策。研究表明,大多數(shù)情況下,動(dòng)態(tài)算法比靜態(tài)算法性能提高大約30%[7~9]。但大多數(shù)動(dòng)態(tài)算法是針對(duì)Web服務(wù)器集群,負(fù)載粒度粗,不支持組件(EJB)級(jí)細(xì)粒度的負(fù)載均衡。一些常用的動(dòng)態(tài)算法僅是考慮諸如服務(wù)器的請(qǐng)求連接數(shù)等,長(zhǎng)時(shí)間運(yùn)行后,效果不佳。
J2EE應(yīng)用服務(wù)器以其跨平臺(tái)、可移植等優(yōu)越性逐步在中間件市場(chǎng)上占據(jù)主導(dǎo)地位。與Web服務(wù)器集群不同,它是基于EJB組件的,負(fù)載粒度細(xì),體現(xiàn)了EJB組件的負(fù)載狀況。J2EE規(guī)范中尚未明確提出與負(fù)載均衡相關(guān)的公共服務(wù),不同的EJB服務(wù)器廠商對(duì)負(fù)載均衡的理解不同,實(shí)現(xiàn)方法也不同。另外,雖然大多數(shù)主流服務(wù)器聲稱實(shí)現(xiàn)了負(fù)載均衡服務(wù),但僅僅實(shí)現(xiàn)了幾種簡(jiǎn)單的靜態(tài)算法,如BEA Weblogic、開源JBoss等[10,11]僅支持RoundRobin、Weightbased、隨機(jī)等靜態(tài)算法。
本文給出了相關(guān)工作的背景和研究進(jìn)展,給出了一種動(dòng)態(tài)自適應(yīng)負(fù)載均衡服務(wù)模型的總體結(jié)構(gòu)描述,介紹了模型的具體實(shí)現(xiàn),對(duì)提出的動(dòng)態(tài)自適應(yīng)均衡算法,采用客戶端動(dòng)態(tài)代理技術(shù),在開源JBoss應(yīng)用服務(wù)器上實(shí)現(xiàn)。
1 相關(guān)工作
1.1 開源JBoss應(yīng)用服務(wù)器的JXM架構(gòu)及其特性
JMX作為一個(gè)為應(yīng)用管理植入管理功能的架構(gòu),是一個(gè)優(yōu)秀的軟件集成工具,它為集成模塊化、容器、嵌入式組件提供了通用的方法,為應(yīng)用服務(wù)器的發(fā)展起了重要的作用。開源JBoss應(yīng)用服務(wù)器遵循國(guó)際最新的J2EE規(guī)范,最大成功之處就在于引入了JMX微內(nèi)核技術(shù),實(shí)現(xiàn)了高標(biāo)準(zhǔn)的模塊化和插件式設(shè)計(jì)思想。與其他流行的應(yīng)用服務(wù)器軟件相比,JBoss具有開源、易安裝、占用系統(tǒng)資源小、啟動(dòng)時(shí)間快等特性,并被譽(yù)為最佳Java應(yīng)用服務(wù)器。無論是學(xué)習(xí)還是應(yīng)用,JBoss應(yīng)用服務(wù)器都為用戶提供了一個(gè)優(yōu)秀的平臺(tái)。
1.2 開源JBoss應(yīng)用服務(wù)器中的負(fù)載均衡機(jī)制
1)JBoss中的集群架構(gòu) JBoss應(yīng)用服務(wù)器集群使用JavaGroups作為底層的組通信基礎(chǔ)設(shè)施,提供了可靠有序的組通信、組成員管理以及組內(nèi)RPC等特性,實(shí)現(xiàn)了集群服務(wù)(ClusterPartitionMBean),它是所有Clustered services的基礎(chǔ)。另外JBoss應(yīng)用服務(wù)器的集群服務(wù)通過HAPartition架構(gòu)[10],提供了分布式復(fù)件管理、分布式狀態(tài)服務(wù)以及高可用會(huì)話狀態(tài)等服務(wù),為遠(yuǎn)程對(duì)象(EJB組件)提供負(fù)載均衡機(jī)制成為了可能,所有的Clustered services都應(yīng)在HAPartition中進(jìn)行注冊(cè)。本文設(shè)計(jì)實(shí)現(xiàn)的動(dòng)態(tài)自適應(yīng)負(fù)載均衡服務(wù)不僅與ClusterPartitionMBean有著依賴關(guān)系(圖1),而且也在HAPartition架構(gòu)中進(jìn)行注冊(cè)。
2)負(fù)載均衡點(diǎn) EJB集群的負(fù)載均衡策略可以發(fā)生在不同的位置,如客戶端代理、應(yīng)用服務(wù)器(HAJNDI命名服務(wù)器、EJB容器等)、硬件負(fù)載均衡器等。其中客戶代理維護(hù)了一組對(duì)象的引用,其內(nèi)封裝部署了相應(yīng)EJB或提供相應(yīng)服務(wù)(clustered services)的一組節(jié)點(diǎn)的地址,根據(jù)負(fù)載均衡算法選擇一個(gè)對(duì)象引用。與將應(yīng)用服務(wù)器或負(fù)載均衡器作為負(fù)載均衡策略發(fā)生的位置相比,采用客戶代理機(jī)制可以避免由負(fù)載均衡器作為轉(zhuǎn)發(fā)點(diǎn)引起的單點(diǎn)失效,同時(shí)也避免了由應(yīng)用服務(wù)器來管理負(fù)載均衡策略帶來的瓶頸問題。因此由客戶代理轉(zhuǎn)發(fā)請(qǐng)求成為J2EE平臺(tái)上最廣泛采用的實(shí)現(xiàn)機(jī)制。JBoss采用的就是基于客戶端代理的轉(zhuǎn)發(fā)機(jī)制。
3)JBoss中的負(fù)載均衡算法 JBoss應(yīng)用服務(wù)器實(shí)現(xiàn)的均衡算法有輪循(RoundRobin)算法、隨機(jī)(RandomRobin)算法、親和性(FirstAvailable)算法,在JBoss 4.x中引入了Proxy Family的概念,實(shí)現(xiàn)了FirstAvailableIdenticalAllProxies算法。這些算法都是簡(jiǎn)單的靜態(tài)算法,故此JBoss的負(fù)載均衡服務(wù)不能感知后端服務(wù)器的狀態(tài),不能根據(jù)系統(tǒng)負(fù)載信息進(jìn)行決策,而且沒有負(fù)載反饋,不具有自適應(yīng)控制能力[12]。總體來說負(fù)載均衡效率低。
1.3 常用動(dòng)態(tài)負(fù)載均衡算法
1)加權(quán)最少連接數(shù)(least connection) 設(shè)集群中節(jié)點(diǎn)服務(wù)器集合為S={S1,S2,…,Sn},W(Si)表示服務(wù)器Si的權(quán)值,C(Si)表示服務(wù)器Si的當(dāng)前連接度,所有服務(wù)器當(dāng)前的連接總數(shù)Csum=∑C(Si)(i=1,2,…,n),則按下式進(jìn)行選擇服務(wù)器k。其中:i=1,2,…,n;W(Sk)≠0。
[C(Sk)/Csum]/W(Sk)=minC(Si)/Csum/W(Si)
算法以連接數(shù)來衡量服務(wù)器負(fù)載,沒有考慮不同請(qǐng)求服務(wù)帶來的負(fù)載開銷差異,權(quán)重通常為靜態(tài)配置,不能很好地反映服務(wù)器運(yùn)行期的處理能力和EJB組件的運(yùn)行情況,在長(zhǎng)時(shí)間運(yùn)行下,導(dǎo)致負(fù)載的不均衡。
2)響應(yīng)速度(response time)算法 負(fù)載均衡器對(duì)集群服務(wù)器發(fā)出一個(gè)探測(cè)請(qǐng)求,根據(jù)各個(gè)服務(wù)器對(duì)探測(cè)請(qǐng)求的最快響應(yīng)時(shí)間進(jìn)行調(diào)度。僅僅是負(fù)載均衡器與服務(wù)器之間的最快響應(yīng)時(shí)間,不能體現(xiàn)客戶端與服務(wù)器端之間的響應(yīng)時(shí)間。
3)PickK算法 根據(jù)時(shí)間周期T更新集群服務(wù)器負(fù)載列表信息。當(dāng)請(qǐng)求到達(dá)時(shí),從N臺(tái)服務(wù)器中選擇任意的K臺(tái)服務(wù)器,根據(jù)負(fù)載列表比較它們的負(fù)載狀況,將請(qǐng)求發(fā)送給負(fù)載最小的服務(wù)器。算法不能保證選擇的K臺(tái)服務(wù)器是負(fù)載較輕者,有可能選擇的K臺(tái)服務(wù)器(部分或全部)正好是處于重負(fù)載情況。
4)基于負(fù)載遷移實(shí)現(xiàn)負(fù)載均衡的算法 通常將服務(wù)器劃分為輕載、重載和正常三種狀態(tài)。采用啟發(fā)策略尋找合適的節(jié)點(diǎn)進(jìn)行任務(wù)遷移,如西安交通大學(xué)提出的分組狀態(tài)驅(qū)動(dòng)自適應(yīng)算法。這類算法主要是通過負(fù)載遷移來實(shí)現(xiàn)均衡,計(jì)算量大,且移動(dòng)負(fù)載的收益有可能不能抵消通信、決策等產(chǎn)生的額外開銷,難免會(huì)產(chǎn)生進(jìn)行遷移后的響應(yīng)時(shí)間不能抵消負(fù)載遷移帶來的額外開銷問題,反而得不償失。
另外存在一些設(shè)計(jì)得非常復(fù)雜的均衡算法,但并不能得到很好的效果,因?yàn)橥ǔT綇?fù)雜的算法不僅帶來的計(jì)算開銷大,而且需要進(jìn)行大量的通信,使得性能提高大打折扣。
針對(duì)上述動(dòng)態(tài)負(fù)載均衡算法的不足,本文提出了一種基于前K子集的相對(duì)負(fù)載均衡度動(dòng)態(tài)自適應(yīng)算法。該算法在保證系統(tǒng)在長(zhǎng)時(shí)間運(yùn)行狀態(tài)下,各服務(wù)器的組件負(fù)載不發(fā)生較大的傾斜,以及能充分利用各個(gè)服務(wù)器處理能力的前提下,盡量減少負(fù)載計(jì)算以及通信帶來的額外開銷,并具有能根據(jù)系統(tǒng)運(yùn)行狀態(tài)自適應(yīng)調(diào)節(jié)服務(wù)器閾值的能力。
2 動(dòng)態(tài)自適應(yīng)性負(fù)載均衡服務(wù)模型設(shè)計(jì)
本模型設(shè)計(jì)是基于JBoss平臺(tái)及其JXM微內(nèi)核架構(gòu)開發(fā)的。根據(jù)JBoss服務(wù)器及EJB容器的模塊化、插件式設(shè)計(jì)結(jié)構(gòu)的特點(diǎn),將動(dòng)態(tài)自適應(yīng)負(fù)載均衡服務(wù)以管理構(gòu)件MBean的形式裝載到JBoss服務(wù)器,并與其他服務(wù)組件(如EJB容器組件、部署服務(wù)以及集群服務(wù)等)相互依賴。依賴關(guān)系如圖1所示。
為實(shí)現(xiàn)負(fù)載均衡服務(wù)的透明性,依據(jù)JBoss應(yīng)用服務(wù)器允許服務(wù)以攔截器(interceptor)的方式加入容器,模型采用interceptor設(shè)計(jì)模式[13]和component configurator設(shè)計(jì)模式[13]實(shí)現(xiàn)動(dòng)態(tài)自適應(yīng)負(fù)載均衡服務(wù)。模型分為三個(gè)功能,即負(fù)載收集(HALoadCollectionMBean)、負(fù)載分析(LoadAnalyzerMBean)和負(fù)載決策(LoadLocator)。其中負(fù)載收集和負(fù)載分析分別以可管理構(gòu)件MBean服務(wù)的形式注冊(cè)到MBeanServer中。當(dāng)EJB容器啟動(dòng)時(shí),同時(shí)啟動(dòng)它所依賴的負(fù)載均衡服務(wù)。另外負(fù)載收集服務(wù)作為Clustered services注冊(cè)在集群架構(gòu)HAPartition中,使得它能夠利用集群服務(wù)的功能,并通過在集群組內(nèi)發(fā)出組播,完成向本地和其他遠(yuǎn)程可用服務(wù)器負(fù)載收集的任務(wù)。當(dāng)EJB組件部署(deployment)時(shí),動(dòng)態(tài)自適應(yīng)負(fù)載均衡服務(wù)被component configurator設(shè)計(jì)模式在EJB配置文件中以攔截器的形式加載到EJB容器中,即component configurator(圖1中DeploymentMBean服務(wù))讀取EJB的配置文件,然后將load balancing interceptors(LoadLocator、LoadAnalyzer、HALoadColletion等)加載到EJB容器中。當(dāng)接收到函數(shù)調(diào)用事件時(shí),自動(dòng)地按照裝載順序觸發(fā)相應(yīng)的這些服務(wù)。當(dāng)Web應(yīng)用服務(wù)器在連接到客戶請(qǐng)求事件時(shí),EJB容器觸發(fā)攔截器鏈的調(diào)用。其中l(wèi)oad balancing interceptors透明地將請(qǐng)求轉(zhuǎn)發(fā)給各自相應(yīng)的負(fù)載均衡服務(wù),并將處理結(jié)果作為下一個(gè)攔截器的參數(shù)。LoadLocator首先判斷是否為本地調(diào)用優(yōu)先,若不是,則將負(fù)載分析結(jié)果以及負(fù)載均衡策略以例外形式返回給客戶端代理(smart stub采用客戶代理轉(zhuǎn)發(fā)機(jī)制),代理捕獲這個(gè)例外后,根據(jù)負(fù)載均衡算法以及候選列表重定向新的EJB服務(wù)器,最后完成EJB實(shí)例的方法;如果是,則返回調(diào)用結(jié)果時(shí)LoadLocator負(fù)責(zé)獲得當(dāng)前可用的集群視圖,并作為結(jié)果的一部分返回客戶。這樣的設(shè)計(jì)模式使得無須更改服務(wù)器代碼,負(fù)載均衡服務(wù)能夠透明地將客戶請(qǐng)求轉(zhuǎn)發(fā),運(yùn)行期間能動(dòng)態(tài)地、透明地添加攔截器。
動(dòng)態(tài)自適應(yīng)負(fù)載均衡服務(wù)模型設(shè)計(jì)的框架如圖2所示。
3 動(dòng)態(tài)負(fù)載均衡服務(wù)的實(shí)現(xiàn)
3.1 負(fù)載指標(biāo)的定義
要選擇一個(gè)負(fù)載指標(biāo),應(yīng)根據(jù)具體的應(yīng)用環(huán)境進(jìn)行多方面考慮:諸如選擇的負(fù)載指標(biāo)能否準(zhǔn)確地表達(dá)當(dāng)前節(jié)點(diǎn)的負(fù)載,以及收集、處理這些信息所增加的開銷等。本文根據(jù)EJB應(yīng)用集群的特點(diǎn),定義復(fù)合型負(fù)載指標(biāo)。首先為體現(xiàn)EJB組件的負(fù)載,通過定義的BeanState接口,實(shí)現(xiàn)對(duì)各種類型EJB組件生命周期各個(gè)階段負(fù)載量的檢測(cè),并將獲得的狀態(tài)信息作為有效的負(fù)載依據(jù)。因此對(duì)EJB組件的負(fù)載定義有如下兩個(gè)向量:
a)BeanCount(i)=[SL(i),SF(i),E(i),M(i)]。對(duì)于不同的應(yīng)用,不同類型的EJB使用情況不盡相同,即在EJB生命周期的各個(gè)階段,各個(gè)服務(wù)器實(shí)例上不同類型的EJB的創(chuàng)建、消亡、鈍化以及激活數(shù)量不同,因此定義了向量a)。其中的元素分別代表運(yùn)行時(shí)無狀態(tài)會(huì)話bean、有狀態(tài)會(huì)話bean、實(shí)體bean、消息驅(qū)動(dòng)bean在服務(wù)器i上的使用負(fù)載量。
b)BeanRight(i)=[k1,k2,k3,k4]。因?yàn)椴煌愋偷腅JB使用資源不同,如實(shí)體bean需要使用JDBC連接數(shù)據(jù)庫(kù)資源,相對(duì)于資源引用少的無狀態(tài)會(huì)話bean來說,它對(duì)系統(tǒng)的負(fù)載消耗大得多,所以引入向量b)。其中k1、k2、k3、k4分別代表服務(wù)器i對(duì)特定應(yīng)用下的無狀態(tài)會(huì)話bean、有狀態(tài)會(huì)話bean、實(shí)體bean、消息驅(qū)動(dòng)bean的負(fù)載權(quán)重。權(quán)重值與特定的應(yīng)用以及各個(gè)服務(wù)器的性能有關(guān)。本文利用component configuration模式,開發(fā)者可以根據(jù)具體情況在XML配置文件中設(shè)定權(quán)值,允許修正,增大了靈活性,而不是固化在代碼中。例如,向量BeanRight(i)=[1,1,2,0]表示在服務(wù)器i運(yùn)行的某一個(gè)應(yīng)用中,一個(gè)實(shí)體bean的調(diào)用開銷是一個(gè)會(huì)話bean調(diào)用開銷的2倍,向量中的0代表沒有用到消息bean。
由上述兩個(gè)向量可得服務(wù)器i上EJB組件的負(fù)載為BeanLoad(i)=BeanCount(i)* BeanRight(i)T。另外不能忽視服務(wù)器的JVM。其中JVM的堆內(nèi)存大小服務(wù)器性能調(diào)優(yōu)的重要指標(biāo),也作為本模型實(shí)現(xiàn)的負(fù)載指標(biāo)之一。則本文定義的負(fù)載為L(zhǎng)oad(i)=αBeanLoad(i)+βJVM(i)。其中α、β分別為權(quán)重(α>β)。將運(yùn)行時(shí)刻各種類型EJB組件的生命周期狀態(tài)作為負(fù)載指標(biāo)的內(nèi)容,更能體現(xiàn)EJB容器的負(fù)載情況,并結(jié)合JVM運(yùn)行時(shí)的狀態(tài),更能體現(xiàn)服務(wù)器的資源利用率。
3.2 基于更新時(shí)間項(xiàng)(update_time)負(fù)載信息交替收集方式
負(fù)載收集最重要的是試圖平衡收集系統(tǒng)負(fù)載信息的開銷(計(jì)算及通信開銷)和保持系統(tǒng)負(fù)載信息的精確度。本文對(duì)常見的三種收集方式的利弊進(jìn)行了分析。
1)周期性收集方式 其精確度以及通信開銷與時(shí)間周期T相關(guān),如T值越小,負(fù)載信息越精確,但相應(yīng)的通信開銷越大。另外,即使當(dāng)時(shí)不需要負(fù)載數(shù)據(jù),也要進(jìn)行信息收集。
2)請(qǐng)求到達(dá)收集方式 該方式的負(fù)載信息收集精確,當(dāng)請(qǐng)求到達(dá)率小時(shí),有利于減少消息通信的次數(shù),降低額外開銷,但當(dāng)請(qǐng)求率頻繁時(shí),則情況糟糕。另外延長(zhǎng)了請(qǐng)求的響應(yīng)時(shí)間。
3)狀態(tài)變化收集方式 能精確地反映實(shí)例的當(dāng)前負(fù)載值,但當(dāng)客戶請(qǐng)求的到達(dá)頻率小而服務(wù)器節(jié)點(diǎn)的負(fù)載變化頻率大時(shí),系統(tǒng)會(huì)產(chǎn)生大量額外的通信開銷,容易產(chǎn)生負(fù)載成群現(xiàn)象[14];另外,由于保持一個(gè)全局的狀態(tài)信息表是一個(gè)很大的開銷,在大型系統(tǒng)中實(shí)現(xiàn)并不現(xiàn)實(shí)。
文獻(xiàn)[6]的測(cè)試結(jié)果說明,負(fù)載反饋頻率不是越高越好,也不是越低越好,而是根據(jù)不同的策略在一個(gè)合適的點(diǎn)時(shí)表現(xiàn)更佳性能。所以,如何在減少系統(tǒng)開銷的同時(shí),又能得到精確的負(fù)載信息是本文的目標(biāo)。結(jié)合對(duì)上述收集方式的分析,筆者對(duì)時(shí)間周期和請(qǐng)求達(dá)到方式進(jìn)行改進(jìn),提出了一種基于更新時(shí)間項(xiàng)的交替收集方式:設(shè)時(shí)間周期為T,系數(shù)λ(0.5~0.8),current_time為當(dāng)前時(shí)間, update_time為上次服務(wù)器對(duì)全局進(jìn)行負(fù)載收集并對(duì)負(fù)載列表更新的時(shí)間,那么下次是否進(jìn)行全局負(fù)載收集根據(jù)時(shí)間條件來決定。分為如下兩種情況:
a)當(dāng)客戶請(qǐng)求到達(dá)某服務(wù)器時(shí),若current_timeupdate_time <λT,則不再進(jìn)行全局負(fù)載收集,返回的仍是上次的負(fù)載列表信息;否則向集群發(fā)出組播,進(jìn)行全局負(fù)載信息收集。
b)同時(shí)啟動(dòng)周期驅(qū)動(dòng)方式,每隔時(shí)間周期T向負(fù)載收集服務(wù)發(fā)出通知,此時(shí)也要對(duì)更新時(shí)間項(xiàng)進(jìn)行判斷:若current_timeupdate_time <T,即在T內(nèi)收集過負(fù)載信息則不再進(jìn)行收集(注意在current_timeupdate_time >T未必收集負(fù)載,要結(jié)合a)決定,參見表1)。這樣保證了在客戶請(qǐng)求頻繁的情況下,縮短了請(qǐng)求的響應(yīng)時(shí)間,減少了系統(tǒng)額外的通信開銷,設(shè)置λ的取值在一定程度上仍可保證負(fù)載收集的精確度(見表1中精確度的比較);在客戶請(qǐng)求頻率變小的情況下,主要靠時(shí)間周期進(jìn)行收集。由于在本改進(jìn)方案中時(shí)間周期的取值較大,減少了負(fù)載收集的次數(shù),在一定程度上避免了即使不需要負(fù)載數(shù)據(jù)也要進(jìn)行收集的情況,減少了通信開銷。表1是本方案、基于時(shí)間周期以及請(qǐng)求到達(dá)負(fù)載收集方式的負(fù)載收集情況的對(duì)比。
表1設(shè)在初始時(shí)刻λT,某接收到客戶請(qǐng)求的服務(wù)器進(jìn)行了一次全局負(fù)載收集,在(λT,2λT)時(shí)間段客戶請(qǐng)求頻繁,請(qǐng)求到達(dá)收集方式進(jìn)行的負(fù)載收集次數(shù)最多。雖然負(fù)載信息精確,但響應(yīng)時(shí)間慢。在極端情況下,服務(wù)器會(huì)產(chǎn)生瓶頸,性能嚴(yán)重降低。(2λT ,3T+λT)時(shí)間段,客戶請(qǐng)求頻率小,尤其在(2λT,3T)時(shí)間段內(nèi)沒有客戶請(qǐng)求的情況下,基于時(shí)間周期驅(qū)動(dòng)方式會(huì)進(jìn)行多次沒有必要的負(fù)載收集,在一定程度上影響了服務(wù)器的性能。從表中可以看出,本方案的負(fù)載信息收集的次數(shù)、響應(yīng)時(shí)間及精確度是請(qǐng)求到達(dá)驅(qū)動(dòng)和周期驅(qū)動(dòng)的折中。
3.3 一種基于前K子集相對(duì)均衡度的動(dòng)態(tài)自適應(yīng)負(fù)載均衡算法的實(shí)現(xiàn)
本文采用策略(strategy)設(shè)計(jì)模式[15]實(shí)現(xiàn)了動(dòng)態(tài)負(fù)載均衡算法可替換模型,定義了一個(gè)動(dòng)態(tài)負(fù)載均衡算法的通用接口DynamicLoadBalancePolicy。每個(gè)實(shí)現(xiàn)動(dòng)態(tài)負(fù)載均衡的算法都將實(shí)現(xiàn)該接口,使得可以根據(jù)具體應(yīng)用,用不同的負(fù)載分析技術(shù)和算法實(shí)現(xiàn),增加了靈活性。結(jié)構(gòu)如圖3所示。
圖3為一種基于前K子集相對(duì)均衡度(FirstKRelativeBalanceDegree)的動(dòng)態(tài)自適應(yīng)負(fù)載均衡算法實(shí)現(xiàn)了DynamicLoadBalancePolicy接口。算法描述如下:
設(shè)定每個(gè)服務(wù)器的正常負(fù)載值L(i)normal(即閾值),當(dāng)前的負(fù)載值L(i)current,節(jié)點(diǎn)i當(dāng)前負(fù)載相對(duì)于正常時(shí)負(fù)載的相對(duì)均衡度為E(i)=L(i)current/ L(i)normal。當(dāng)系統(tǒng)整體處于重載/輕載時(shí),各個(gè)服務(wù)器的重載/輕載度偏差度D(i)=1-E(i),當(dāng)前系統(tǒng)閾長(zhǎng)為α=ΣD(i)/N,并定義:
每個(gè)服務(wù)器節(jié)點(diǎn)都維持兩個(gè)列表(HashMap):重載節(jié)點(diǎn)列表HashMaph〈nodeName(i), E(i)〉和輕載節(jié)點(diǎn)列表HashMapl〈nodeName(i),E(i)〉。對(duì)兩個(gè)列表中的節(jié)點(diǎn)按照相對(duì)均衡度E(i)進(jìn)行優(yōu)先排序,E(i)值越低表明節(jié)點(diǎn)目前的負(fù)載越低,優(yōu)先級(jí)越高。每次選擇的不一定是節(jié)點(diǎn)負(fù)載最小者,而是從輕載列表中選擇前K個(gè)相對(duì)均衡度小的節(jié)點(diǎn)作為候選節(jié)點(diǎn)。在對(duì)候選節(jié)點(diǎn)選取時(shí)先判斷本地節(jié)點(diǎn)是否處于前K個(gè)節(jié)點(diǎn)之列,若是則設(shè)本地調(diào)用優(yōu)先,不再對(duì)候選節(jié)點(diǎn)進(jìn)行選擇;否則在這前K個(gè)候選節(jié)點(diǎn)中隨機(jī)選擇一個(gè)來處理當(dāng)前的請(qǐng)求。另外該算法會(huì)出現(xiàn)以下兩種情況:
a)若某時(shí)刻D(i)均小于0,即輕載節(jié)點(diǎn)列表為空,說明系統(tǒng)處于重載,則計(jì)算當(dāng)前系統(tǒng)閾長(zhǎng)α=ΣD(i)/N(<0),將每個(gè)服務(wù)器正常負(fù)載值設(shè)為(1-α)L(i)normal。
b)若某時(shí)刻D(i)均大于0,即重載節(jié)點(diǎn)列表為空,說明系統(tǒng)處于輕載,則計(jì)算當(dāng)前系統(tǒng)閾長(zhǎng)α=ΣD(i)/N(>0),將每個(gè)服務(wù)器正常負(fù)載值設(shè)為(1+α) L(i)normal。
α的值體現(xiàn)了系統(tǒng)輕重負(fù)載程度,通過動(dòng)態(tài)地調(diào)整系統(tǒng)閾長(zhǎng)以及各個(gè)服務(wù)器的閾值,使得負(fù)載均衡具有自適應(yīng)性,能更準(zhǔn)確地把握全局的負(fù)載情況。通過判斷本地節(jié)點(diǎn)是否處于前K個(gè)候選節(jié)點(diǎn),設(shè)置是否為本地優(yōu)先,以減少網(wǎng)絡(luò)傳輸和請(qǐng)求響應(yīng)時(shí)間。因?yàn)樨?fù)載均衡時(shí)發(fā)生在客戶端,將集群服務(wù)器按狀態(tài)劃分為兩個(gè)表可以減小客戶端與服務(wù)器端的數(shù)據(jù)傳輸量,即僅將輕負(fù)載節(jié)點(diǎn)列表下載到客戶端。另外本算法相對(duì)于算法PickK,保證了選擇的服務(wù)器是負(fù)載較輕者,又避免了負(fù)載成群現(xiàn)象。由于系統(tǒng)的均衡不是通過負(fù)載遷移實(shí)現(xiàn),計(jì)算和通信開銷要比需要進(jìn)行負(fù)載遷移來達(dá)到負(fù)載均衡的算法小很多。
4 實(shí)驗(yàn)結(jié)果分析
本文采用一個(gè)IT培訓(xùn)企業(yè)的教學(xué)管理系統(tǒng)作為測(cè)試對(duì)象,在三臺(tái)分別裝有相同版本JBoss-4.0.4.GA的計(jì)算機(jī)節(jié)點(diǎn)上,通過壓力測(cè)試工具(LoadRunner)模擬測(cè)試場(chǎng)景:共模擬200個(gè)用戶,從零個(gè)用戶開始,每隔10 s增加20個(gè)用戶,當(dāng)系統(tǒng)同時(shí)訪問用戶達(dá)到最大時(shí)繼續(xù)運(yùn)行2 min。將JBoss應(yīng)用服務(wù)器中的輪循算法、隨機(jī)算法與本文實(shí)現(xiàn)的基于前K子集相對(duì)均衡度的動(dòng)態(tài)自適應(yīng)負(fù)載均衡算法進(jìn)行測(cè)試分析。不同算法的性能數(shù)據(jù)如表2所示。從表中結(jié)果可以看出采用本方案的平均響應(yīng)時(shí)間最短,吞吐量最大;另外最大響應(yīng)時(shí)間和最小響應(yīng)時(shí)間最為接近(標(biāo)準(zhǔn)差越小),說明采用本方案后,系統(tǒng)中各個(gè)服務(wù)器節(jié)點(diǎn)的負(fù)載度相對(duì)較為均衡,偏差不大,以至于不會(huì)出現(xiàn)像隨機(jī)方案(最大響應(yīng)時(shí)間為2.583)中將請(qǐng)求分配到某一重載服務(wù)器,進(jìn)一步加重服務(wù)器負(fù)擔(dān),而輕載服務(wù)器得不到充分利用的情況。
5 結(jié)束語
并不存在一種最優(yōu)的負(fù)載均衡算法,應(yīng)根據(jù)具體應(yīng)用環(huán)境來選擇。本文對(duì)負(fù)載均衡服務(wù)提出了具有一定創(chuàng)新的想法,為開發(fā)人員在使用時(shí)多一份選擇。提出的根據(jù)時(shí)間條件進(jìn)行負(fù)載收集方式有助于減少不必要的負(fù)載收集,并在一定程度上保證了負(fù)載數(shù)據(jù)的精確度,并以此為基礎(chǔ),實(shí)現(xiàn)了FirstKRelativeBalanceDegree動(dòng)態(tài)自適應(yīng)負(fù)載均衡算法。實(shí)驗(yàn)表明該算法具有一定的可用性。今后的研究將是對(duì)該方案的進(jìn)一步改進(jìn),諸如能夠根據(jù)客戶端請(qǐng)求到達(dá)率自適應(yīng)地更改時(shí)間周期T的取值,使之更好地相互協(xié)作等,以及系統(tǒng)閾長(zhǎng)的取值定義,然后根據(jù)對(duì)比分析結(jié)果,進(jìn)一步優(yōu)化、完善EJB集群的動(dòng)態(tài)自適應(yīng)負(fù)載均衡服務(wù)。
參考文獻(xiàn):
[1]ZHANG Xiaodong,QU Yanxia,XIAO Li.Improving distributed workload performance by sharing both CPU and memory resources[C]//Proc of the 20th International Conference on Distributed Computing Systems.2000.
[2]BOZYIGIT M,MELHI M.Load balancing framework for distributed system[J].Computer System Science Engineering,1997,12(5):287-293.
[3] JU Jiubin,YANG Kun,XU Gaochao.Using resource utilization as load index in dynamic load balancing[J].Journal of Software,1996,7(4):238-243.
[4]BALASUBRAMANIAN J,SCHMIDT D C,DWDY L,et al.Evaluating the performance of middle load balancing strategies[C]//Proc ofthe 8th International IEEE Enterprise Distributed Object Computing Conference.2004.
[5]胡子昂,王立.算法、網(wǎng)絡(luò)拓?fù)浼罢{(diào)度頻率與動(dòng)態(tài)負(fù)載平衡的關(guān)系[J].計(jì)算機(jī)工程與科學(xué),2000,36(3):149151.
[6]ANDREOLINI M,COLAJANNI M,MORSELLI R.Performance study of dispatching algorthims in multitier Web architectures[J].SIGMETR ICS Performance Evaluation Review,2002,30(2):10-20.
[7]KAMEDA H,F(xiàn)ATHY E S,RYU I,et al.A performance comparison of dynamic vs static load balancing policies in a mainframepersonal computer network model[C]//Proc of IEEE CDC2000.Sydney,Australia:[s.n.],2000:14151420.
[8]唐丹,金海,張永坤.集群動(dòng)態(tài)負(fù)載平衡系統(tǒng)的性能評(píng)價(jià)[J].計(jì)算機(jī)學(xué)報(bào), 2004,27(6):808-810.
[9]KEREN A,BARAK A.Adaptive placement of parallel Java agents in a scalable computing cluster[C]//Proc of Workshop on Java for High Performance Network Computing.Palo Alto,CA:AMC Press,1998.
[10]LABOUREY S,BURKE B.JBOSS clustering[R].[S.l.]:JBOSS Group,2003:1218.
[11]BEA System Inc.Using WebLogic server clusters,version 8.1 Revised[K].2003.
[12]范國(guó)闖,鐘華,黃濤,等.Web應(yīng)用服務(wù)器研究綜述[J].軟件學(xué)報(bào),2003,14(10):17281739.
[13]SCHMIDT D C,STAL M,ROHNERT H,et al.Patternoriented software architecture:patterns for concurrency and distributed objects[M]. 2nd ed.New York:Wiley,2000.
[14]JACQMOT C,MILGROME.A systematic approach to load distribution strategies for distributed systems[C]//Proc of Decentralized and Distributed Systems.1993.
[15]GAMMA E,HELM R,JOHNSON R,et al.Design patterns:elements of reusable objectoriented software[M].Reading: AddisonWesley, 2002:223-325.
注:“本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文。”