Tomcat6.0負(fù)載均衡策略 _ 1
開學(xué)以后,連續(xù)幾天休息不好,總是犯困,也許這就是“春困秋乏”的癥狀吧。最近老師提出了負(fù)載均衡功能的需求,以減輕
網(wǎng)站的高峰期的服務(wù)器負(fù)擔(dān),現(xiàn)在學(xué)校的硬件設(shè)施還是蠻好的,有三,四臺(tái)服務(wù)器可以提供使用,也很大程度的上方便了我做一些測(cè)試。
因?yàn)檫@個(gè)子項(xiàng)目,假期三個(gè)同學(xué)已經(jīng)基本完工,所以我也只能出點(diǎn)微薄之力,把這個(gè)負(fù)載均衡搞定,具體用不用我不管,起碼是我的一個(gè)
小功能。
其實(shí)無(wú)論是分布式,數(shù)據(jù)緩存,還是負(fù)載均衡,無(wú)非就是改善網(wǎng)站的性能瓶頸,在網(wǎng)站源碼不做優(yōu)化的情況下,負(fù)載均衡可以說(shuō)
是最直接的手段了。其實(shí)拋開這個(gè)名詞,放開了說(shuō),就是希望用戶能夠分流,也就是說(shuō)把所有用戶的訪問(wèn)壓力分散到多臺(tái)服務(wù)器上,也可以
分散到多個(gè)tomcat里,如果一臺(tái)服務(wù)器裝多個(gè)tomcat,那么即使是負(fù)載均衡,性能也提高不了太多,不過(guò)可以提高穩(wěn)定性,即容錯(cuò)性。
當(dāng)其中一個(gè)主tomcat當(dāng)?shù)?,其他的tomcat也可以補(bǔ)上,因?yàn)閠omcat之間實(shí)現(xiàn)了Session共享。待tomcat服務(wù)器修復(fù)后再次啟動(dòng),就會(huì)
自動(dòng)拷貝所有session數(shù)據(jù),然后加入集群。這樣就可以不間斷的提供服務(wù)。如果要真正從本質(zhì)上提升性能,必須要分布到多臺(tái)服務(wù)器。
同樣tomcat也可以做到。網(wǎng)上相關(guān)資料比較多,可以很方便的查到,但是質(zhì)量不算高。我希望可以通過(guò)這篇隨筆,系統(tǒng)的總結(jié)。本文的
例子是同一臺(tái)服務(wù)器上運(yùn)行兩個(gè)tomcat,做兩個(gè)tomcat之間的負(fù)載均衡。其實(shí)多臺(tái)服務(wù)器各配置一個(gè)tomcat也可以,而且那樣的話,可以使用
安裝版的tomcat,而不用是下文中的免安裝的tomcat,而且tomcat端口配置也就不用修改了。下文也會(huì)提到。
tomcat的負(fù)載均衡需要apache服務(wù)器的加入來(lái)實(shí)現(xiàn)。在進(jìn)行配置之前請(qǐng)先卸載調(diào)已安裝的tomcat,然后檢查apache的版本。
我這次配置使用的是apache-tomcat-6.0.18免安裝版本,我親自測(cè)試后推斷安裝版的tomcat在同一臺(tái)機(jī)子上會(huì)不能啟動(dòng)兩個(gè)以上,可能是
因?yàn)榘惭b版的tomcat侵入了系統(tǒng),導(dǎo)致即使在server.xml里修改了配置,還是會(huì)引起沖突。所以我使用tomcat免安裝版。
apache使用的是apache_2.2.11-win32-x86-no_ssl.msi。如果版本低于2.2負(fù)載均衡的配置要有所不同,因?yàn)檫@個(gè)2.2.11和2.2.8版本
集成了jk2等負(fù)載均衡工具,所以配置要簡(jiǎn)單許多。別的版本我沒(méi)有具體測(cè)試,有待考究。這兩個(gè)軟件可以到官方網(wǎng)站下載。
把Apache安裝為運(yùn)行在80端口的Windows服務(wù),安裝成功后在系統(tǒng)服務(wù)列表中可以看到Apache2.2服務(wù)。服務(wù)啟動(dòng)后在瀏覽器中
輸入http://localhost進(jìn)行測(cè)試,如果能看到一個(gè)"It works!"的頁(yè)面就代表Apache已經(jīng)正常工作了。把tomcat解壓到任意目錄,賦值一個(gè)另命名。
起名和路徑對(duì)配置沒(méi)有影響。但要保證端口不要沖突,如果裝有Oracle或IIS的用戶需要修改或關(guān)閉相關(guān)接口的服務(wù)。當(dāng)然jdk的配置也是
必須的,這個(gè)不再過(guò)多敘述。
首先,在Apache安裝目錄下找到conf/httpd.conf文件,去掉以下文本前的注釋符(#)以便讓Apache在啟動(dòng)時(shí)自動(dòng)加載代理(proxy)
模塊。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
向下拉動(dòng)文檔找到<IfModule dir_module>節(jié)點(diǎn),在DirectoryIndex index.html后加上index.jsp,這一步只是為了待會(huì)配置完tomcat后能看到小
貓首頁(yè),可以不做。繼續(xù)下拉文檔找到Include conf/extra/httpd-vhosts.conf,去掉前面的注釋符。
然后打開conf/extra/httpd-vhosts.conf,配置虛擬站點(diǎn),在最下面加上
ServerAdmin 管理員郵箱
ServerName localhost
ServerAlias localhost
ProxyPass / balancer://sy/ stickysession=jsessionid nofailover=On
ProxyPassReverse / balancer://sy/
ErrorLog "logs/sy-error.log"
CustomLog "logs/sy-access.log" common
</VirtualHost>
然后回到httpd.conf,在文檔最下面加上
<proxy balancer://sy>
BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=jvm1
BalancerMember ajp://127.0.0.1:9009 loadfactor=1 route=jvm2
</proxy>
ProxyRequests Off 是告訴Apache需要使用反向代理,ip地址和端口唯一確定了tomcat節(jié)點(diǎn)和配置的ajp接受端口。loadfactor是負(fù)載因子,
Apache會(huì)按負(fù)載因子的比例向后端tomcat節(jié)點(diǎn)轉(zhuǎn)發(fā)請(qǐng)求,負(fù)載因子越大,對(duì)應(yīng)的tomcat服務(wù)器就會(huì)處理越多的請(qǐng)求,如兩個(gè)tomcat都
是1,Apache就按1:1的比例轉(zhuǎn)發(fā),如果是2和1就按2:1的比例轉(zhuǎn)發(fā)。這樣就可以使配置更靈活,例如可以給性能好的服務(wù)器增加處理
工作的比例,如果采取多臺(tái)服務(wù)器,只需要修改ip地址和端口就可以了。route參數(shù)對(duì)應(yīng)后續(xù)tomcat配置中的引擎路徑(jvmRoute)。
如果僅僅為了配置一個(gè)可用的集群,Tomcat的配置將會(huì)非常簡(jiǎn)單。分別打開兩個(gè)tomcat的server.xml配置文件,其中一臺(tái)可以采用默認(rèn)
的設(shè)置,只需要修改兩個(gè)地方,而另一個(gè)要有較大改動(dòng)以避免與前一臺(tái)沖突。如果兩臺(tái)不在同一臺(tái)服務(wù)器上運(yùn)行,對(duì)于端口就不需做改動(dòng)。首先是
配置關(guān)閉端口,找到<Server port="8005" shutdown="SHUTDOWN">,第一臺(tái)不變,把第二臺(tái)改為9005。
下面配置Connector的端口,找到non-SSL HTTP/1.1 Connector,即tomcat單獨(dú)工作時(shí)的默認(rèn)Connector,保留第一臺(tái)默認(rèn)配置,在8080端
口偵聽,而把第二臺(tái)設(shè)置為在9080端口偵聽。往下找到AJP 1.3 Connector,<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />,這是
tomcat接收從Apache過(guò)來(lái)的ajp連接請(qǐng)求時(shí)使用的端口,保留第一臺(tái)默認(rèn)設(shè)置,把第二臺(tái)端口改為9009。第一臺(tái)tomcat的server.xml中找到
<Engine name="Catalina" defaultHost="localhost">,去掉這段或改為注釋,把上方緊挨的<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
注釋符去掉,對(duì)于第二臺(tái),去掉注釋符并把jvm1改為jvm2。
向下找到<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>,去掉注釋,這里的配置是為了可以在集群中的所有tomcat節(jié)點(diǎn)
間共享會(huì)話(Session)。如果僅僅為了獲得一個(gè)可用的tomcat集群,Cluster只需要這么配置就可以了。
只需要簡(jiǎn)單的幾步就配置完成,然后可以測(cè)試一下是否配置成功。引用網(wǎng)上的一個(gè)測(cè)試方法,就是在webapps目錄下新建test目錄,在test目
錄下新建test.jsp文件,代碼我稍作改動(dòng)如下:
<%@ page import="java.util.*" %>
<html><head><title>shiyang</title></head>
<body>
服務(wù)信息:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br/>");%>
<%
out.println("<br> ID " + session.getId()+"<br/>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session 列表</b><br/>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br/>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
名稱:<input type=text size=20 name="dataName">
<br/>
值:<input type=text size=20 name="dataValue">
<br/>
<input type=submit value="提交">
</form>
</body>
</html>
在test目錄下繼續(xù)新建WEB-INF目錄和web.xml,在<web-app>節(jié)點(diǎn)下加入<distributable />,這一步非常重要,是為了通知tomcat服務(wù)器,
當(dāng)前應(yīng)用需要在集群中的所有節(jié)點(diǎn)間實(shí)現(xiàn)Session共享。如果tomcat中的所有應(yīng)用都需要Session共享,也可以把conf/context.xml中的
<Context>改為<Context distributable="true">,這樣就不需對(duì)所有應(yīng)用的web.xml再進(jìn)行單獨(dú)配置。測(cè)試代碼完成!
先啟動(dòng)Apache服務(wù),在先后啟動(dòng)兩臺(tái)tomcat,分別點(diǎn)startup.bat批處理。如果一切順利的話,就會(huì)啟動(dòng)成功。再次訪問(wèn)http://localhost,
可以看到小貓頁(yè)面。訪問(wèn)http://localhost/test/test.jsp??梢钥吹桨ǚ?wù)器地址,端口,session等信息在內(nèi)的頁(yè)面。
然后你可以測(cè)試一下容錯(cuò)功能,關(guān)閉一個(gè)tomcat,看看服務(wù)是否正常,然后重啟tomcat,關(guān)掉另一臺(tái)tomcat,看看
是否也可以繼續(xù)提供服務(wù)。當(dāng)然你也可以配置多臺(tái)tomcat,但是原理都一樣。
OK,講到這里。
posted on 2012-06-02 08:54 gdufo 閱讀(1098) 評(píng)論(0) 編輯 收藏 所屬分類: Tomcat