apache2+tomcat5.5集羣+session同步

apache2+tomcat5.5集羣+session同步
作者:劉宇 liuyu.blog.51cto.com
msn羣:[email protected]linuxtone)

說明:借前人之鑑,寫一篇關於tomcat集羣及session同步的問題,首先介紹tomcat集成及做集羣的原因和必要性,session同步的作用。然後包括各軟件的安裝配置

原理:tomcat 做個WEB服務器有它的侷限性,處理能力低,效率低。承受併發小(1000左右)。但目前有不少網站或者頁面是JSP的。並採用了tomcat做爲WEB,因此只能在此基礎上調優。
目前採取的辦法是Apache + Mod_JK + tomcat 來解決一部分請求,用戶訪問的是apache,但有jsp頁面的時候纔會去請求tomcat。如果量一大,那麼tomcat無法承受,那麼只能做tomat集羣,Apache + Mod_JK 就是負載均衡器了。
Mod_JK2負載均衡 可以把不同的jsp請求轉發到不同的tomcat服務器,還可以偵測服務器存活。如果有條件可以給Mod_JK2做一個HA因爲做完集羣后壓力就在JK上了。
      
簡單拓僕圖:

ATjk.jpg

一、測試環境及軟件安裝:-----如果已經安裝過的可以省略這步
linux 2.6 內核  centos 5.2
本例二臺tomcat 不在同一機器。

先安裝了所需的程序庫
  1. yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel
複製代碼
下載源碼包:(本文不安裝PHP)
apache2 和tomcat5都可以在 apache.org 下載
tomcat5需要JDK1.5的版本。
JK本文用的源碼包tomcat-connectors

Apache 安裝:
# tar zxvf httpd-2.2.8.tar.gz
#cd httpd-2.2.8
# ./configure --prefix=/usr/local/apache2 --enable-modules=so --enable-so
# make && make install

/usr/local/apache2/bin/apachectrl start
看到apache就配置成功了。


JDK的安裝
#chmod 755 jdk-1_5_0_16-linux-i586.bin
#./jdk-1_5_0_16-linux-i586.bin
# mv jdk-1_5_0_16 /usr/local/
到此JDK已經安裝完成

到/usr/bin目錄下,把原用的java,javac文件刪除:
#rm -rf java
#rm –rf javac
在/usr/bin 下建立 軟連接 java
  1. # ln -s /usr/local/jdk-1_5_0_16/bin/java /usr/bin/java
  2. # ln -s /usr/local/jdk-1_5_0_16/bin/javac /usr/bin/javac
  3. # java –version
  4. # javac -version
  5. java version "1.4.2_08"
  6. Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_08-b03)
  7. Java HotSpot(TM) Client VM (build 1.4.2_08-b03, mixed mode)
複製代碼
爲了方便下在的工作建立兩個軟鏈接:
ln -s /usr/local/jdk-1_5_0_16  /usr/local/jdk
ln -s /usr/local/jdk-1_5_0_16/jre /usr/local/jre


Tomcat的安裝
#tar -zxvf apache-tomcat-5.5.27.tar.gz
# mv apache-tomcat-5.5.27 /usr/local/tomcat
設置環境變量:
  1. #Set  Environment  by NetSeek
  2. JAVA_HOME=/usr/local/jdk
  3. export JAVA_HOME
  4. JRE_HOME=/usr/local/jre
  5. export JRE_HOME
  6. CLASSPATH=/usr=/usr/local/tomcat/common/lib/:/usr/local/jdk/lib:/usr/local/jre/lib
  7. export CLASSPATH
  8. PATH=$PATH:/usr/local/tomcat/bin/:/usr/local/apache/bin:/usr/local/jdk/bin:/usr/local/jre/bin
  9. export PATH
  10. TOMCAT_HOME=/usr/local/tomcat
  11. export TOMCAT_HOME
複製代碼
啓動tomcat以檢查是否存在錯誤:
#cd /usr/local/tomcat/bin
#./startup.sh
http://IP地址:8080 可以看到貓頭:)成功了。

在另一臺機器上也安裝tomcat 並配置好。

JK 安裝 (整合apache tomcat)
# tar zxvf tomcat-connectors-1.2.27-src.tar.gz
#cd tomcat-connectors-1.2.27-src/native
# ./configure --with-apxs=/usr/local/apache2/bin/apxs --with-java-home=/usr/local/jdk
# make && make install

