`
宇宙浪子
  • 浏览: 48133 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

tomcat集群 session共享 memcached-session-manager教程2

阅读更多

 

tomcat集群扩展session集中管理,Memcached-session-manager使用

研究tomcat做负载均衡的时候如何实现ha,还有就是不采用session复制的方法做集群

想到的是将session全部存储在后端的缓存服务器中。

正好网上有这么一个工具Memcached-session-manager(后面简称msm),所以直接扒下来用了。

地址如下:

http://code.google.com/p/memcached-session-manager/


msm支持 stickty(沾粘会话)和non-sticky(非沾粘会话)两种集群方式。

sticky就是前端的loadbanlence能保证每个用户的请求都路由到了同一个tomcat上。

non-sticky则每一次请求都可能路由到了不同的tomcat中。

至于msm在这两种方式是怎么处理的看下图:

下图来自javaeye的xxtianxiaxing的博客,我这里引用一下,原文地址为http://xxtianxiaxing.iteye.com/blog/1269704

1. sticky



2. non-sticky



用msm的session管理manager替代tomcat自身的standardManager。

可以配置在虚拟服务器的context标签中,也可以在context.xml里面全局配置。


<!--sticky 
        
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:localhost:11211"
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
      copyCollectionsForSerialization="false"

<!--下面这个是可选的,自己定义特殊的类注册到kryo自定义转换器中,实现序列化-->

customConverter="com.test.serializer.CustomKryoRegistration"

        />       
  -->
  <!--non sticky  
   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
      memcachedNodes="n1:localhost:11211"
      sticky="false"
      sessionBackupAsync="false"
      lockingMode="auto"
      requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
      transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />

上面采用的序列化方式是kryo,根据官方提供的数据,这个的序列化效率是最好的,我下面有一些简单的测试。

感觉kryo的效率主要体现在高并发下面。如果非高并发感觉跟java的自带io差不多。如果不使用kryo进行序列化,采用java默认方式的话,请将transcoderFactoryClass改为:de.javakaffee.web.msm.JavaSerializationTranscoderFactory

另外在使用kryo进行序列话的时候,有时候会报序列话错误。我开始就报ConcrrentHashMap这个类不能序列化的错误。tomcat在的session的Atrribute使用了这个数据结构来保存。要解决这个问题,需要自己写一个类,将这些特殊的类注册进去。然后打个jar包放tomcat的lib下。就ok了。


下面是例子:

package com.test.serializer; 
import java.util.concurrent.ConcurrentHashMap; 

import com.esotericsoftware.kryo.Kryo; 
import com.esotericsoftware.kryo.serialize.MapSerializer; 

import de.javakaffee.web.msm.serializer.kryo.KryoCustomization; 

public class CustomKryoRegistration implements KryoCustomization { 
public void customize(Kryo kryo) { 
kryo.register(ConcurrentHashMap.class, new MapSerializer(kryo)); 


把这个类打好jar包放tomcat的lib目录下。然后还需要在context中配置customConverter="com.test.serializer.CustomKryoRegistration",这样就OK了。

另外集成kryo序列化的环境需要以下jar包。刚开始googleCode的官方网站上没写。搞了半天,后来提醒原作者加上了:

kryo-serializer: msm-kryo-serializer, kryo-serializers, kryo, minlog, reflectasm, asm-3.2

其他序列化方式(java自带的序列化方式外的3方序列化方式)需要的jar:

javolution-serializer: msm-javolution-serializer, javolution-5.4.3.1
xstream-serializer: msm-xstream-serializer, xstream, xmlpull, xpp3_min
flexjson-serializer: msm-flexjson-serializer, flexjson
可以查看官方网站的文档:http://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration

搭建好所有环境之后,采用1 nginx(ip_hash)+2 tomcat6.0.35+sticky(最好用6.0.2以上版本,因为新的msm包里面使用了6.0.2才有的新方法,不然会报NoSuchMethod-changeSessionId()的错误)

验证是否成功

登录发布的系统(发现这个时候请求全部路由到tomcat1),之后,关闭tomcat1,继续在里面做有关session的操作。发现这个时候请求被tomcat2接管,而且session依然保持(从memcached中拿出)。ok,这样就说明成功了。

non_sticky的配置一样按上面的方法来验证是否成功。



*********最后是我在搭建好msm环境后做的一些简单测试:***************

测试环境:T5870 2.0G cpu,内存2G小本本,win7系统。tomcat,memcache全部装win7上。启动一个memcahed服务给了32m内存。tomcat52m内存。

ok,首先是前面没有负载均衡,单个tomcat的情况,请求一个sevlet链接,链接就是从session取个值出来的操作。

用apache ab,-C 参数带上cookie参数模拟有session的请求,100人,共5000次请求是下面的结果:

不用msm: 1000req/s
msm-sticky kryo: 850req/s
msm-sticky java标准序列化: 830req/s
msm-nonsticky kryo : 440/s(50人并发) 430/s(100人并发)
msm-nosticky java标准序列化 : 480/s(50人并发) 270/s(100人并发)

在sticky的情况下,因为在本地有session的情况下,省略了从memcached取session缓存的情况,序列化次数不多,因此性能只有大概1/10的损耗。

在non-stikcy的情况下,集中的每次从memcached取session,性能损失了大概一半。

而可以看出,在高并发的情况下,kryo序列化比java标准序列化要好。并发性能大概在java标准序列化一倍以上。而且在搞并发的non-sticky的情况下,session中的多线程并行操作冲突严重。lock很多(当然这个lock模式可以设置,甚至可以完全不要锁)。这也严重降低了速度。

又测试了1台nginx(ip_hash做负载均衡)+2tomcat的情况

因为暂时没法模拟多ip的请求,所以所有请求都只路由到了tomcat1上。采用kryo序列化的策略依然保持了高并发下处理速度不下降的优势。

还是400多r/s,而java标准序列化还是要低一半多。


最后推荐采用sticky+kryo的策略来实现msm~!

 

详见 http://hi.baidu.com/drnadmhzfnacefe/item/87cead68940ef408a1cf0fa2

分享到:
评论

相关推荐

    tomcat9+tomcat-cluster-redis-session-manager_4.0.zip

    Tomcat Cluster Redis Session Manager是一个插件,它允许Tomcat集群中的各个节点共享和同步Session信息,确保用户在集群中的任何服务器上都能保持登录状态。 集成Tomcat集群和Redis Session Manager的过程大致如下...

    Nginx+Tomcat+Memcached-Session-Manager集群Session共享

    在本篇文章中,我们将深入探讨如何使用Nginx、Tomcat和Memcached-Session-Manager(MSM)来构建一个集群环境,并实现Session共享。这涉及到集群搭建、分布式应用以及缓存管理等多个方面的IT知识。下面将详细展开这些...

    tomcat8+memcached session共享所需的jar包

    tomcat8+memcached session共享所需的jar包, memcached-session-manager memcached-session-manager-tc8 msm-kryo-serializer spymemcached kryo-serializers所有jar包都有

    tomcat-7.0.54配合使用的memcached-session-manager1.6.1的整套jar包

    本文将详细介绍如何在Tomcat 7.0.54中集成`memcached-session-manager-1.6.1`,以实现更高效的session管理。 首先,我们需要了解`memcached-session-manager`的基本概念。这个组件由两个主要部分组成:`...

    apache-tomcat-7.0.47-memcached-各种序列化策略-session共享

    以上就是关于"apache-tomcat-7.0.47-memcached-各种序列化策略-session共享"的知识点,涵盖了Tomcat集群、Memcached的使用以及多种序列化策略的应用。通过深入理解和实践这些技术,你可以构建出高可用、高性能的Web...

    memcached-session-manager(MSM) Tomcat集群session共享示例

    memcached-session-manager(MSM) Tomcat集群session共享示例

    Memcached-Session-Manager多tomcat实现session共享配置

    **Memcached-Session-Manager与Tomcat集群中的Session共享** 在分布式系统中,尤其是在使用了多个Tomcat实例作为Web服务器的集群环境中,确保用户会话(Session)在各个节点之间共享是至关重要的。Memcached-...

    Memcached-session-manager所需最新jar包-tomcat7-kryo序列

    3. **Memcached-session-manager**:这是一个开源项目,用于在Apache Tomcat应用服务器中集成Memcached,以便将用户的会话数据存储在Memcached集群中,以实现高可用性和可扩展性。它提供了一种替代默认的基于文件或...

    memcached-session-manager 实现 tomcat session共享

    标题 "memcached-session-manager 实现 tomcat session共享" 指的是在分布式环境中,通过 memcached-session-manager 这个工具来实现 Tomcat 应用服务器之间的 Session 共享。Session 是 Web 应用中用于存储用户状态...

    memcached-session-manager_4_tomcat8

    memcached作为缓存系统,可以帮助Tomcat在多服务器环境中有效地管理和共享用户session。 **文件列表分析:** 由于只给出了一个文件名"memcached-session-manager_4_tomcat8",我们可以推测这是安装或配置该session...

    Tomcat+memcached-session-manager1.8(MSM)

    `memcached-session-manager1.8(MSM)`就是这样一个工具,它允许Tomcat将用户的session数据透明地保存到Memcached集群中,从而实现session的高可用性和可扩展性。 【描述】"最新memcached-session-manager1.8(MSM)" ...

    memcached(十一)memcached-session-manager

    描述部分为空,但根据标题可以推测,该教程可能涵盖了如何配置和集成`memcached-session-manager`到Tomcat服务器,以及如何利用这个工具来有效地分发和备份session数据,防止单个服务器故障导致session丢失。...

    tomcat8 memcached session共享jar包

    描述提到“Tomcat7 使用 memcached-session-manager-tc7-1.9.5.jar”,这表明存在一个专门为Tomcat 7设计的Memcached session管理器版本。这个jar包允许Tomcat与Memcached通信,将session数据存储在Memcached中。...

    tomcat-7.0.47-memcached-各种序列化策略-session共享

    在Tomcat中,我们可以配置一个名为`MemcachedSessionManager`的Manager组件,该组件使用Memcached作为Session的持久化存储。这样,无论用户请求发送到哪个Tomcat实例,都可以从同一个Memcached集群中获取到其Session...

    memcached-session-manager-tc6-1.6.4.zip

    标题中的"memcached-session-manager-tc6-1.6.4.zip"指的是一个与Memcached相关的session管理器的Tomcat 6版本的组件,版本号为1.6.4。Memcached是一个高性能、分布式的内存对象缓存系统,用于减少数据库负载,提高...

    tomcat8+memcached-session的连接1.9.6版本jar包

    最后,"memcached-session-manager-tc8-1.9.6.jar"是针对Tomcat8特定的适配器,确保了这个session管理器能够与Tomcat8的生命周期和API无缝集成。这个适配器处理了Tomcat8特有的配置和交互细节,让开发者无需深入了解...

    Windows + Nginx + Memcached + Tomcat 集群 session共享

    总之,Windows + Nginx + Memcached + Tomcat 集群session共享方案是一个高效且可靠的架构,它能提高系统的可用性,保证用户会话的连续性,是大规模Web应用常见的部署模式。然而,实际部署时,还需要考虑安全性、...

    tomcat7集群session共享memcache依赖包1.8.3

    2. 将解压后的jar文件(如:memcached-session-manager-1.8.3.jar及其依赖)添加到Tomcat的lib目录下。 3. 在Tomcat的conf/server.xml中,找到或标签,添加&lt;Manager&gt;子标签,指定使用MemcachedSessionManager。例如...

    tomcat集群session共享jar(三个)

    这里的“tomcat集群session共享jar(三个)”指的是实现Tomcat集群间session共享所需的一些关键组件或者库。虽然提供的文件名称列表中只有一个`tomcat-redis-session-manager`,但通常实现session共享可能会涉及多个...

    Memcached_Session_Manager jar

    总结起来,Memcached_Session_Manager jar是用于Tomcat集群环境的一个解决方案,它借助Memcached作为中央会话存储,通过javolution和kryo提高序列化效率,确保在分布式环境中正确、高效地管理用户会话。使用这个组件...

Global site tag (gtag.js) - Google Analytics