在实验之前先来了解下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
刷新页面