在/usr/local/apache2/modules/ 下會產生mod_jk.so
修改apache配置文件:
  1. LoadModule jk_module modules/mod_jk.so

  2. JkWorkersFile /usr/local/tomcat/conf/jk/workers.properties   JK配置文件 負載的配置
  3. JkShmFile logs/mod_jk.shm
  4. JkLogFile /usr/local/tomcat/logs/mod_jk.log  相關日誌的設置
  5. JkLogLevel info
  6. JkMount /*.jsp controller  將jsp的請求轉發給 controller(負載均衡控制器)
複製代碼
修改DoucmentRoot 與tomcat的目錄一致。
本文修改爲:/usr/local/tomcat/webapps/

二、調度器JK的配置
建立JK配置文件:
#vi /usr/local/tomcat/conf/jk/workers.properties
  1. workers.tomcat_home=/usr/local/tomcat    #指定tomcat的目錄――如果2個tomcat在同一臺機器該選項去掉
  2. workers.java_home=/usr/local/jdk         #指定jdk的目錄
  3. ps=/                                    
  4. worker.list=controller                   #指定負載名,這個可以隨便起,與下面的 worker.controller.type=lb要對應

  5. #========tomcat1======== 第一臺tomcat的配置
  6. worker.tomcat1.port=8009
  7. worker.tomcat1.host=localhost   #這裏也可以寫IP
  8. worker.tomcat1.type=ajp13      
  9. worker.tomcat1.lbfactor=1       #權量 數值越大,分配的機率就最小

  10. #========tomcat2===========
  11. worker.tomcat2.port=8009
  12. worker.tomcat2.host=192.168.19.81 (tomcat2的IP)
  13. worker.tomcat2.type=ajp13
  14. worker.tomcat2.lbfactor=1

  15. #========controller,負載均衡器=======
  16. worker.controller.type=lb
  17. worker.controller.balance_workers=tomcat1,tomcat2  # server.xml配置文件裏的jvmRoute="tomcat1"指定的名字
  18. worker.controller.sticky_session=1
複製代碼
三、tomcat集羣配置,session 同步配置:
1、tomca1 tomcat 2 在同一臺機器
Tomcat 1  (IP: 192.168.19.199)
  1. A、修改Engine節點信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
  2. B、去掉<Cluster>  </Cluster> 的註釋符
  3. C、修改Cluster 節點信息
  4. <Membership              
  5. className="org.apache.catalina.cluster.mcast.McastService"               

  6. mcastBindAddress="192.168.19.199"               
  7. mcastAddr="224.0.0.1"               
  8. mcastPort="45564"   
  9. mcastFrequency="500"               
  10. mcastDropTime="3000"/>
  11.       <Receiver         
  12. className="org.apache.catalina.cluster.tcp.ReplicationListener"               

  13. tcpListenAddress="192.168.19.199"               
  14. tcpListenPort="4001"               
  15. tcpSelectorTimeout="100"               
  16. tcpThreadCount="6"/>
複製代碼
Tomcat 2  (IP: 192.168.19.81)
  1. A、修改Engine節點信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
  2. B、去掉<Cluster>  </Cluster> 的註釋符
  3. C、修改Cluster 節點信息
  4. <Membership      
  5. className="org.apache.catalina.cluster.mcast.McastService"
  6. mcastBindAddress="192.168.19.199"
  7. mcastAddr="224.0.0.1"
  8. mcastPort="45564"
  9. mcastFrequency="500"
  10. mcastDropTime="3000"/>
  11. <Receiver         
  12. className="org.apache.catalina.cluster.tcp.ReplicationListener"         
  13. tcpListenAddress="192.168.19.199"
  14. tcpListenPort="4002" 一定要改
  15. tcpSelectorTimeout="100"
  16. tcpThreadCount="6"/>
  17. D、將8080 8009 8082三個節點的端口改爲
  18.    9080 9009 9082 避免 與tomcat1端口衝突
  19. 注:這裏的IP也可以不改
複製代碼
2、tomca1 tomcat 2 在不同機器上
Tomcat 1  (IP: 192.168.19.199)

  1. A、修改Engine節點信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
  2. B、去掉<Cluster>  </Cluster> 的註釋符
  3. C、修改Cluster 節點信息
  4. <Membership           
  5. className="org.apache.catalina.cluster.mcast.McastService"
  6. mcastBindAddress="192.168.19.199"               
  7. mcastAddr="224.0.0.1"               
  8. mcastPort="45564"               
  9. mcastFrequency="500"
  10. mcastDropTime="3000"/>
  11. <Receiver         
  12. className="org.apache.catalina.cluster.tcp.ReplicationListener"
  13. tcpListenAddress="192.168.19.199"               
  14. tcpListenPort="4001"               
  15. tcpSelectorTimeout="100"               
  16. tcpThreadCount="6"/>   
複製代碼
Tomcat 2  (IP: 192.168.19.81)
  1. A、修改Engine節點信息: <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
  2. B、去掉<Cluster>  </Cluster> 的註釋符
  3. C、修改Cluster 節點信息
  4. <Membership
  5. className="org.apache.catalina.cluster.mcast.McastService"               
  6. mcastBindAddress="192.168.19.81"               
  7. mcastAddr="224.0.0.1"               
  8. mcastPort="45564"     mcastFrequency="500"               
  9. mcastDropTime="3000"/>
  10. <Receiver         
  11. className="org.apache.catalina.cluster.tcp.ReplicationListener"           

  12. tcpListenAddress="192.168.19.81"               
  13. tcpListenPort="4001"               
  14. tcpSelectorTimeout="100"               
  15. tcpThreadCount="6"/>
複製代碼
修改web應用裏面WEB-INF目錄下的web.xml文件,加入標籤
<distributable/>
直接加在</web-app>之前就可以了
做tomcat集羣必須需要這一步,否則用戶的session就無法正常使用

注意事項:1、mcastAddr="224.0.0.1"  這主廣播地址因此需要開啓網卡組播功能
route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
分別在各機器上運行
2、查看端口情況:
Netstat –antl |grep 4001 同步監聽的端口
tomcat1
net-199.jpg
tomcat2
net-81.jpg
3、測試廣播
java -cp tomcat-replication.jar MCaster 224.0.0.1 45564 Terminal1
java -cp tomcat-replication.jar MCaster 224.0.0.1 45564 Terminal2
如果不報錯則能正常廣播
tomcat-replication.jar 下載:http://cvs.apache.org/~fhanik/tomcat-replication.jar
如果是二臺機器,可以用tcpdump 抓取包


五、測試 集羣及session同步
在webapps 下新建test 目錄
目錄下建WEB-INF目錄下的web.xml文件
  1. <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  4.     version="2.4">
  5.        <display-name>TomcatDemo</display-name>
  6.        <distributable/>
  7. </web-app>
複製代碼
再在webapps 下 建立print.jsp   test.jsp
Print.jsp :
  1. <%
  2.    System.out.println("www.linuxtone.org   liuyu.blog.51cto.com");
  3. %>
複製代碼
test.jsp
  1. <%@ page contentType="text/html; charset=GBK" %>
  2. <%@ page import="java.util.*" %>
  3. <html><head><title>Cluster App Test</title></head>
  4. <body>
  5. Server Info:
  6. <%
  7. out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
  8. <%
  9.   out.println("<br> ID " + session.getId()+"<br>");
  10.   String dataName = request.getParameter("dataName");
  11.   session.setAttribute("myname","session?");
  12.   if (dataName != null && dataName.length() > 0) {
  13.      String dataValue = request.getParameter("dataValue");
  14.      session.setAttribute(dataName, dataValue);
  15.   }
  16.   out.print("<b>Session P±?b>");
  17.   Enumeration e = session.getAttributeNames();
  18.   while (e.hasMoreElements()) {
  19.      String name = (String)e.nextElement();
  20.      String value = session.getAttribute(name).toString();
  21.      out.println( name + " = " + value+"<br>");
  22.          System.out.println( name + " = " + value);
  23.    }
  24. %>
  25.   <form action="index.jsp" method="OST">
  26.     &ucirc;&sup3;?<input type=text size=20 name="dataName">
  27.      <br>
  28.     ?:<input type=text size=20 name="dataValue">
  29.      <br>
  30.     <input type=submit>
  31.    </form>
  32. </body>
  33. </html>
複製代碼
重啓所有的服務。

訪問 http://192.168.19.199/test/print.jsp
如圖可以看出tomcat 集羣配置完成
199-t1-t2.jpg
Session 複製的查看
在同一窗口,輸入名稱和值,
在日誌可以看到如下結果. 這種結果表明成功了
tomcat1
x1.jpg
tomca2
x2.jpg


錯誤總彙:
skipping state transfer. No members active in cluster group."
mcastBindAddress 沒有添加或添加得不對

?Unknown default host: ajp13
JK 配置不當
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章