李 歐,陳 燕,李桃迎
(大連海事大學(xué)交通運(yùn)輸管理學(xué)院,遼寧 大連 116026)
計(jì)算機(jī)和網(wǎng)絡(luò)技術(shù)不斷發(fā)展,人們對(duì)互聯(lián)網(wǎng)的訪問(wèn)量呈爆炸式增長(zhǎng),網(wǎng)絡(luò)設(shè)備需要不斷升級(jí)才能滿足用戶的需求,一些網(wǎng)站所使用的服務(wù)器已經(jīng)相對(duì)落后[1]。這種情況下,很多企業(yè)開(kāi)始應(yīng)用集群系統(tǒng)來(lái)緩解訪問(wèn)量給網(wǎng)絡(luò)設(shè)備帶來(lái)的壓力,同時(shí)集群系統(tǒng)也能夠保證服務(wù)的可靠性[2]。
負(fù)載均衡集群的實(shí)用性使得越來(lái)越多的人開(kāi)始對(duì)其進(jìn)行研究。郭成城、晏蒲柳研究了異構(gòu)Web服務(wù)器集群動(dòng)態(tài)負(fù)載均衡算法[3],張玉芳、魏欽磊、趙膺對(duì)基于負(fù)載權(quán)值的負(fù)載均衡算法做了相關(guān)研究[4],王霜、修保新、肖衛(wèi)東研究了Web服務(wù)器集群的負(fù)載均衡算法[5],陳一驕、盧錫城、時(shí)向泉等人研究了面向會(huì)話的自適應(yīng)負(fù)載均衡算法[6],曾碧卿、陳志剛研究了服務(wù)器集群系統(tǒng)的相關(guān)內(nèi)容[7],陳濤、肖儂、劉芳對(duì)元數(shù)據(jù)負(fù)載均衡機(jī)制進(jìn)行了一定的研究[8],饒磊、湯小春、侯增江研究了服務(wù)器集群負(fù)載均衡策略[9]。
Tomcat與Apache單獨(dú)使用時(shí)存在一定的局限性,在解釋靜態(tài)網(wǎng)頁(yè)時(shí)Tomcat沒(méi)有 Apache快[10-11],同時(shí)Tomcat的可配置性沒(méi)有Apache好,而Apache不支持動(dòng)態(tài)頁(yè)面的處理。JK是Apache服務(wù)器的一個(gè)可插入模塊,它實(shí)質(zhì)上是Apache與Tomcat的連接器[12-13],同時(shí)它能夠提供負(fù)載均衡集群的功能。
負(fù)載均衡算法是負(fù)載均衡集群的重要研究?jī)?nèi)容,目前已提出了一些調(diào)度算法,例如輪詢算法、加權(quán)輪詢算法、最小連接算法等[14-15]。
鑒于此,本文采用Apache+JK+Tomcat架構(gòu)和輪詢算法來(lái)實(shí)現(xiàn)負(fù)載均衡集群。
通過(guò)插件JK整合Apache與Tomcat的負(fù)載均衡集群架構(gòu)如圖1所示。
圖1 負(fù)載均衡集群架構(gòu)
當(dāng)用戶通過(guò)瀏覽器發(fā)出請(qǐng)求時(shí),請(qǐng)求首先會(huì)發(fā)送到Apache,判斷請(qǐng)求類型,如果請(qǐng)求是靜態(tài)的則由A-pache解析,并把結(jié)果返回給客戶端;如果是動(dòng)態(tài)的請(qǐng)求,如JSP等,Apache會(huì)把解析工作交給Tomcat,由Tomcat進(jìn)行解析,Tomcat處理完成后,結(jié)果仍是通過(guò)Apache返回給客戶端。JK在這個(gè)過(guò)程中起到調(diào)度的作用,根據(jù)負(fù)載均衡算法將解析工作合理分配給Tomcat,避免了一個(gè)Tomcat太忙,另一個(gè)空閑的情況的發(fā)生,這樣就可以達(dá)到分工合作,實(shí)現(xiàn)負(fù)載均衡,提高性能。
在Linux環(huán)境下正確安裝配置相關(guān)軟件后,通過(guò)對(duì)Tomcat和Apache的配置實(shí)現(xiàn)負(fù)載均衡集群。
對(duì)Tomcat的配置文件server.xml進(jìn)行修改,修改Tomcat端口及屬性。
首先將<Connector>修改成如下形式:
< Connector port="8009"protocol="AJP/1.3"redirect-Port="8443"protocolhandlerclassname="org.apache.jk.server.jkcoyotehandler"/>
需要注意的是,如果一臺(tái)機(jī)器上同時(shí)運(yùn)行多個(gè)Tomcat,需要將每個(gè) Tomcat對(duì)應(yīng)的 Connectorport端口設(shè)為不同的值,防止端口沖突。
然后對(duì)<Engine>進(jìn)行修改,修改后的結(jié)果為:
<Engine name="Catalina"defaultHost="localhost"jvm-Route="tomcat1">
最后在<Host>下添加下面的內(nèi)容:
< Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
< Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
< Channel className="org.apache.catalina.tribes.group.GroupChannel">
< Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.1.99"#廣播地址,同一組 Tomcat集群一樣
port="45564"#同一組Tomcat集群一樣
frequency="500"
dropTime="3000"/>
< Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="172.18.145.104"#修改為本機(jī) IP 地址
port="5000"
selectorTimeout="100"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter" >
< Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
< Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
< Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"filter=""/>
< Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
< Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
< ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
< ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
需要注意的是Membershipaddress與port要求同一組Tomcat集群設(shè)置相同,Receiveraddress為本機(jī)IP地址,如果是在同一臺(tái)電腦上配置負(fù)載,要修改Receiverport,否則會(huì)產(chǎn)生端口沖突問(wèn)題。
在第二臺(tái)機(jī)器將<Engine>修改為:
<Engine name="Catalina"defaultHost="localhost"jvm-Route="tomcat2">
將<Cluster>結(jié)點(diǎn)中<Receiver address>修改為:
Receiver address="172.18.145.117"
也就是第二臺(tái)機(jī)器的IP地址;其他配置與第一臺(tái)機(jī)器相同。
Step1 修改 Apache的配置文件 httpd.conf,在文件尾部追加以下內(nèi)容:
LoadModulejk_module modules/mod_jk.so<Ifmodulemod_jk.c>
#指定 workers.properties文件路徑
JkWorkersFile/usr/local/apache/conf/workers.properties#指定JK相關(guān)內(nèi)容
JkLogFile/usr/local/apache/logs/mod_jk.log
JkLogLevel info
JkLogStampFormat"[%a%b%d%H:%M:%S%Y]"JkOptions+ForwardKeySize+ForwardURICompat-Forward-Directories
JkRequestLogFormat"%w%V%T%q%U%R"
JkShmFile/usr/local/apache/logs/mod_jk.shm
</IfModule>
JkMount/* loadbalancer#所有的請(qǐng)求都交給loadbalancer處理
#其中"loadbalancer"為在workers.propertise里指定的負(fù)載分配控制器
Step2 根據(jù) Apache的配置文件 httpd.conf中workers.properties 文件路徑,創(chuàng)建 workers.properties文件。workers.properties文件用于對(duì)負(fù)載均衡的負(fù)載器worker(即Tomcat)進(jìn)行具體的登記,此處的2個(gè)Tomcat就作為2個(gè)worker被登記在這個(gè)文件中。workers.properties具體配置如下:
workers.tomcat_home=/usr/local/apache-tomcat-7.0.47
workers.java_home=/usr/local/java/jdk1.7.0_45
ps=/
worker.list=tomcat1,tomcat2,loadbalancer,status
#the first tomcat
worker.tomcat1.port=8009#對(duì)應(yīng) Tomcat的 server.xml中配置的ajp13端口號(hào)
worker.tomcat1.host=172.18.145.104 #Tomcat1 的主機(jī)地址 worker.tomcat1.type=ajp13 #定向包協(xié)議
worker.tomcat1.lbfactor=1 #Server的負(fù)載分配權(quán)重,值越高,分得的請(qǐng)求越多
#the second tomcat
worker.tomcat2.port=8009
worker.tomcat2.host=172.18.145.117 #Tomcat2 的主機(jī)地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
#load balancer worker負(fù)載均衡控制器
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1,tomcat2#指定分擔(dān)請(qǐng)求的Tomcat
worker.loadbalancer.sticky_session=0
worker.loadbalancer.sticky_session_force=0
worker.status.type=status
需要注意的是,如果sticky_session設(shè)置為1,表明使用粘性Session,即某用戶的請(qǐng)求第一次分發(fā)到哪臺(tái)Tomcat,后繼的請(qǐng)求會(huì)一直分發(fā)到此Tomcat服務(wù)器上處理[16]。sticky_session_force設(shè)置為0時(shí),表明如果集群中某臺(tái)Tomcat服務(wù)器在多次請(qǐng)求沒(méi)有響應(yīng)后,會(huì)將當(dāng)前的請(qǐng)求轉(zhuǎn)發(fā)到其它Tomcat服務(wù)器上處理[17]。
在Windows下新建一個(gè)Java Web工程Session-Test,在工程下新建 index.jsp,JSP頁(yè)面上顯示 Session ID、Key和Value。用Eclipse將編譯好的Java Web項(xiàng)目導(dǎo)出成war包,放置到Linux服務(wù)器上的Tomcat的Webapps目錄下。
關(guān)閉2臺(tái)計(jì)算機(jī)的防火墻,并且開(kāi)啟2臺(tái)機(jī)器的網(wǎng)卡組播功能,以保證2臺(tái)機(jī)器之間能夠正常通信。
啟動(dòng)同組Tomcat以及Apache。瀏覽器訪問(wèn)A-pache所在的主機(jī),從頁(yè)面顯示的session Id可以看出請(qǐng)求訪問(wèn)的是Tomcat1,不斷提交數(shù)據(jù),發(fā)現(xiàn)Tomcat1與Tomcat2輪流處理請(qǐng)求,將Tomcat2服務(wù)停止,繼續(xù)提交數(shù)據(jù),請(qǐng)求都由Tomcat1處理,在這個(gè)過(guò)程中session Id沒(méi)有發(fā)生變化,結(jié)果如圖2所示。由此可見(jiàn)負(fù)載均衡集群搭建成功。
圖2 負(fù)載均衡集群通信測(cè)試結(jié)果
使用JMeter作為服務(wù)器性能的測(cè)試工具,分別模擬1000名、1500名、2000名、2500名、3000名用戶對(duì)服務(wù)器進(jìn)行訪問(wèn),對(duì)單臺(tái)服務(wù)器的訪問(wèn)結(jié)果如表1所示,對(duì)采用負(fù)載均衡集群技術(shù)的服務(wù)器的訪問(wèn)結(jié)果如表2所示。
表1 對(duì)單臺(tái)服務(wù)器的訪問(wèn)結(jié)果
表2 對(duì)負(fù)載均衡集群系統(tǒng)的訪問(wèn)結(jié)果
通過(guò)比較表1和表2可知,在訪問(wèn)量相同的情況下,負(fù)載均衡集群系統(tǒng)的平均響應(yīng)時(shí)間、50%用戶響應(yīng)時(shí)間、90%用戶響應(yīng)時(shí)間、最小響應(yīng)時(shí)間、最大響應(yīng)時(shí)間以及錯(cuò)誤率比單臺(tái)服務(wù)器有了很大的提高。實(shí)驗(yàn)結(jié)果表明,負(fù)載均衡集群系統(tǒng)的性能明顯高于單臺(tái)服務(wù)器。
負(fù)載均衡集群系統(tǒng)具有高性能、低價(jià)格、可擴(kuò)展性強(qiáng)等特點(diǎn),同時(shí)能夠合理地進(jìn)行業(yè)務(wù)量分配,使得集群中的設(shè)備充分發(fā)揮其處理能力。在分析和研究負(fù)載均衡集群的基礎(chǔ)上,本文在Linux環(huán)境下實(shí)現(xiàn)了負(fù)載均衡集群的搭建,測(cè)試結(jié)果表明該集群具有良好的效果。另外,負(fù)載均衡集群中業(yè)務(wù)量是根據(jù)負(fù)載均衡算法分配的,還需解決的問(wèn)題是改進(jìn)負(fù)載均衡算法,使業(yè)務(wù)量的分配更加合理。
[1]Schroeder T,Goddard S,Ramamurthy B.Scalable Web server clustering technologies[J].Network,IEEE,2000,14(3):38-45.
[2]高張,康小軍.提高Tomcat服務(wù)器運(yùn)行性能的研究[J].計(jì)算機(jī)與數(shù)字工程,2008,36(10):203-205.
[3]郭成城,晏蒲柳.一種異構(gòu)Web服務(wù)器集群動(dòng)態(tài)負(fù)載均衡算法[J].計(jì)算機(jī)學(xué)報(bào),2005,28(2):179-184.
[4]張玉芳,魏欽磊,趙膺.基于負(fù)載權(quán)值的負(fù)載均衡算法[J].計(jì)算機(jī)應(yīng)用研究,2012,29(12):4711-4713.
[5]王霜,修保新,肖衛(wèi)東.Web服務(wù)器集群的負(fù)載均衡算法研究[J].計(jì)算機(jī)工程與應(yīng)用,2004,40(25):78-80.
[6]陳一嬌,盧錫城,時(shí)向泉,等.一種面向會(huì)話的自適應(yīng)負(fù)載均衡算法[J].軟件學(xué)報(bào),2008,19(7):1828-1836.
[7]曾碧卿,陳志剛.服務(wù)器集群系統(tǒng)研究[J].計(jì)算機(jī)應(yīng)用研究,2004,21(3):186-187.
[8]陳濤,肖儂,劉芳.對(duì)象存儲(chǔ)系統(tǒng)中自適應(yīng)的元數(shù)據(jù)負(fù)載均衡機(jī)制[J].軟件學(xué)報(bào),2013,24(2):331-342.
[9]饒磊,湯小春,侯增江.服務(wù)器集群負(fù)載均衡策略的研究[J].計(jì)算機(jī)與現(xiàn)代化,2013(1):29-32.
[10]Apache.Apache2.2 User’s Guide[EB/OL].http://httpd.apache.org,2014-06-16.
[11]邊清剛,潘東華.Tomcat和Apache集成支持JSP技術(shù)探討[J].計(jì)算機(jī)應(yīng)用研究,2003(6):12-14.
[12]劉尚旺,何東健,閆艷.Tomcat與 IIS或Apache服務(wù)器集成的應(yīng)用研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2009,30(10):2541-2543.
[13]孫仁鵬.Tomcat與Apache集成的研究[J].電腦編程技巧與維護(hù),2011(14):6-8.
[14]王春娟,董麗麗,賈麗.Web集群系統(tǒng)的負(fù)載均衡算法[J].計(jì)算機(jī)工程,2010,36(2):102-104.
[15]周松泉.一種改進(jìn)的集群動(dòng)態(tài)負(fù)載均衡算法[J].計(jì)算機(jī)與現(xiàn)代化,2012(1):135-139.
[16]吳少剛,陳曉玲.J2EE應(yīng)用服務(wù)器集群性能研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2007,28(18):4410-4412.
[17]陳文超.淺析Tomcat Web服務(wù)器基于Apache的集群與負(fù)載均衡[J].科技資訊,2012(6):28-30.