热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

配置Apache+Tomcat集群时的Session处理

上篇已将集群环境搭建好,本篇对集群原理和Session同步进行深入分析。对Web服务器进行集群,Session的安全和同步是最大的问题,实现Session同步有很多种方案,常见的可能的方式有:1、客户端Cookie加密。用的较少,此处不详述。2、Session复制。参与

上篇已将集群环境搭建好,本篇对集群原理和Session同步进行深入分析。

对Web服务器进行集群,Session的安全和同步是最大的问题,实现Session同步有很多种方案,常见的可能的方式有:

1、客户端COOKIE加密。
    用的较少,此处不详述。

2、Session复制。

    参与集群的每个节点的Session状态都被复制到集群中的其他所有节点上,无论何时,只要Session发生改变,Session数据都要重新被复制。Tomcat、JBoss、was都提供了这样的功能,其中Tomcat采用集群节点广播复制,JBoss采用配对复制机制。
    优点:每个节点都复制一份Session,一个节点出现问题时其它节点可以接替它的工作。缺点:节点间进行Session同步会占据不少系统资源,整体性能随着集群节点数的增加而急剧下降。

3、Session共享。
将所有节点的Session放到一起进行统一管理,每个节点在未参与集群以前都有自己独立的Session体系,参与到集群以后可以让所有节点将各自的Session信息用一套相同的机制保存到一个统一的地方进行存取,这样不管请求被分发到哪个节点都可以访问到其它节点创建的Session。

在上一篇<>中已经将集群环境搭建好,并且对环境进行了初步测试,下面就以该实验环境为依托,开始探索Tomcat集群下的Session管理。

1、首先进行一个实验。在balancing文件夹下创建test2.jsp,其内容如下:
<%@ page cOntentType="text/html; charset=GBK"%>

<%@ page import="java.util.*"%>

   

    <%

        out.println("Server Info=" + request.getLocalAddr() +" : " + request.getLocalPort()+"
");

       out.println("Session ID=" + session.getId()+"
");

    %>

   

    <%

        String dataName = request.getParameter("dataName");

        if (dataName !=null && dataName.length() > 0) {

        String dataValue = request.getParameter("dataValue");

        session.setAttribute(dataName, dataValue);

        }

        out.println("Session列表
");

        System.out.println("Session列表");

        Enumeration e = session.getAttributeNames();

        while (e.hasMoreElements()) {

        String name = (String)e.nextElement();

            String value = session.getAttribute(name).toString();

            out.println( name + " = " + value+"
");

            System.out.println( name +" = " + value);

       }

    %>

 

    "test2.jsp"method="POST">

    名称:textsize=20name="dataName">

    值:textsize=20name="dataValue">

    submittext="提交">

  

然后修改各个节点下的balancing站点的web.xml文件,添加distributable属性,该属性告诉servlet/JSP容器,编写的应用将在分布式Web容器中部署,如下所示:

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

  version="3.0"

  metadata-complete="true">

    Tomcat Balancing

   

接下来启动Apache和四个Tomcat,访问test2.jsp,待页面回显后做如下操作:

1)       观察Sessionid,会发现此处的SessionId比普通的id多了一个后缀名,形如:B684550D0D118DF94C41906714531714.tomcat1

2)       不断刷新页面,会发现页面的SessionId交替发生变化,但是前缀始终不变,形如:
B684550D0D118DF94C41906714531714.tomcat1
B684550D0D118DF94C41906714531714.tomcat2
B684550D0D118DF94C41906714531714.tomcat3
B684550D0D118DF94C41906714531714.tomcat4
此说明每次的请求并不是由同一个节点进行处理的

3)       接下来验证session是否被同步(即复制)。在页面的输入框分别输入(1,1)提交,(2,2)提交,(3,3)提交,观察浏览器页面和四个Tomcat的控制台,会发现每次提交后上一次的输入内容并没有被清除掉,并且每次提交进行处理的Tomcat节点并不相同,这说明节点间的session已经进行了同步复制。

4)       最后验证某个节点失效后对用户的影响。关掉tomcat1,不断刷新页面,会发现页面中不在出现后缀名为tomcat1的sessionid,但是session信息并没有丢失。

