結合Apache和Tomcat實現叢集和負載平衡

來源:互聯網
上載者:User
一:軟體環境
1. Apache: apache 2.0.55 (由http://httpd.apache.org/進入下載)(點擊下載apache 2.0.55)
2. Tomcat: Tomcat 5.5.25 (由http://tomcat.apache.org/進入下載)(點擊下載Tomcat 5.5.25 zip版)
3. mod_jk: 在頁面 http://tomcat.apache.org/ Download 標題下找到 Tomcat
Connectors 連結進入(
點擊下載mod_jk-apache-2.0.55.so),看起來像是個Unix/Linux下的動態庫,實際應是個Win32 的 DLL
動態庫,大概是為保持不同平台配置的一致性,才用了這個副檔名。

二:負載平衡
 用Apache進行分流,把請求按照權重以及當時負荷分tomcat1,tomcat2...去處理

1. 安裝apache,tomcat
我把Apache安裝在D:/Apache Group/Apache2
  解壓兩分Tomcat, 分別在 D:/Apache Group/Tomcat5_1,D:/Apache Group/Tomcat5_2
如果把不同版本的Tomcat進行叢集,目錄就可用Tomcat4_3(版本為4.x的第三個tomcat伺服器),Tomcat6_4(版本為6.x的第三個tomcat伺服器),這是Unmi本人的習慣。

2.修改Apache設定檔http.conf

在apache安裝目錄下conf目錄中找到http.conf,在檔案最後加上下面一句話就可以了

include conf/mod_jk.conf

3. http.conf 同目錄下建立mod_jk.conf檔案,內容如下

#載入mod_jk Module
LoadModule jk_module modules/mod_jk-apache-2.0.55.so

#指定 workers.properties檔案路徑
JkWorkersFile conf/workers.properties

#指定那些請求交給tomcat處理,"controller"為在workers.propertise裡指定的負載分配控制器
JkMount /*.jsp controller

如果還要指定*.do也進行分流就再加一行
JkMount /*.do controller

如果你想對所有的請求進行分流只需要寫成
JkMount /* controller

4. 在http.conf同目錄下建立 workers.properties檔案,內容如下

worker.list = controller,tomcat1,tomcat2 #server 列表
#========tomcat1========
worker.tomcat1.port=8009 #ajp13 連接埠號碼,在tomcat下server.xml配置,預設8009
worker.tomcat1.host=localhost #tomcat的主機地址,如不為本機,請填寫ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1 #server的加權比重,值越高,分得的請求越多

#========tomcat2========
worker.tomcat2.port=8109 #ajp13 連接埠號碼,在tomcat下server.xml配置,預設8009
worker.tomcat2.host=localhost #tomcat的主機地址,如不為本機,請填寫ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 2 #server的加權比重,值越高,分得的請求越多

#========controller,負載平衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2 #指定分擔請求的tomcat
worker.controller.sticky_session=1

5. 修改tomcat設定檔server.xml

果你是水平叢集,即在不同電腦上安裝tomcat,tomcat的安裝數量為一個,可以不必修改tomcat設定檔.我這裡是在同一台電腦上安裝兩個
tomcat,實現的是垂直叢集方式,所以必須修改其中一個的設定,以避免連接埠衝突,按照參考文章是把原來以9開頭的連接埠號碼改為以9開頭連接埠號碼,但是在我
機器上如果以9開頭的連接埠號碼,例如9080、9082會與我的WebSphere Application
Server配置衝突,所以我這裡採取的策略是把原來連接埠號碼的第三位改為1,如8080改為8180。

開啟tomcat2/conf/server.xml檔案

1) 將關閉Tomcat的監聽連接埠改成由8005改為8105
即把

改為

2) 把http服務連接埠號碼由8080改為8180
找到


把這裡的8080改為8180

3) 把AJP連接埠號碼由8009改為8109
找到


把這裡的8009改為8109

4) 把 HTTP 代理連接埠從8082改為8182(這個配置預設是被注釋掉的,可跳過這一步)
找到

把這裡的8082改為8182

5) 編寫一個測試 jsp
建立一個目錄TestCluster,裡面建立一個test.jsp,內容為

<%
System.out.println("===========================");
%>

把TestCluster放到tomcat1,tomcat2的webapps下

6) 啟動apache,tomcat1,tomcat2,進行測試

過 http://localhost/TestCluster/test.jsp
訪問,多重新整理幾次頁面,查看Tomcat1和Tomcat2的視窗,你將可以看到列印了一行
行"===========================",並且從統計上來說,大約在tomcat2列印的數量是在Tomcat1中的兩倍,可以看
到請求會被tomcat1,tomcat2按照不同的權重分流處理,實現了負載平衡。

作下面的叢集配置,請在workers.properties把tomcat1和tomcat2的權重改為一樣的,使請求較平均分配,將有便於看到實驗的效果。

三:配置叢集
只配置負載平衡還不行,還要session複製,也就是說其中任何一個tomcat的添加的session,是要同步複製到其它tomcat, 叢集內的tomcat都有相同的session

1. 修改tomcat1, tomcat2的server.xml,將叢集部分配置,即對節點的在注釋符刪掉,並將tomcat2的4001連接埠改為4002,以避免與tomcat衝突,當然,如果是兩台電腦,是不用改連接埠的,去掉注釋符即可
即取消對如下處

1
2 managerClassName="org.apache.catalina.cluster.session.DeltaManager"
3 expireSessionsOnShutdown="false"
4
5
6
前後的注釋標記,啟用該項配置,實現伺服器間的Session複製。

2. 為 Tomcat1和 Tomcat2 增加 jvmRoute(先跳過這一步,有精力可以實驗一下)
在 Tomcat1 和 Tomcat2 的 server.xml 檔案,找到

分別改為


然而實際我配置的時候還不能加jvmRoute屬性,配置了反而有問題。
重新整理瀏覽器視窗總是在某一個tomcat控制台輸出形如

SessionID:154678FA6D4D0ABD57658B750E7A3532.tomcat1 (在tomcat1視窗)
或者
SessionID:3800571A532AECEA7280F45361861AD4.tomcat2 (在tomcat2視窗)

由控制台列印的結果可以看出,SessionID在哪個tomcat上產生,那麼後續該會話的請求將總是會這個tomcat來處理。

並且注意到SessionID的形式比通常情況多了一個尾碼.tomcat1或.tomcat2,還搞不清楚是為什麼。

配置時請視實際情況而取捨。

3. 修改測試專案 TestCluster
修改test.jsp,內容如下

<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>

<%
System.out.println("SessionID:" + session.getId());
%>
Server Info:
<%
out.println(request.getServerName() + " : " + request.getServerPort()+"
"); %>
<%
out.println("
ID " + session.getId()+"
"); // 如果有新的 Session 屬性設定
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("Session 列表
");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"
");
System.out.println( name + " = " + value);
}
%>

4. 配置Session複製
在TestCluster目錄下建立WEB-INF目錄,WEB-INF下建立web.xml,內容如下


TomcatClusterDemo


也就是在需要叢集的應用的web.xml中加上屬性,表明該應用可多應用分流處理,能進行Session的複製

把TestCluster複製到Tomcat1、Tomcat2的webapps目錄下,重啟apache,tomcat1,tomcat2

5. 測試Session的複製

過 http://localhost/TestCluster/test.jsp 訪問,輸入名稱為 name, 值為
Unmi,提交查詢,多重新整理幾次瀏覽器視窗,你將會看到在兩個Tomcat視窗都列印出相同的SessionID及其中的值,並且每次重新整理後列印的結果都
一樣的。

如果不為應用的web.xml加上 ,同樣測試上面那個test.jsp頁面,每次重新整理分流到不同的tomcat上都會產生不一樣的SessionID,在同一個tomcat上也是間隔出現不同的sessionID。

更切身的體驗是一定要自己動手配置一遍,並仔細觀察兩個tomcat的控制上的輸出。因本文是參考 輕鬆實現Apacjavascript:void(null);he,Tomcat叢集和負載平衡 的實踐經曆,該本中有較多的貼圖。

後記:

WebSphere Application Server ND
版配置過垂直和水平叢集,但是自己實驗叢集環境下的應用卻不想搬弄這個龐然大物。眼下急於想體驗的就是 Quartz
如何適應叢集環境,問題的焦點就是:Quartz 定時任務隨 Web 應用程式啟動,而 Web
應用部署在叢集環境中,如何保證同一時刻只有一個同名的任務執行個體在跑。

所以會考慮用Apache+Tomcat配置一個輕量級的WEB應用叢集,一般進行HTTP分流都是使用Apache,包括WAS叢集也是,很少用IIS的。雖然單純的用Tomcat的balancer應用也能配置進行負載分流,但那個效能應該好不到哪兒去。

用Apache+Tomcat配置的Web應用叢集就是部署起來麻煩些,總是要保持雙份的應用拷貝,WAS叢集則不需要,不知道Jboss做WEB應用叢集是怎麼樣一種情況。

好了,下面要進行該做的事情了,最後也希望能寫個工具能完成從下載到安裝配置,啟動,停止,重啟的全自動化,以及介面的人性化。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.