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