Tomcat實現session保持的三種方式、使用msm方式搭建jsp網站

Tomcat簡單的來講相似於php的功能,主要實現java程序的編譯,最後呈現給用戶的是html格式的代碼,使用用戶能夠在瀏覽器中訪問。Tomcat是Java語言研發的,因此依賴於java的虛擬機(jvm)。php

1、使用前端調度器實現實現session保持

實現的原理以下圖,會話保持使用前端的調度器實現。例如:使用Ngnix調度時,使用ip_hash算法就能夠實現。css

1

配置步驟:

一、安裝配置 Tomcat

操做系統: CentOS 6,5
目標主機:172.16.10.122  172.10.10.133

第一步:安裝Java虛擬機 

### 得到jdk軟件 jdk-6u31-linux-x64-rpm.bin 這裏說明:對應的jdk版本有bin版本和rpm版本,
能夠根據本身的須要下載。下載地址是:
### 安裝步驟
chmod +x jdk-6u31-linux-x64-rpm.bin
./jdk-6u31-linux-x64-rpm.bin
## cat /etc/profile.d/java.sh 
export JAVA_HOME=/usr/java/latest
export PATH=/usr/java/latest/bin/:$PATH
### 
source /etc/profile.d/java.sh 

第二步:安裝tomcat

### 得到tomcat軟件 apache-tomcat-7.0.55.tar.gz 
### 安裝步驟
tar xf ache-tomcat-7.0.55.tar.gz -C /usr/local
ln -sv apache-tomcat-7.0.55 tomcat
### cat /etc/profile.d/tomcat.sh 
export CATALINA_HOME=/usr/local/tomcat
export PATH=$CATALINA_HOME/bin:$PATH
###

第三步:添加測試站點,站點的目錄數以下:
### tree /usr/local/tomcat/webapps/test/
/usr/local/tomcat/webapps/test/
|-- WEB-INF
|   |-- classes
|   `-- lib
`-- index.jsp
3 directories, 1 file

