最近在研究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内存。tmcat52m内存。
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~!
分享到:
相关推荐
本文将详细介绍如何在Tomcat 7.0.54中集成`memcached-session-manager-1.6.1`,以实现更高效的session管理。 首先,我们需要了解`memcached-session-manager`的基本概念。这个组件由两个主要部分组成:`...
在IT行业中,尤其是在Web...通过这种方式,你可以构建一个高可用、可扩展的Tomcat集群,同时利用Redis的强大功能来处理Session管理,提升Web应用的服务质量和用户体验。这种架构尤其适用于高并发、高流量的Web应用。
tomcat8+memcached session共享所需的jar包, memcached-session-manager memcached-session-manager-tc8 msm-kryo-serializer spymemcached kryo-serializers所有jar包都有
3. **Memcached-session-manager**:这是一个开源项目,用于在Apache Tomcat应用服务器中集成Memcached,以便将用户的会话数据存储在Memcached集群中,以实现高可用性和可扩展性。它提供了一种替代默认的基于文件或...
**标题解析:** "memcached-session-manager_4_tomcat8" 这个标题表明我们...总结,这个主题主要关注如何在CentOS 7的Tomcat 8环境中利用Java 8和memcached来实现高效的session管理,以提升Web应用的性能和可扩展性。
在这个教程中,重点可能是如何使用memcached来存储和管理Web应用中的session数据,以提高性能和可扩展性。 **描述解析:** 描述部分为空,但根据标题可以推测,该教程可能涵盖了如何配置和集成`memcached-session-...
在本篇文章中,我们将深入探讨如何使用Nginx、Tomcat和Memcached-Session-Manager(MSM)来构建一个集群环境,并实现Session共享。这涉及到集群搭建、分布式应用以及缓存管理等多个方面的IT知识。下面将详细展开这些...
总结,Memcached-Session-Manager通过将Session数据存储在Memcached中,为Tomcat集群提供了高效、可靠的Session共享方案。通过灵活配置,可以根据系统的规模、性能需求以及容错要求来定制适合的Session管理策略。...
总结,memcached-session-manager 是解决分布式环境中 Tomcat Session 共享的有效工具,通过与 Memcached 结合,实现了跨服务器的 Session 同步,提高了系统的可扩展性和可用性。深入理解和熟练使用这个工具,对于...
memcached-session-manager(MSM) Tomcat集群session共享示例
描述提到“Tomcat7 使用 memcached-session-manager-tc7-1.9.5.jar”,这表明存在一个专门为Tomcat 7设计的Memcached session管理器版本。这个jar包允许Tomcat与Memcached通信,将session数据存储在Memcached中。...
`memcached-session-manager1.8(MSM)`就是这样一个工具,它允许Tomcat将用户的session数据透明地保存到Memcached集群中,从而实现session的高可用性和可扩展性。 【描述】"最新memcached-session-manager1.8(MSM)" ...
标题中的"memcached-session-manager-tc6-1.6.4.zip"指的是一个与Memcached相关的session管理器的Tomcat 6版本的组件,版本号为1.6.4。Memcached是一个高性能、分布式的内存对象缓存系统,用于减少数据库负载,提高...
以上就是关于"apache-tomcat-7.0.47-memcached-各种序列化策略-session共享"的知识点,涵盖了Tomcat集群、Memcached的使用以及多种序列化策略的应用。通过深入理解和实践这些技术,你可以构建出高可用、高性能的Web...
总结起来,Memcached_Session_Manager jar是用于Tomcat集群环境的一个解决方案,它借助Memcached作为中央会话存储,通过javolution和kryo提高序列化效率,确保在分布式环境中正确、高效地管理用户会话。使用这个组件...
最后,"memcached-session-manager-tc8-1.9.6.jar"是针对Tomcat8特定的适配器,确保了这个session管理器能够与Tomcat8的生命周期和API无缝集成。这个适配器处理了Tomcat8特有的配置和交互细节,让开发者无需深入了解...
在IT领域,特别是Web应用服务器的管理与优化中,Tomcat集群实现Session复制是一个关键的技术点,它确保了高可用性和负载均衡,特别是在处理大量并发请求的场景下。本文将深入探讨这一主题,涵盖其原理、配置方法以及...
总之,Windows + Nginx + Memcached + Tomcat 集群session共享方案是一个高效且可靠的架构,它能提高系统的可用性,保证用户会话的连续性,是大规模Web应用常见的部署模式。然而,实际部署时,还需要考虑安全性、...
通过以上步骤,我们构建了一个基于Nginx+Tomcat+Memcached的高可用Web服务集群,实现了Session的共享,提高了系统的扩展性和稳定性。在实际运营过程中,还需要关注监控、日志、安全等方面,确保系统的健康运行。
【标题】"tomcat6+session+memcached" 涉及的知识点主要集中在Web服务器Tomcat6的配置与使用,以及如何通过Memcached实现Session的共享存储。 【描述】"jdk7+tomcat6+memcached。依赖包" 提示了这个环境是基于Java ...