結合Apache和Tomcat實現集羣和負載均衡(轉)

http://blog.csdn.net/kypfos/article/details/3081330

 

 

本文基本參考自 輕鬆實現Apache,Tomcat集羣和負載均衡,經由實操經歷記錄而成,碰到些出入,以及個別地方依據個人的習慣,所以在一定程度上未能保持原文的完整性,還望原著者海涵。

因原文中有較多的貼圖,如若各位讀者一時不想親自動手而直想看到配置效果,可查看原文。

一:軟件環境
   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文件,內容如下

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

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

4. 在http.conf同目錄下新建 workers.properties文件,內容如下(可能要去除 # 不在行首的註釋)

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
即把
 <Server port="8005" shutdown="SHUTDOWN">
改爲
 <Server port="8105" shutdown="SHUTDOWN">

2) 把http服務端口號由8080改爲8180
找到
 <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
    <CONNECTOR port="8080

把這裏的8080改爲8180

3) 把AJP端口號由8009改爲8109
找到
 <!-- Define an AJP 1.3 Connector on port 8009 -->
    <CONNECTOR port="8009"

把這裏的8009改爲8109

4) 把 HTTP 代理端口從8082改爲8182(這個配置默認是被註釋掉的,可跳過這一步)
找到
<CONNECTOR port="8082"
把這裏的8082改爲8182

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

 


把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,將集羣部分配置,即對<Cluster>節點的在註釋符刪掉,並將tomcat2的4001端口改爲4002,以避免與tomcat衝突,當然,如果是兩臺電腦,是不用改端口的,去掉註釋符即可
即取消對如下處


前後的註釋標記<!--  -->,啓用該項配置,實現服務器間的Session複製。

2. 爲 Tomcat1和 Tomcat2 增加 jvmRoute(先跳過這一步,有精力可以試驗一下)
在 Tomcat1 和 Tomcat2 的 server.xml 文件,找到
 <ENGINE name="Catalina" defaultHost="localhost">
分別改爲
 <ENGINE name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

 <ENGINE name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">

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

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

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

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

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

3. 修改測試項目 TestCluster
修改test.jsp,內容如下
 

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

也就是在需要集羣的應用的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的控制上的輸出。因本文是參考 輕鬆實現Apache,Tomcat集羣和負載均衡 的實踐經歷,該本中有較多的貼圖。

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

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

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

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

參考資料:1. 輕鬆實現Apache,Tomcat集羣和負載均衡
             2. apache+tomcat集羣實踐(與上面方法有些異樣的配置方式) 
             3. Tomcat集羣與負載均衡(關於集羣與負載均衡的解釋)
             4. 怎樣配製集羣/Session複製(Tomcat5自帶文檔的中文翻譯)
             5. 怎樣配置負載均衡(Tomcat5自帶文檔的中文翻譯)

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