# 3個目錄WEB-INF classes lib 1個文件 
# 文件內容:172.16.10.122
<%@ page language="java" %>
<html>
  <head><title>TomcatA</title></head>
  <body>
    <h1><font color="red">TomcatA.example.com</h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("example.com","example.com"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>
# 文件內容:172.16.10.133
<%@ page language="java" %>
<html>
  <head><title>TomcatB</title></head>
  <body>
    <h1><font color="blue">TomcatB.example.com</h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("example.com","example.com"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>


第四步:啓動tomcat

catalina.sh start

結果示例:

2

3

4

以上測試成功後,配置如下的內容。

二、配置前端調度器

操做系統: CentOS 6,5
目標主機:172.16.10.1

第一步:安裝Ngnix
### 能夠使用源碼編譯安裝,也可以使用rpm方式安裝(需配置好epel源)這裏使用 rpm方式安裝。
yum install ngnix -y
第二步:配置Ngnix前端調度
### cat /etc/nginx/conf.d/default.conf 主要配置以下:
upstream www.tomcat.org {
	ip_hash;
	server 172.16.10.122:8080;
	server 172.16.10.133:8080;
}

server {
    listen       80;
    server_name  www.tomcat.org;

    location / {
        proxy_pass http://www.tomcat.org;
        index  index.jsp index.html index.htm;
    }

}

結果測試:

5

這是經過ip_hash調度方法實現的。思考以下問題:這樣作還能減輕後端tomcat的壓力嗎??html

解決辦法:將session信息在每一個Tomcat節點上保存一份,作成tomcat集羣(session集羣)。前端

2、使用tomcat集羣保持session

實現架構不變。java

一、配置tomcat集羣

### 在 /usr/local/tomcat/conf/server.xml 的<Host> </Host>內部如下內容添加:
目標主機:172.16.10.122 172.16.10.133

<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"
                address="228.10.10.14"
                port="45564"
                frequency="500"
                dropTime="3000"/>
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
              address="172.16.10.122/172.16.10.133"  
               # 注意此選項默認是auto,這裏須要配置。每一個節點配置本身的ip地址,
               # 意思是接收session心跳消息的地址
              port="4000"
              autoBind="100"
              selectorTimeout="5000"
              maxThreads="6"/>

    <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"/>
  </Channel>

  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
         filter=""/>
  <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

  <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
            tempDir="/tmp/war-temp/"
            deployDir="/tmp/war-deploy/"
            watchDir="/tmp/war-listen/"
            watchEnabled="false"/>

  <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
  <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>


### 在相應應用程序的web.xml中添加<distributable\>; 也能夠全局添加
目標主機:172.16.10.122 172.16.10.133

cp /usr/local/tomcat/webapps/test/WEB-INF/web.xml /usr/local/tomcat/webapps/test/WEB-INF/

# 編輯 /usr/local/tomcat/webapps/test/WEB-INF/web.xml 在 <web-app> 中添加:
<distributable/>;

二、配置前端調度器

這裏主要是使用輪詢調度,不使用ip_hash調度。只需將配置文件中的ip_hash去掉便可。mysql

結果示例:

配置完成後,重啓tomcat便可。linux

8

從結果中能夠知道,實現了session保持。nginx

6

7

思考以下問題? 這種方式的session保持是經過每一個節點保存一份session信息,可是:但集羣節點不少時,這些seesion信息多是很大級別的。此時,各個節點之間的session複製反而成了影響系統性能的瓶頸。web

解決辦法: 使用session服務器,將seession信息統一保存到緩存服務器中。算法

2、使用session服務器(memcached)來保持session

試驗拓撲圖以下:

9

tomcat實現此功能要藉助於msm(Memcached-Session-Management)模塊能夠實現。須要下載jar包, javolution、memcached-session-manager-tc七、spymemcached、memcached-session-manager、msm-javolution-serializer 。將這些jar包拷貝到/usr/local/tomcat/lib/目錄下,支持msm功能。這些包能夠再Google Code中找到。

下載時要注意:要與tomcat的版本相對應。

一、配置memcached

操做系統:CentOS 6.5
目標主機:172.16.10.1 172.16.10.9

yum install memcached -y
service memcached start

二、配置tomcat

目標主機:172.16.10.122 172.16.10.133

## 在試驗一的基礎上,繼續配置
### 在 /usr/local/tomcat/conf/server.xml 的<Host> </Host>內部如下內容添加:
<Context path="/test" docBase="/usr/local/tomcat/webapps/test/" reloadable="true">
         <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
                  memcachedNodes="n1:172.16.10.9:11211,n2:172.16.10.1:11211"
                  failoverNodes="n1"
                  requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
	          transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
         />        
</Context>

三、配置Ngnix前端調度方法,同試驗二同樣。

結果示例:

10

11 

補充說明:

對於前端調度器也可以使用apache和haproxy反向代理器。

4、Tomcat實例

tomcat + memcacahed + nginx + mysql + nfs 實現jsp格式的論壇。試驗拓撲圖以下:

13

一、配置數據節點 172.16.10.1

#### 配置 NFS 服務器
mkdir /tomcatdata
# 編輯 /etc/exports,添加:
/tomcatdata 172.16.0.0/16(rw)
service nfs start

### 配置 mysql
yum install mysql-server -y 
servive mysqld start
mysql> CREATE DATABASE jcenter1;
mysql> GRANT ALL ON jcenter1.* TO jcenter@'172.16.%.%' IDENTIFIED BY 'jcenter';
mysql> FLUSH PRIVILEGES;

二、配置tomcat

在試驗一的基礎上:

目標主機: 172.16.10.122 172.16.10.133

第一步:搭建站點

mkdir /tomcat/webapps/
mount -t nfs 172.16.10.1:/tomcatdata /tomcat/webapps/

# 獲取jsp程序 JavaCenter_Home_2.0_GBK.tar.bz2 java程序代碼
tar -xf JavaCenter_Home_2.0_GBK.tar.bz2 -C /tomcat/webapps/
cd /tomcat/webapps/
ln -sv JavaCenter_Home_2.0_GBK jct

# 配置 JavaCenter:/tomcatdata/jct/config.properties
# 主要修改如下:
# 數據庫服務器地址(通常爲本地localhost或127.0.0.1)
dbHost = 172.16.10.1
# 數據庫服務器端口號(通常爲3306)
dbPort = 3306
# 數據庫用戶名
dbUser = jcenter
# 數據庫密碼
dbPw = jcenter
# 數據庫名
dbName = jcenter1

第二步:配置tomcat
<Host name="www.tomcat.org"  appBase="/tomcat/webapps"
      unpackWARs="true" autoDeploy="true">
   <Context path="/jct" docBase="jct" />
       <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
                memcachedNodes="n1:172.16.10.9:11211,n2:172.16.10.1:11211"
                failoverNodes="n2"
                requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
		transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
       />            
    </Context>
</Host>


# 固然msm所依賴的jar包要拷貝到對應的目錄下
從新啓動tomcat.

結果示例:

14

15

16

18

至此,配置基本完成。

相關文章
相關標籤/搜索