1.Apache+Tomcat負載均衡+集羣配置

1.本文Apache+Tomcat集羣配置 基於最新的Apache和Tomcat,具體是2011年4月20日最新的Tomcat和Apache集羣和負載均衡配置。html

 

準備環境

Apachejava

Apache是http服務器,咱們利用其對Tomcat進行負載均衡。目前最新版本爲2.2.17,下載地址爲http://httpd.apache.org/download.cgi#apache22。以下圖:node

 

準備環境

Apacheweb

Apache是http服務器,咱們利用其對Tomcat進行負載均衡。目前最新版本爲2.2.17,下載地址爲http://httpd.apache.org/download.cgi#apache22。以下圖:算法

目前已經出現Apache2.3.11,可是爲beta版本,因此沒有使用。apache

下載後直接安裝msi便可,若是沒有其餘的http服務器(如iis)則應該能夠成功安裝,端口即爲80,可以訪問http://localhost/說明安裝成功。windows

Tomcattomcat

Tocmat7目前已經出現穩定版本的7.0.12,Tomcat6則爲6.0.32。經我測試,這2個版本的Apache負載均衡配置過程都是同樣的,所以下面的配置在Tomcat6或7集羣是通用的。可是按照下面的配置,集羣中Tomcat不能既有Tomcat6又有Tomcat7,不然雖可以負載均衡,但不能進行session複製,不知其餘方式配置的集羣是否能夠。服務器

Tomcat就不用怎麼介紹了。既然在本地須要多個節點,那麼須要下載ZIP版本的Tomcat。網絡

JK

JK是Tomcat提供給http服務器的插件(我的理解的),下載地址爲http://mirror.bjtu.edu.cn/apache/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.31/。以下圖:

這裏選擇的是mod_jk-1.2.31-httpd-2.2.3.so,若是http服務器是Apache2.0.X版本,則必須選擇mod_jk-1.2.31-httpd-2.0.52.so,頁面下方有英文的說明,你們能夠看下。

其實我也在網上看到Apache2.2已經集成Tomcat插件模塊了,能夠不用JK插件就能夠實現Tomcat負載均衡,但也須要一些配置,而JK這個配置相比也不復雜,就先記錄下來。

配置過程

下面就直接寫過程了,我也是網絡上學習的,只是總結下過程而且利用最新的Apache和Tomcat測試了下,仍是與網絡上有些不一樣的。

修改Apache配置

一、修改httpd.conf

個人Apache安裝在D:\Program Files\Apache Software Foundation\Apache2.2,找到conf目錄下的httpd.conf,在文件的最後一行添加

include "D:\Program Files\Apache Software Foundation\Apache2.2\conf\mod_jk.conf"

二、新建mod_jk.conf文件,內容以下:

LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so  //此版本爲Linux版本,應下載相關的windows版本

JkWorkersFile conf/workers.properties

#指定那些請求交給tomcat處理,"controller"爲在workers.propertise裏指定的負載分配控制器名