还没有完,进行上面实验的前提条件是worker.loadbalancer.sticky_session=0和worker. loadbalancer.sticky_session_force=0,当组合情况是(1,0),(0,1)或(1,1)时进行上面的实验,会是怎样的结果呢?重复上面的实验,最终我们可以得出如下的结论:
sticky_session           sticky_session_force           结论

0                                   0                                            session无黏性,session会复制

0                                   1                                            session无黏性,session会复制

1                                   0                                            session有粘性(非强制),session会复制

1                                   1                                            session有粘性(强制),session没必要再复制(此处有争议,待深入研究)

常见问题:

1、  如果同一台机器上的节点之间session能够同步,但是不同机器间的session无法同步,可能的原因是机器间的时钟不同步,需要进行同步操作。

2、  关于Cluster。
此实验中对Cluster的配置如下:

其实这只是对Cluster的最简单的一种配置,该配置下tomcat使用的是all-to-all方式的session同步,这种方式只适用于小规模的集群。文章开头列举了三种session同步策略,all-to-all属于第二种,tomcat也支持第三种,只需为Cluster配置BackupManager即可,参看http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html

3、  关于jvmRoute。
前面实验中的sessionid由两部分组成(前缀+后缀),而其后缀名就是jvmRoute配置的名称,mod_jk需要根据这个后缀名进行请求转发:当sticky_session=1时,mod_jk根据这个后缀名来判断该会话应该始终由哪个tomcat进行处理。

4、关于mod_jk。
在上一篇中说到mod_jk和tomcat集群本身没有必然联系,它只是做请求转发,下面做一个实验:

不启动apache,直接启动四个tomcat,在地址栏直接输入http://localhost:11080/balancing/test2.jsp 回车,页面上的sessiOnid=B5644757E4C8C5E5C1C6BB4557B13D16.tomcat1,然后将端口改为12080回车,页面上的sessiOnid=B5644757E4C8C5E5C1C6BB4557B13D16.tomcat2,发现两个sessionid的前缀相同 ,接着测试13080和14080都会发现sessionid的前缀相同。进一步测试,在11080端口页面下输入(1,1)提交,然后访问12080端口会发现(1,1)会回显到页面上,信息没有丢失,说明是一个session。

接下来进一步测试,将四个tomcat的jvmRoute的值都删掉,重复刚刚的实验会发现除了sessionid没了后缀,其它实验结果完全相同。至此已经完全验证了上一篇中的说法,jk和集群属于两个层次的东西。


推荐阅读
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • JavaScript 跨域解决方案详解
    本文详细介绍了JavaScript在不同域之间进行数据传输或通信的技术,包括使用JSONP、修改document.domain、利用window.name以及HTML5的postMessage方法等跨域解决方案。 ... [详细]
  • 搭建个人博客:WordPress安装详解
    计划建立个人博客来分享生活与工作的见解和经验,选择WordPress是因为它专为博客设计,功能强大且易于使用。 ... [详细]
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
  • 在尝试启动Java应用服务器Tomcat时,遇到了org.apache.catalina.LifecycleException异常。本文详细记录了异常的具体表现形式,并提供了有效的解决方案。 ... [详细]
  • Centos7 Tomcat9 安装笔记
    centos7,tom ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 解决PHP项目在服务器无法抓取远程网页内容的问题
    本文探讨了在使用PHP进行后端开发时,遇到的一个常见问题:即在本地环境中能够正常通过CURL获取远程网页内容,但在服务器上却无法实现。我们将分析可能的原因并提供解决方案。 ... [详细]
  • 从CodeIgniter中提取图像处理组件
    本指南旨在帮助开发者在未使用CodeIgniter框架的情况下,如何独立使用其强大的图像处理功能,包括图像尺寸调整、创建缩略图、裁剪、旋转及添加水印等。 ... [详细]
  • 本文详细探讨了Spring框架中遇到的NoSuchBeanDefinitionException异常,具体涉及com.thinkplatform.dao.UserLogDao Bean未定义的问题,并提供了相应的解决方案。 ... [详细]
author-avatar
悟道山水_805
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有