Apache2+tomcat6集羣+session同步

Apache2+tomcat6集羣+session同步html

說明:借前人之鑑,寫一篇關於 tomcat集羣及session同步的問題,首先介紹tomcat集羣及作集羣的緣由和必要性;session同步的做用;各軟件的安裝配置及測試。
原理:

 
Apache是 httpd服務器,負責接收http請求,如何將請求分發給後臺tomcat,這就須要mod_jk了,mod_jk是apache用來鏈接tomcat的模塊,它須要配置在apache中。下面描述的是他們各自的分工狀況。
Apache要作的是: apache默認處理接收到的全部http請求,但可經過配置將請求轉發給某個模塊處理,而且將模塊處理結果返回,在這裏咱們將全部請求都轉發給mod_jk這個模塊去處理。
Mod_jk要作的是:
a. 登記全部的 tomcat服務器,並針對不一樣功能劃分tomcat作不一樣的配置。
b. 將從 apache接收到的請求按策略分配給tomcat,分配策略以下:
i.       對於新的會話按配置比例分發給 tomcat
ii.      對於已有會話( http中包含session信息)的請求會發送給建立該會話的tomcat
iii.    當建立會話的 tomcat沒法響應時,發送給該tomcat指定的備份tomcat。若是沒有指定,則視爲新會話處理。
Tomcat要作的是:處理 mod_jk發送過來的請求並返回結果。若是某一tomcat沒法響應應轉由其餘tomcat處理時,原有的session信息將會丟失。爲解決此問題,因而就有了session同步的概念,即多個服務器之間共享session,當某一服務器不能提供服務時不會致使用戶session丟失。Tomcat 的session共享是基於ip組播協議實現的。這裏只須要知道session同步是能夠經過配置實現的,而且是由tomcat實現的並不是mod_jk。瞭解了原理以後,配置起來就水到渠成了。
.需求
用兩臺服務器搭建 apache+tomcat測試開發環境,tomcat具備負載均衡能力,並實現session同步。
.環境
OS: CentOS 5.6
httpd-2.2.17.tar.gz
jdk-6u20-linux-i586-rpm.bin
apache-tomcat-6.0.33.tar.gz
jakarta-tomcat-connectors-1.2.15-src.tar.gz
tomcat-connectors-1.2.32-src.tar.gz
.規劃安裝
192.168.2.4---------apache+tomcat+jdk
192.168.2.5---------tomcat+jdk
.部署
Apache 安裝:
#tar httpd-2.2.17.tar.gz
#cd httpd-2.2.17
#./configure –-prefix=/usr/local/apache2 –-enable-modules=so –-enable-so
#make && make install
/usr/local/apache2/bin/apachectl start
看到 apache就配置成功了。
JDK 的安裝
#chmod +x jdk-6u20-linux-i586-rpm.bin
#./ jdk-6u20-linux-i586-rpm.bin
一路空格鍵,而後輸入 yes,回車默認就安裝到/usr/java/下了。
設置環境變量:
#vim /etc/profile添加以下內容:
#set java environment
export JAVA_HOME=/usr/java/jdk1.6.0_20
export JAVA_BIN=/usr/java/jdk1.6.0_20/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
運行,使環境生效 ;
#source /etc/profile
[root@Client ~]# java -version
java version "1.4.2"
gij (GNU libgcj) version 4.1.2 20080704 (Red Hat 4.1.2-52)
 
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
安裝tomcat
#tar –zxvf apache-tomcat-6.0.33.tar.gz
#mv apache-tomcat-6.0.33 /usr/local/tomcat
啓動一個 tomcat實例
#/usr/local/tomcat/bin/startup.sh
在瀏覽器中輸入 http://192.168.2.4:8080看到貓頭,就表明成功安裝了!
在另外一臺服務器( 192.168.2.5)上也一樣安裝jdk+tomcat。啓動便可
安裝tomcat-connectors-1.2.32-src.tar.gz
JK安裝(整合 apache tomcat)
#tar –zxvf tomcat-connectors-1.2.32-src.tar.gz
#cd tomcat-connectors-1.2.32-src/native
#./configure –with-apxs=/usr/local/apache2/bin/apxs –with-java-home= /usr/java/jdk1.6.0_20
#make && make install
/usr/local/apache2/modules目錄下會產生mod_jk.so
Apache+tomcat 整合
修改 apache配置文件,添加以下內容:
JkWorkersFile /usr/local/tomcat/conf/jk/workers.properties     //JK的配置文件,負載的配置
JkShmFile logs/mod_jk.shm
JkLogFile /usr/local/tomcat/logs/mod_jk.log         //jk的日誌文件
JkLogLevel info                      //日誌級別
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions  +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMount /*.jsp controller   //將全部 jsp的請求轉發給controller(負載均衡控制器)
修改 apache的配置文件httpd.conf
i.       DirectoryIndex中添加index.jsp
ii.      修改 DocumentRoot目錄與tomcat目錄一致。爲:/usr/local/tomcat/webapps
保存退出!重啓 apache服務。
調度器JK的配置:
#vim /usr/local/tomcat/conf/jk/workers.properties    \\整合配置文件
workers.tomcat_home=/usr/local/tomcat
workers.java_home=/usr/java/jdk1.6.0_20
ps=/
worker.list=controller   
#指定負載名,這個名字可自定義,但要與下面的 work.controller.type=lb對應
#---------tomcat1--------------- 第一臺 tomcat的配置
worker.tomcat1.port=8009
worker.tomcat1.host=localhost           //此處能夠寫本機 IP(192.168.2.4)
worker.tomcat1.type=ajp13            //使用的協議 ajp13
worker.tomcat1.lbfactor=1             //權量,數值越大,分配的概率越小
#worker.tomcat1.redirect=tomcat2     //定義 tomcat1實例若是掛掉,由tomcat2實例接替tomcat1
#---------tomcat2---------------
worker.tomcat2.port=8009
worker.tomcat2.host=192.168.2.5         //另外一臺 tomcat的IP地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor=1
#woker.tomcat2.local_worker=0
#worker.tomcat2.activation=disabled
#以上註釋掉的兩行若是開啓,則 tomcat2成爲tomcat1的備用,在tomcat1不可用的狀況下才會向tomcat2請求。
#--------controller------------- 負載均衡器
worker.controller.type=lb
worker.controller.balance_workers=tomcat1,tomcat2
#各 tomcat配置文件server.xml裏的jvmRoute="tomcat1"等指定的名字,須要各自修改一下。
worker.controller.sticky_session=1
到此處,已可實現 tomcat的負載均衡!能夠將tomcat的主頁文件index.jsp稍做修改,而後在瀏覽器中輸入http://192.168.2.4進行測試,能夠很清晰的看到,每次刷新後的頁面都不同,1,2交替出現。
 

 
Tomcat 集羣配置(session同步):
i.       修改 192.168.2.4中tomcat的配置文件server.xml

#vim /usr/local/tomcat/conf/server.xml

ii.      修改 192.168.2.5中tomcat的配置文件server.xml
注,內容信息是:
 
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
 
      <!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html (simple how to)
          /docs/config/cluster.html (reference documentation) -->
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
        <Manager className="org.apache.catalina.ha.session.DeltaManager"
        expireSessionsOnShutdown="false"
        notifyListenersOnReplication="true"/>
         <Channel className="org.apache.catalina.tribes.group.GroupChannel">
        <Membership className="org.apache.catalina.tribes.membership.McastService"
        mcastBindAddress="192.168.2.4"
        mcastAddr="224.0.0.1"
        port="45564"
        frequency="500"
        dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
        tcpListenAddress="192.168.2.4"
        port="4001"
        autoBind="100"
        selectorTimeout="5000"
        maxThreads="6"/> <!-- timeout="60000"-->
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
        <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender" /> </Sender>
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/> </Channel>
        <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
        <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> </Cluster>
保存退出!
注意事項:mcastAddr="224.0.0.1"須要開啓網卡組播功能
route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0(能夠添加至開機啓動)
Session複製配置
Tomcat集羣中的 session管理,主要有兩種方式:
1. 粘性 session
表示從同一窗口發來的請求都將有集羣集羣中同一 tomcat進行處理。配置方式是在上面worker.properties文件中代碼worker.controller.sticky_session=1
粘性 session的好處是不會在不一樣的tomcat上來回跳動處理請求,可是壞處是若是該session的tomcat崩潰,那麼以後的請求將由其餘tomcat處理,原有session失效而從新建一個新的session,這樣若是繼續從session取值,會拋出nullpointer的訪問異常。
2. session複製
session複製是指 tomcat彼此之間經過組播方式將session發送各個tomcat實例上,若是其中一個訪問出錯,則另外tomcat仍然具備有效的session內容,從而能正常接管其session。壞處是tomcat實例不少或者用戶在session中有大量操做時,組播發送的信息量十分驚人。Session複製配置則是在發佈的WEB應用程序中的web.xml中添加xml代碼<distributable/>
3.查看
[root@Client apache_tomcat]# netstat -tnlp
tcp 0 0  192.168.2.4:4001             0.0.0.0:*                 LISTEN      1990/java     
4.修改應用程序的 web.xml文件
Web.xml配置文件加上<distributable/>節點,此配置說明當前 web工程處於分佈式部署環境,若是不進行這個配置,每次訪問頁面tomcat都會產生一個新的sessionid。
</web-app>以前加上<distributable/>用於session複製。
#vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
 <description>
     Welcome to Tomcat
 </description>
<distributable/>
</web-app>
5.在 webapps目錄下建立目錄test、在test中建立print.jsp與test.jsp
#vim /usr/local/tomcat/webapps/test/print.jsp
<%
    System.out.println(wjpinrain.blog.51cto.com);
%>
#vim /usr/local/tomcat/webapps/test/test.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
  out.println("<br> ID " + session.getId()+"<br>");
  String dataName = request.getParameter("dataName");
  session.setAttribute("myname","session?");
  if (dataName != null && dataName.length() > 0) {
     String dataValue = request.getParameter("dataValue");
     session.setAttribute(dataName, dataValue);
  }
  out.print("<b>Session P± ?b>");
  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="index.jsp" method="POST">
    û³ ?<input type=text size=20 name="dataName">
     <br>
    ?:<input type=text size=20 name="dataValue">
     <br>
    <input type=submit>
   </form>
</body>
</html>
注:在兩臺服務器上均作此兩個文件,修改 web.xml。
重啓全部服務。
訪問: http://192.168.2.4/test/test.jsp
Server Info: 192.168.2.4 : 80
ID 58EDB92B320CFFD0DDE8EE948CB22DC8.tomcat1
此時我將tomcat1中止服務再刷新網頁
Server Info: 192.168.2.4 : 80
ID 58EDB92B320CFFD0DDE8EE948CB22DC8.tomcat2
能夠看出當其中一臺tomcat中止運行後,刷新後session值不變,但提供該服務的服務器已更換爲tomcat2.
到此session同步已完成!
相關文章
相關標籤/搜索