JkMount /*.jsp controller

三、將下載的JK插件mod_jk-1.2.31-httpd-2.2.3.so複製到Apache安裝目錄的modules目錄下。

四、新建並編輯workers.properties文件,內容以下:

#server

worker.list = controller

#========tomcat1========

worker.tomcat1.port=11009

worker.tomcat1.host=localhost

worker.tomcat1.type=ajp13

worker.tomcat1.lbfactor = 1

#========tomcat2========

worker.tomcat2.port=12009

worker.tomcat2.host=localhost

worker.tomcat2.type=ajp13

worker.tomcat2.lbfactor = 1

#========tomcat3========

worker.tomcat3.port=13009

worker.tomcat3.host=192.168.0.80 //在個人虛擬機中的,能夠算遠程的吧

worker.tomcat3.type=ajp13

worker.tomcat3.lbfactor = 1

 

#========controller,負載均衡控制器========

worker.controller.type=lb

worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3

worker.controller.sticky_session=false

worker.controller.sticky_session_force=1

#worker.controller.sticky_session=1

這裏能夠配置任意多個Tomcat,此處配置了3個Tomat服務器,2個本地,1個遠程,因此爲了它們都可以順利啓動起來,本地的服務器端口都是不一樣的,若是Tomcat再也不同一機器上,不必改端口的。

配置Tomcat

配置3個Tomcat服務器,將Tomcat解壓後複製3份,我將每一個文件夾分別命名爲Tomcat1,Tomcat2和Tomcat3,修改每一份的server.xml配置,將Tomcat1中修改部分以下圖:

Tomcat2中以上部分的server.xml爲:

Tomcat3中以上部分的server.xml爲:

由於Tomat3在遠程服務器,因此不必改端口的,而我先進行的本地集羣測試後將Tomcat3複製到遠程服務器,因此這3個Tomcat端口都不一樣。

AJP13的connector的poat和jvmRoute名稱和workers.properties中配置對應。

因爲截圖面積有限,還須要保證本地2個本地Tomcat配置server的port,connector爲http1.1的port都不相同。

測試

創建測試項目

創建test項目,須要在項目的web.xml中添加<distributable/>

創建test2.jsp,內容以下(網上都用這個測試,我就省的麻煩了):

 1 <%@ page contentType="text/html; charset=GBK" %>
 2 
 3 <%@ page import="java.util.*" %>
 4 
 5 <html><head><title>Cluster App Test</title></head>
 6 
 7 <body>
 8 
 9 Server Info:
10 
11 <%
12 
13 out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
14 
15 <%
16 
17   out.println("<br> ID " + session.getId()+"<br>");
18 
19   // 若是有新的 Session 屬性設置
20 
21   String dataName = request.getParameter("dataName");
22 
23   if (dataName != null && dataName.length() > 0) {
24 
25      String dataValue = request.getParameter("dataValue");
26 
27      session.setAttribute(dataName, dataValue);
28 
29   }
30 
31   out.println("<b>Session 列表</b><br>");
32 
33   System.out.println("============================");
34 
35   Enumeration e = session.getAttributeNames();
36 
37   while (e.hasMoreElements()) {
38 
39      String name = (String)e.nextElement();
40 
41      String value = session.getAttribute(name).toString();
42 
43      out.println( name + " = " + value+"<br>");
44 
45          System.out.println( name + " = " + value);
46 
47    }
48 
49 %>
50 
51   <form action="test2.jsp" method="POST">
52 
53     名稱:<input type=text size=20 name="dataName">
54 
55      <br>
56 
57     值:<input type=text size=20 name="dataValue">
58 
59      <br>
60 
61     <input type=submit>
62 
63    </form>
64 
65 </body>
66 
67 </html>

 

上面的測試頁面就不解釋了,很好理解。

Session測試

將項目部署到3個服務器,而後分別啓動Apache和3個Tocmat服務器,這些Tomcat啓動順序隨意,而後打開http://localhost/test/test2.jsp,結果以下圖:

F5刷新頁面,分別出現:

屢次刷新頁面的sessionID看是同一個ID,說明session是複製成功了。那麼session中的存儲的東西呢,在輸入框中分別輸入一、1,二、2,三、3後,顯示結果以下圖:

以上的測試說明,集羣中的session已經共享,每一個集羣對於同一訪問均有相同的session,並且session中存儲的變量也複製了。

 

節點插拔測試

 

插拔意思是應該保證當運行的集羣中某節點中關閉或者啓動時,集羣正常工做而且節點可以正常工做。

下面描述測試過程了,貼圖太佔地方了。

關閉Tomcat2,刷新頁面,則不斷訪問Tocmat1和Tomcat3,再關閉Tomcat1後,則只訪問一個Tomcat3,說明節點關閉時運行正常。

若是重啓Tomcat2,不管怎麼刷新,始終訪問Tomcat3,難道Apache不能將請求轉發給中途啓動的Tomcat2?。。。這時利用另外臺機器訪問頁面,發現Tomcat2正常,而後在刷本地頁面,又能夠訪問Tomcat2了。

從上面能夠看出Apache的負載均衡時的算法了,對於每一個新來的session,Apache按照節點配置中的lbfactor比重選擇訪問節點,若是某節點node1不能訪問,則尋找下一可訪問節點,而且將此node1就在該訪問session的訪問黑名單中,之後該session的訪問直接不考慮node1,即便node1又能夠訪問了。而新來的session是無黑名單的,若是新的session可以訪問到node1了,則會將node1在其餘全部session訪問的黑名單刪除,這樣其餘session就又能訪問node1節點了。以上只是我的通過測試後的猜測。

通過以上測試,說明Tomcat集羣和負載均衡已經實現了。

 

關於集羣我還有些疑問,因此又測試了下,直接把結論寫出來:

1.集羣下的相同的應用能夠名稱不一樣(好像不必啊),只要配置server.xml中host下的context具備相同的path便可。

2. 若是應用名稱能夠不一樣,那麼應用下內容是否能夠不一樣呢(這裏考慮將不一樣應用經過集羣看起來是一個應用,而且共享session),而後集羣下不一樣應用映射爲相同的訪問path,具備相同的路徑則負載,若是某路徑只某個應用具備,則一直訪問該應用。可現實很骨幹啊,答案是否認的,至少我以上的配置不能實現。若是訪問只有某應用具備的特別路徑,那麼只有負載到該應用才能夠訪問,不然直接路徑未找到的錯誤頁面了。

 

 

 若是您看過網上其餘Apache+Tomcat的集羣配置,您可能有的疑問?

1.網上大部分的文章配置2個tocmat的集羣,有的將workers.properties下的worker.controller.sticky_session=1,
而後tomcat1中的server.xml中的jvmRoute設置爲tomcat2,將tomcat2中的jvmRoute設置爲tocmat1,固然我這樣設置
也成功了,可是若是3個或者更多tocmat呢,怎麼設置每一個tomcat的jvmRoute,我不會因此才考慮如今的配置

2.server.xml中的Cluster配置問題,網上大部分都是使用BackupManager方式,即Cluster下又粘貼了一堆配置。其實
只要將其中註釋掉的<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>去掉註釋就完成session的集羣
複製了。只是這倆種複製採用的方式不一樣而已。http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html,這頁面已經說的挺清楚了,集羣的session複製默認是DeltaManager,是all to all的複製,意思是將集羣下1個tomcat應用下的session對全部的集羣中的節點進行復制,即便那個節點沒有發佈應用。顯然是很差的方式,但這在小規模的集羣下並沒神馬問題。而採用BackupManager,就是衆多網上配置那樣,對於須要複製的節點設置BackupManager天然也沒問題,可是它的性能並無DeltaManager 好使「 Downside of the BackupManager: not quite as battle tested as the delta manager」。所以,具體怎麼設置就看你們了,一般說若是不是大規模集羣,就默認就行了。反正我本身翻譯的就是這個意思了,但願沒有誤導你們。

相關文章
相關標籤/搜索