首页 » web服务 » tomcat集群实现session复制,避免单点故障导致用户需要重新登录问题

tomcat集群实现session复制,避免单点故障导致用户需要重新登录问题

时间:2013-05-31作者:felix.chan分类:web服务评论:3

环境说明:
1、前端当然可以采用LVS或nginx实现负载均衡,和故障转移。
2、后端多个tomcat6和jdk1.5

常见问题,当某个后端的tomcat节点宕机或服务死掉之后,那么访问这个节点的所有session都会失效,采用了以下的集群配置方案后,所有的后端tomcat节点的session都会实时同步复制。实现无缝转移,客户根本不会感觉到服务有异常中断。

配置如下:

1、在内,被注释的后面,添加以下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<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.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      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>

2、然后找到,再后面添加内容,集群不同节点名称不同

抱歉,只有对本文发表过评论才能阅读隐藏内容。

3、集群节点2配置中注意需要修改的地方:

抱歉,只有对本文发表过评论才能阅读隐藏内容。
还有tomcat三个监听端口也要修改。

4、修改两个tomcat中conf/web.xml,在最后一行之前,新增加一行

启动tomcat服务,若启动时出现这样的错误提示:
2010-06-28 15:04:51 org.apache.catalina.ha.deploy.FarmWarDeployer start
严重: FarmWarDeployer can only work as host cluster subelement!
则将以下部分注释掉: (一般情况都会遇到的)

1
2
3
4
5
6
7
<!--
 <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"   
  tempDir="/tmp/war-temp/"   
  deployDir="/tmp/war-deploy/"   
  watchDir="/tmp/war-listen/"   
  watchEnabled="false"/>   
-->

5、测试集群session复制效果:

在两个tomcat所定义的web目录中添加index.jsp文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
< %@ page language="java" contentType="text/html; charset=GBK"
 import="java.util.*" pageEncoding="GBK"%>
< !DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Insert title here</title>
</meta></head>
<body>
< %
out.print("<br>"+"session is new:"+session.isNew());
 
Date created = new Date(session.getCreationTime());
//得到session对象创建的时间
Date accessed = new Date(session.getLastAccessedTime());
//得到最后访问该session对象的时间
out.println("<br />"+"ID " + session.getId()+" ");
//得到该session的id,并打印
out.println("<br />"+"Created: " + created+" ");
//打印session创建时间
out.println("<br />"+"Last Accessed: " + accessed+" ");
//打印最后访问时间
 
session.setAttribute("Name","Tom");
//在session中添加变量Name=Tom
session.setAttribute("UID","12345678");
//在session中添加变量UID=12345678
 
Enumeration e = session.getAttributeNames();
//得到session中变量名的枚举对象
while (e.hasMoreElements()) { //遍历每一个变量
String name = (String)e.nextElement(); //首先得到名字
String value = session.getAttribute(name).toString();
//由名字从session中得到值
out.println("<br />"+name + " = " + value+" "); //打印
}
 
%>
</body>
</html>

由于我配置的两个tomcat的web监听端口分别为:8106和8107,
在同一浏览器中分别访问http://server_ip:8106和http://server_ip:8107 查看session的值是否有变化,如果保持一致,则说明配置成功。

6、需要注意的问题:
单个tomcat环境中的静态全局变量是不能复制的,只能在这个tomcat环境中有效,其他集群节点中无效。

假如有100个tomcat集群节点,那么我要查9点-10点这个时间段的web日志,怎么办?难要要从100个node server里进行抽取日志?能否做日志集中管理呢?
以后有机会我在写一下如何进行日志的集中管理吧。

原创文章,转载请注明: 转载自红防联盟www.rednat.com

本文链接地址: tomcat集群实现session复制,避免单点故障导致用户需要重新登录问题

|2|right
Tags: , , , , , ,
3 条评论
  1. avatar
    亚龙o China Google Chrome Windows 2013-11-29 14:05 回复

    嗯,先看过,不错。

  2. avatar
    小小包 Taiwan; Republic of China (ROC) Google Chrome Windows 2014-02-18 10:33 回复

    不錯

  3. avatar
    xiaixiao China Google Chrome Windows 2014-05-23 15:05 回复

    嗯,先看过,不错。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>