tomcat均衡負載

其實無論是分佈式,數據緩存,還是負載均衡,無非就是改善網站的性能瓶頸,在網站源碼不做優化的情況下,負載均衡可以說

是最直接的手段了。其實拋開這個名詞,放開了說,就是希望用戶能夠分流,也就是說把所有用戶的訪問壓力分散到多臺服務器上,也可以

分散到多個tomcat裏,如果一臺服務器裝多個tomcat,那麼即使是負載均衡,性能也提高不了太多,不過可以提高穩定性,即容錯性。

當其中一個主tomcat當掉,其他的tomcat也可以補上,因爲tomcat之間實現了Session共享。待tomcat服務器修復後再次啓動,就會

自動拷貝所有session數據,然後加入集羣。這樣就可以不間斷的提供服務。如果要真正從本質上提升性能,必須要分佈到多臺服務器。

同樣tomcat也可以做到。網上相關資料比較多,可以很方便的查到,但是質量不算高。我希望可以通過這篇隨筆,系統的總結。本文的

例子是同一臺服務器上運行兩個tomcat,做兩個tomcat之間的負載均衡。其實多臺服務器各配置一個tomcat也可以,而且那樣的話,可以使用

安裝版的tomcat,而不用是下文中的免安裝的tomcat,而且tomcat端口配置也就不用修改了。下文也會提到。

 

               tomcat的負載均衡需要apache服務器的加入來實現。在進行配置之前請先卸載調已安裝的tomcat,然後檢查apache的版本。

我這次配置使用的是apache-tomcat-6.0.18免安裝版本,我親自測試後推斷安裝版的tomcat在同一臺機子上會不能啓動兩個以上,可能是

因爲安裝版的tomcat侵入了系統,導致即使在server.xml裏修改了配置,還是會引起衝突。所以我使用tomcat免安裝版。

apache使用的是apache_2.2.11-win32-x86-no_ssl.msi。如果版本低於2.2負載均衡的配置要有所不同,因爲這個2.2.11和2.2.8版本

集成了jk2等負載均衡工具,所以配置要簡單許多。別的版本我沒有具體測試,有待考究。這兩個軟件可以到官方網站下載。

 

                 把Apache安裝爲運行在80端口的Windows服務,安裝成功後在系統服務列表中可以看到Apache2.2服務。服務啓動後在瀏覽器中

輸入http://localhost進行測試,如果能看到一個"It works!"的頁面就代表Apache已經正常工作了。把tomcat解壓到任意目錄,賦值一個另命名。

起名和路徑對配置沒有影響。但要保證端口不要衝突,如果裝有Oracle或IIS的用戶需要修改或關閉相關接口的服務。當然jdk的配置也是

必須的,這個不再過多敘述。

     

                 首先,在Apache安裝目錄下找到conf/httpd.conf文件,去掉以下文本前的註釋符(#)以便讓Apache在啓動時自動加載代理(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

 

向下拉動文檔找到<IfModule dir_module>節點,在DirectoryIndex index.html後加上index.jsp,這一步只是爲了待會配置完tomcat後能看到小

貓首頁,可以不做。繼續下拉文檔找到Include conf/extra/httpd-vhosts.conf,去掉前面的註釋符。

 

然後打開conf/extra/httpd-vhosts.conf,配置虛擬站點,在最下面加上

 

複製代碼
<VirtualHost *:80> 
         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,在文檔最下面加上

 

ProxyRequests Off 
<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節點和配置的ajp接受端口。loadfactor是負載因子,

Apache會按負載因子的比例向後端tomcat節點轉發請求,負載因子越大,對應的tomcat服務器就會處理越多的請求,如兩個tomcat

1Apache就按11的比例轉發,如果是21就按21的比例轉發。這樣就可以使配置更靈活,例如可以給性能好的服務器增加處理

工作的比例,如果採取多臺服務器,只需要修改ip地址和端口就可以了。route參數對應後續tomcat配置中的引擎路徑(jvmRoute)。

                 如果僅僅爲了配置一個可用的集羣,Tomcat的配置將會非常簡單。分別打開兩個tomcatserver.xml配置文件,其中一臺可以採用默認

的設置,只需要修改兩個地方,而另一個要有較大改動以避免與前一臺衝突。如果兩臺不在同一臺服務器上運行,對於端口就不需做改動。首先是

配置關閉端口,找到<Server port="8005" shutdown="SHUTDOWN">第一臺不變,把第二臺改爲9005

                下面配置Connector的端口,找到non-SSL HTTP/1.1 Connector,即tomcat單獨工作時的默認Connector,保留第一臺默認配置,在8080

口偵聽,而把第二臺設置爲在9080端口偵聽。往下找到AJP 1.3 Connector<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />,這是

tomcat接收從Apache過來的ajp連接請求時使用的端口,保留第一臺默認設置,把第二臺端口改爲9009。第一臺tomcat的server.xml中找到

<Engine name="Catalina" defaultHost="localhost">,去掉這段或改爲註釋,把上方緊挨的<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

註釋符去掉,對於第二臺,去掉註釋符並把jvm1改爲jvm2

               向下找到<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>,去掉註釋,這裏的配置是爲了可以在集羣中的所有tomcat節點

間共享會話(Session)。如果僅僅爲了獲得一個可用的tomcat集羣,Cluster只需要這麼配置就可以了。

               只需要簡單的幾步就配置完成,然後可以測試一下是否配置成功。引用網上的一個測試方法,就是在webapps目錄下新建test目錄,在test

錄下新建test.jsp文件,代碼我稍作改動如下:

 

複製代碼
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>shiyang</title></head>
<body>
服務信息:
<%
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目錄下繼續新建WEB-INF目錄和web.xml,在<web-app>節點下加入<distributable />,這一步非常重要,是爲了通知tomcat服務器,

當前應用需要在集羣中的所有節點間實現Session共享。如果tomcat中的所有應用都需要Session共享,也可以把conf/context.xml中的

<Context>改爲<Context distributable="true">,這樣就不需對所有應用的web.xml再進行單獨配置。測試代碼完成!

 

先啓動Apache服務,在先後啓動兩臺tomcat,分別點startup.bat批處理。如果一切順利的話,就會啓動成功。再次訪問http://localhost

可以看到小貓頁面。訪問http://localhost/test/test.jsp。可以看到包括服務器地址,端口,session等信息在內的頁面。

                然後你可以測試一下容錯功能,關閉一個tomcat,看看服務是否正常,然後重啓tomcat,關掉另一臺tomcat,看看

是否也可以繼續提供服務。當然你也可以配置多臺tomcat,但是原理都一樣。

 OK,講到這裏。


http://www.cnblogs.com/shiyangxt/archive/2009/02/26/1398902.html



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章