在實驗之前先來了解下tomcat會話管理器(Manager)
Manger對象用於實現HTTP會話管理的功能,介紹下幾種常見的:
1、StandardManager(標準會話管理器)
用於非集羣環境中對單個處於運行狀態的Tomcat實例會話進行管理。當Tomcat關閉時,這些會話相關的數據會被寫入磁盤上的一個名叫SESSION.ser的文件,並在Tomcat下次啓動時讀取此文件。如果tomcat正常關閉會話不會丟失,如果是tomcat主機崩潰或者進程崩潰那會話是一定會丟失的。
2、PersistentManager (持久會話管理器)
當一個會話長時間處於空閒狀態時會被寫入到swap會話對象,這對於內存資源比較吃緊的應用環境來說比較有用。
3、DeltaManager (集羣會話管理器)
用於配置一個tomcat會話集羣,加入當前集羣組中的節點並在各節點間傳遞心跳信息,而且可以在接收不到某成員的心跳信息時將其從集羣節點中移除,節點之間會通過多播通道將自己的會話消息傳遞給其他節點,使得每個節點會話共享。(這個看似很完美,但是如果在大規模的集羣中,同步的會話量將會很大,造成很大的資源佔用這是非常不適用的。)
4、BackupManager
用於Tomcat集羣的會話管理器,與DeltaManager不同的是,某節點會話的改變只會同步給集羣中的一個節點或者有限節點,而非全部節點。這樣可以有效降低會話同步的代價。
實驗一、配置一個session共享集羣(DeltaManager)
實驗環境:RHEL6.4+Tomcat/7.0.55
admin1.tuchao.com 192.168.18.201 //tomcat服務器
admin2.tuchao.com 192.168.18.202 //tomcat服務器
admin3.tuchao.com 192.168.18.203 //Apache服務器
admin1安裝jdk與tomcat(略)
配置測試頁面
mkdir /usr/local/tomcat/webapps/testapp{classes,WEB-INF} -pv
vim /usr/local/tomcat/webapps/testapp/index.jsp
加入以下代碼:
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA </font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("abc","abc"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
配置完成後啓動tomcat。
admin2安裝jdk與tomcat(略)
配置測試頁面
mkdir /usr/local/tomcat/webapps/testapp{classes,WEB-INF} -pv
vim /usr/local/tomcat/webapps/testapp/index.jsp
加入以下代碼:
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="blue">TomcatB </font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("abc","abc"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
配置完成後啓動tomcat。
admin3 配置Apache反向代理,負載均衡。 (這個過程我們在前篇博文有講到這裏略)
請參考:http://tchuairen.blog.51cto.com/3848118/1539278
配置集羣
編輯 /usr/local/tomcat/conf/server.xml 在Engine段中添加如下代碼:
<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.50.10.1"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.18.201"
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>
我們配置的時候要修改的只有下面兩個段:
Membership
用於Channel中配置同一通信信道上節點集羣組中的成員情況,即監控加入當前集羣組中的節點並在各節點間傳遞心跳信息,而且可以在接收不到某成員的心跳信息時將其從集羣節點中移除。 需要將這段內容中的多播地址,修改爲自己適用的。Tomcat6中Membership的實現是org.apache.catalina.tribes.membership.McastService。
Receiver
用於Channel定義某節點如何從其它節點的Sender接收復制數據,Tomcat6中實現的接收方式有兩種BioReceiver和NioReceiver。 需要修改用於從其他節點接收數據的IP地址。
給需要配置會話共享集羣的應用程序配置使用分佈式會話
編輯應用程序目錄下WEB-INF文件夾中的web.xml文件
在web-app段中添加 <distributable />
如圖:
注意這些步驟每個集羣節點都要配置,之後重啓tomcat服務。
訪問我們的負載均衡服務器192.168.18.203/testapp
刷新頁面