热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何利用OCS缓存TomcatSession全局变量(转)

转:首先非常感谢阿里云给我们提供了一个如此省事的平台。我们公司是一家物流公司,主要提供运输和仓储的服务。我们现在正在

转:

首先非常感谢 阿里云给我们提供了一个如此省事的平台。 
我们公司是一家物流公司,主要提供运输和仓储的服务。我们现在正在把我们的系统往阿里云迁移。当然,还在迁移过程中,所以还有很多是没办法现在说得太清楚。但鉴于现有估计用阿里云的公司或个人越来越多,确实没有一个在阿里云搭建基于ECS的Tomcat集群的教程。我这就给大伙献丑了。这是个入门教程,同时其中也存在问题,还望大家指正。 
首先,我们明确目标,做Tomcat集群的目的是为了提供更高的负载能力,把访问均摊到不同的服务器上。为此我们准备的配置清单是: 
SLB x 1    ECS x 2    OCS x 1    RDS x 1 
 
 
 
 
我们系统使用的软件也是应用厂商提供,不像阿里的技术那么牛逼,所以其内部还是使用了如Session等之类的标准技术。而我们对于集群的定义就是可以保持Session,确保用户登录后正常使用。 
在阿里云或者是其他方式玩集群一般也都分为两种模式,一种是完全集中SESSION,各个集群点保持一致;还有一种就是基于一次会话指定某一个集群中节点提供服务。这个可能没说太明白,那么请参考SLB的资料,SLB其中有个是否保存会话(这个就对应到我们TOMCAT里面的配置模式是采用STICKY or NON-STICKY模式),本分享会说到两种模式,并且也会讨论关于我们在使用中发现的问题(这不会是我司部署的最终版本,因为我们每天都还在不断调整)。 
 
 
首先,ECS要安装TOMCAT和JDK。这个很简单,网上很多教程。 我这就不介绍了。我们用的是TOMCAT7 以及 JDK7。建议TOMCAT先下载到自己电脑,配置好了再上传到ECS。  
 
 
Step.1 TOMCAT增加memcached支持的lib包 
我们需要memcached-session-manager,http://code.google.com/p/memcached-session-manager/。其中文档说得比较明确,参考其中去配置就好。 
那么在本步骤中,我们主要是下载一些lib,在上面链接中的文档中有给出。自己找下啦。把下载到的lib放到Tomcat/lib目录里面(注意每个文件前缀的“msm-”这个本来是没有的,是我为了方便管理加的),有了这些包之后就可以配置TOMCAT连接到OCS啦: 
 
 
 
 
Step.2 TOMCAT同步Session到OCS 
这个步骤就是具体配置了。前面说到有两种模式:STICKY or NON-STICKY。 
STICKY:负载均衡会根据用户会话,每次都分配到同一个集群节点上。用户每次获取会话数据都是从TOMCAT里面取得,TOMCAT会备份一个SESSION到OCS。 这样可以保持获取SESSION的最高效。 
NON-STICKY:负载均衡不会管用户会话,而是按每次连接分别分发的方式,会话都保持在OCS上,每次读写都在OCS上。由于会远程访问数据,所以效率会低一些,但是这种却是最符合集群或集中缓存预期效果的。 
关于连接到OCS的配置,都是在/Tomcat/conf/context.xml中编辑,在元素下增加下述的配置描述即可。 
下面我们分别说两种的配置(只能有一种模式,千万别写两个上去了): 
STICKY模式 
            memcachedNodes="OCS的地址:11211"  
        username="OCS实例名" 
        password="OCS密码" 
        memcachedProtocol="binary" 
        sticky="true"  
        sessiOnBackupAsync="true"    
        sessiOnBackupTimeout="1000" 
        requestUriIgnorePattern=".*\.(gif|jpg|jpeg|png|bmp|swf|js|css|html|htm|xml|json)$" 
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
 
 
NON-STICKY模式 
             memcachedNodes="OCS的地址:11211"  
        username="OCS实例名" 
        password="OCS密码" 
        memcachedProtocol="binary" 
        sticky="false"  
        lockingMode="auto"  
        sessiOnBackupAsync="false"    
        sessiOnBackupTimeout="1000" 
        requestUriIgnorePattern=".*\.(gif|jpg|jpeg|png|bmp|swf|js|css|html|htm|xml|json)$" 
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
 
 
其实配置是不是很简单呐,总之里面配置跟连接Memcached是一样的,所以我对阿里的这种设计非常之赞赏。 
其中就注意一点,一定要有memcachedProtocol="binary",否则是用不了的,因为Tomcat memcached插件模式这个属性值是text,而阿里支持的是binary模式的数据,所以务必务必要注意。 
 
 
Step.3 修改TOMCAT的JVM设置以及NIO(这个步骤跟OCS无关) 
修改JVM设置在/Tomcat/bin/目录下,增加setenv.sh文件,写定要优化的配置。 
我配置的如下,这个JVM参数有点问题,GC回收跟过山车一样。还需要继续改,所以不建议参考。如果有高人还望指点。ECS配置是双核/4G配置,用的CentOS 6.5 x64。 
CATALINA_OPTS="-server -Xms3072m -Xmx3072m -Xmn1024m -Xss256K -XX:PermSize=128m -XX:MaxPermSize=128m -XX:SurvivorRatio=16 -XX:NewSize=1024m -XX:MaxNewSize=1024m"
 
 
修改NIO设置在/Tomcat/conf/context.xml 
注释掉原有的COnnector=8080的定义,增加如下的配置定义,使用NIO方式 
               protocol="org.apache.coyote.http11.Http11NioProtocol"   
               cOnnectionTimeout="20000"  
               URIEncoding="UTF-8"  
               useBodyEncodingForURI="true"  
               enableLookups="false"  
               redirectPort="8443" />
 
 
Step.4 创建一个检查SESSION的JSP 
创建一个JSP文件到Tomcat/webapps/ROOT目录下 
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> 
<% 
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 
 
 
   
       
     
     
     
         
     
     
     
   
   
     
    

 
    <% 
     out.println("This is (TOMCAT1), SESSION ID:" + session.getId()); 
    %> 
    

 
   
 
 
Step.5 上传你配置好的TOMCAT到ECS 
上传后启动,正常这个时候你就看见你的TOMCAT了。http://yourserver:8080/session.jsp,如果你看见的是如下字样,说明你的TOMCAT连接OCS成功了。 
“ 
 
This is (TOMCAT1), SESSION ID:CAC189E5ABA13FFE29FCB1697F80182B-OCS 
 
 
” 
 
 
如果你用的是SLB,两个ECS,并且使用的NON-STICKY模式,通过负载后你会看到内部的Server在变,但是SESSION不变。 
 
 
接下来,说问题 
使用PTS压测session.jsp,100用户,TOMCAT配置NON-STICKY模式下。此刻使用浏览器访问session.jsp会出现SESSION_ID每次看都不一样的情况。没有执行压测的时候就正常的,也就是在大并发情况下OCS会出奇怪的问题么? 
现在为了防止这种情况出现,我们已经换成了STICKY模式。即通过SLB分发会话到同一个节点机器执行服务,OCS只是做一个SESSION备份,防止节点宕机,另外节点可以重新获取到继续提供服务。 
就是如此了,还请OCS团队给个答复或者是建议。或者有高人能指点下,怎么弄才是最好的办法呢? 
 
[ 此帖被Happy_Tian在2014-11-07 13:06重新编辑 ]

推荐阅读
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • SpringMVC工作流程概述
    SpringMVC工作流程概述 ... [详细]
author-avatar
透明的眼泪2502913707
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有