转:

首先非常感谢阿里云给我们提供了一个如此省事的平台。 
我们公司是一家物流公司,主要提供运输和仓储的服务。我们现在正在把我们的系统往阿里云迁移。当然,还在迁移过程中,所以还有很多是没办法现在说得太清楚。但鉴于现有估计用阿里云的公司或个人越来越多,确实没有一个在阿里云搭建基于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中编辑,在<Context>元素下增加下述的配置描述即可。 
下面我们分别说两种的配置(只能有一种模式,千万别写两个上去了): 
STICKY模式

    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
        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模式

     <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
        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方式

<Connector port="8080"  
               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+"/"; 
%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <base href="<%=basePath%>">   
    <title>My JSP 'session.jsp' starting page</title> 
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <meta http-equiv="expires" content="0">     
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
    <meta http-equiv="description" content="This is my page"> 
    <!-- 
    <link rel="stylesheet" type="text/css" href="styles.css"> 
    --> 
  </head> 
  <body> 
     
    <h1> 
    <% 
     out.println("This is (TOMCAT1), SESSION ID:" + session.getId()); 
    %> 
    </h1> 
  </body> 
</html>

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重新编辑 ]

如何利用OCS缓存TomcatSession全局变量(转)的更多相关文章

  1. 如何利用OCS存取PHP session全局变量

    如何利用OCS存取PHP session全局变量 阿里云技术团队:余汶龙   一.场景介绍 用户在利用PHP搭建网站时,会把一些信息存放在$_SESSION全局变量里,可以很方便的存取.在PHP的in ...

  2. 【阿里云产品公测】在Laravel4框架中使用阿里云OCS缓存

    作者:阿里云用户 supechina Laravel 是我最近用得非常多而且越用就越喜欢的一款PHP框架,由于没有向下兼容的历史包袱,完全面向对象的风格,借助 Facades 优雅的 IoC Cont ...

  3. CommonsChunkPlugin并不是分离第三方库的好办法(DllPlugin科学利用浏览器缓存)

    webpack算是个磨人的小妖精了.之前一直站在glup阵营,使用browserify打包,发现webpack已经火到爆炸,深怕被社区遗落,赶紧拿起来把玩一下.本来只想玩一下的.尝试打包了以后,就想启 ...

  4. 阿里云的OCS缓存机制

    OCS简介 OCS( Open Cache Service)为分布式高速缓存服务,主要实现热点数据的快速响应: OCS支持Key/Value的数据结构,兼容memcachebinary protoco ...

  5. webpack分离第三方库(CommonsChunkPlugin并不是分离第三方库的好办法DllPlugin科学利用浏览器缓存)

    webpack算是个磨人的小妖精了.之前一直站在glup阵营,使用browserify打包,发现webpack已经火到爆炸,深怕被社区遗落,赶紧拿起来把玩一下.本来只想玩一下的.尝试打包了以后,就想启 ...

  6. 【译】AS3利用CPU缓存

    利用CPU缓存   计算机有随机存取存储器RAM(译注:即我们常说的内存),但有更快形式的存储器.如果你希望你的应用程序的快速运行,你需要知道这些其他的存储器.今天的文章中讨论了它们,并给出了两个AS ...

  7. [WebGL入门]十八,利用索引缓存来画图

    注:文章译自http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明.我会加上[lufy:].另外,鄙人webgl研究还不够深入,一些专业词语,假设翻译有误,欢迎大家指 ...

  8. Web Api 内部数据思考 和 利用http缓存优化 Api

    在上篇<Web Api 端点设计 与 Oauth>后,接着我们思考Web Api 的内部数据: 其他文章:<API接口安全加强设计方法> 第一  实际使用应该返回怎样的数据 ? ...

  9. 利用DNS缓存和TLS协议将受限SSRF变为通用SSRF

    本文首发于先知社区 前言 这是今年BlackHat上的一个议题:When TLS Hacks You,作者是latacora的Joshua Maddux 议题提出了一个新的ssrf攻击思路,利用DNS ...

随机推荐

  1. 【kd-tree】bzoj1941 [Sdoi2010]Hide and Seek

    枚举每个点,计算离他最近的和最远的点. #include<cstdio> #include<cmath> #include<algorithm> using nam ...

  2. 自己写ORM框架 SqlHelper_DG C#(java的写在链接里)

    ORM框架想必大家都比较熟知了,即对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同 ...

  3. [f]JQ cookie插件

    jQuery.cookie = function(name, value, options) { if (typeof value != 'undefined') { options = option ...

  4. fragment的生命周期及其各个周期方法的作用

    先上生命周期图: Fragment的生命周期图: 与Activity的生命周期对比图: 由于Fragment是嵌在Activity中使用的,故其生命周期也是依赖于Activity的周期的,或者说Fra ...

  5. 关于用CSS3画图形的一些思考

    众所周知,用CSS3的圆角.转换可以画出各种不同的形状,制作不同的图案,早些前先驱者已画出经典的叮当猫,iphone手机等展示CSS3的强大实力,趁最近有空我也对CSS3进行了一些实践,颇有收获. 用 ...

  6. Python成长笔记 - 基础篇 (五)

    1.装饰器: 装饰器:器代表函数的意思,装饰器就是一个函数,作用是用来装饰其他的函数 原则: 1.不能修改被装饰函数的源代码 2.不能修改被装饰函数的调用方式 实现装饰器所需要的知识: 1.函数即变量 ...

  7. 【原创】-- tftp安装配置及使用

    环境:Ubuntu 14.04  OK6410 环境搭建: (1) $ sudo apt-get install tftp tftpd openbsd-inetd 或者安装tftp的增强版本tftp- ...

  8. JAVA的String的传值和传地址问题

    关于Java的String类型,可能你会碰到这种情况,将String类型的变量传到一个函数,在这个函数中修改变量的值,但是,实参的值并没有发生改变. Java中String的传值/传地址问题: 例子引 ...

  9. [ASE][Daily Scrum]11.17

    这两天感冒了没有第一时间更新blog和tfs,给大家抱歉了! 上周五我们已经将服务器搭建完成并成功通讯,周六周日大家非常给力的完成了很多内容! View Shilin Liu 处理来自服务器的数据 显 ...

  10. C#函数式编程之缓存技术

    缓存技术 该节我们将分成两部分来讲解,第一部分为预计算,第二部分则为缓存.缓存这个技术对应从事开发的人员来说是非常熟悉的,从页面缓存到数据库缓存无处不在,而其最重要的特点就是在第一次查询后将数据缓存, ...