`
suhuanzheng7784877
  • 浏览: 702308 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ff8d036b-05a9-33b5-828a-2633bb68b7e6
读金庸故事,品程序人生
浏览量:47696
社区版块
存档分类
最新评论

使用Memcached做分布式系统的Session存储

阅读更多

1.  前言

Memcache除了可以做Hibernate的二级缓存外,还可以做很多很多事情。在互联网应用中,往往通过它作为缓存解决方案来保存数据,进而减少数据库的负载,而在分布式系统中,Session在不同Node中的复制,是一个比较常见的问题啦。而且在分布式系统中还要实现Session的修复,就是其中一个Node宕机了,另一个Node立即可以接管宕机Node的所有Session信息,Memcache又可以当做分布式系统的Session解决方案。

2.  使用Memcache的原因

作为分布式Session复制解决方案有很多,可以借助Web容器自身进行互相发心跳,监听、复制,也可以借助第三方工具进行Session托管。前者在配置上比较麻烦,各位详细请看http://suhuanzheng7784877.iteye.com/blog/987062

那个是使用Web容器自身的Session共享机制,这就有几个问题。第一,就是配置文件有点冗长,若Node较多的情况下,每个Server都得一坨一坨地摆在那里。第二,就是每个Node都得知道其他Node的存在,好进行心跳监听,以便进行Session的复制,消耗的性能相对来说比较大一些,因此还是采用一个集中式的中间件比较好,将WebSession托管出去,想要的时候尽管去中间件取就行了。当然了,如果采用黏着性访问,比如使用mod_jk这种黏着性访问,就不会跨越NodeSession也不用随时进行复制。但是对于mod_jk进行Node宕机的Session恢复和proxy一样都是使用底层的Web容器进行的,所以依然有缺点。总的来说Memcached作为分布式的托管Session的方案还是比较得当的。

3.  配置环境

大体配置也还是Apache+mod_Proxy模块+Tomcat6的配置,各位请参考http://suhuanzheng7784877.iteye.com/blog/987062即可。咱们这里只说不同的地方。

Apache的配置完全相同,在此不再赘述。

之后下载Memcachetomcat插件,请查看附件~

之后修改Tomcat Node1的配置文件{Tomcat_Home}\conf\context.xml的内容,在<Context>节点下面添加内容如下

	<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
		memcachedNodes="n1:localhost:11211"
		requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
		sessionBackupAsync="false"
		sessionBackupTimeout="1000"
		transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
		copyCollectionsForSerialization="false"
		/>

 英文都比较简单就不解释了,唯一注意的一点就是那个工厂类是de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory。对于Tomcat6,使用这个类,对于其他版本的Tomcat实现类有细微差异。之后另一个配置文件{Tomcat_Home}\conf\server.xml的内容和原始Tomcat的差不多,仅仅在<Engine>节点上做个小小的变化,标示集群的Node名称

<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">

另一个Tomcat Node配置和这个配置差不多,不再赘述。

4.  测试

下面我们依然在2Node上部署好原先那个helloWeb的工程,工程简单,就一个首页。

先开启memcache服务,之后在开启2Tomcat服务。

效果如下

 关闭node1,输入框中输入5,5,效果如下

 证明Session继续生效。关闭浏览器后,再重新打开,因为SessionID变了,所以从Session中取不到任何数据了。还要声明一点就是放入Session要想存储对象必须实现序列化接口。

iteye新版本用起来好像怪怪的~~~~

31
2
分享到:
评论
11 楼 renlei413326889 2014-11-27  
我想请问楼主 怎么样才能通过memcache客户端在程序中通过sessionId获取session?
10 楼 kingoneyou 2012-07-20  
  
9 楼 suhuanzheng7784877 2011-09-07  
sunlightcs 写道
suhuanzheng7784877 写道
sunlightcs 写道
子域名session是怎么处理的呢?
比如:我是通过iteye.com登录的,在suhuanzheng7784877.iteye.com页面还可以看到我的登录信息。
tomcat不支持二级域名了。

哦,是。这个就得需改一下应用服务器的源代码了,其实这位兄弟应该已经知道答案了吧。谢谢你的提醒,这个我应该写在这篇文章的下面的。除了修改源码,不知你有什么好办法?


资料如下:
http://my.oschina.net/baobao/blog/16727

修改源代码,部署的时候比较麻烦了,升级tomcat也要改源码,移植也是个问题,蛮麻烦的。

如果当用户登录的时候,系统给用户分配一个ID(这个ID是唯一的,可以根据sessionID生成)并存在cookie里(因为cookie支持子域名),当再次访问的时候,可以根据这个ID,判断memcached中是否有记录,如果有记录,则表示用户已经登录,取出用户信息就可以了。

不知这种方法可行不啦,还没有试过

这个我也没试过,理论上可以视为一个解决方案。
cookie 中有个domain的选项,把他设到主域名上(不带www)就行了。例如 abc.com

操作cookie如下:
String JSESSIONID = request.getSession().getId();//获取当前JSESSIONID (不管是从主域还是二级域访问产生)

Cookie cookie = new Cookie("JSESSIONID", JSESSIONID);
cookie.setDomain(".test.com"); //关键在这里,将cookie设成主域名访问,确保不同域之间都能获取到该cookie的值,从而确保session统一
response.addCookie(cookie);  //将cookie返回到客户端

request.getRequestDispatcher("indes.jsp").forward(request, response);


8 楼 sunlightcs 2011-09-07  
suhuanzheng7784877 写道
sunlightcs 写道
子域名session是怎么处理的呢?
比如:我是通过iteye.com登录的,在suhuanzheng7784877.iteye.com页面还可以看到我的登录信息。
tomcat不支持二级域名了。

哦,是。这个就得需改一下应用服务器的源代码了,其实这位兄弟应该已经知道答案了吧。谢谢你的提醒,这个我应该写在这篇文章的下面的。除了修改源码,不知你有什么好办法?


资料如下:
http://my.oschina.net/baobao/blog/16727

修改源代码,部署的时候比较麻烦了,升级tomcat也要改源码,移植也是个问题,蛮麻烦的。

如果当用户登录的时候,系统给用户分配一个ID(这个ID是唯一的,可以根据sessionID生成)并存在cookie里(因为cookie支持子域名),当再次访问的时候,可以根据这个ID,判断memcached中是否有记录,如果有记录,则表示用户已经登录,取出用户信息就可以了。

不知这种方法可行不啦,还没有试过
7 楼 suhuanzheng7784877 2011-09-07  
sunlightcs 写道
子域名session是怎么处理的呢?
比如:我是通过iteye.com登录的,在suhuanzheng7784877.iteye.com页面还可以看到我的登录信息。
tomcat不支持二级域名了。

哦,是。这个就得需改一下应用服务器的源代码了,其实这位兄弟应该已经知道答案了吧。谢谢你的提醒,这个我应该写在这篇文章的下面的。除了修改源码,不知你有什么好办法?


资料如下:
http://my.oschina.net/baobao/blog/16727
6 楼 sunlightcs 2011-09-07  
子域名session是怎么处理的呢?
比如:我是通过iteye.com登录的,在suhuanzheng7784877.iteye.com页面还可以看到我的登录信息。
tomcat不支持二级域名了。
5 楼 你若无情我便休 2011-08-03  
4 楼 suhuanzheng7784877 2011-07-04  
Jwind 写道
session 能在Memcache中一直保存吗?

是这样~~哥们,memcache有过期时间,这个具体请看
sunqi兄的
http://sunqi.iteye.com/blog/734395的文章

如果不调用httpsession的清除方法,memcache会保存这些东东一直到超时失效为之。如果调用清除方法,tomcat底层会调用memcache的sessionmanage回去调用memcache的api去清除底层的大hashmap。
3 楼 Jwind 2011-07-02  
session 能在Memcache中一直保存吗?
2 楼 dcdc723 2011-07-01  
这个要顶起来。
1 楼 yangelhun 2011-07-01  
牛123456789

相关推荐

    采用Memcached实现分布式Session所需的jar包

    在分布式系统中,Session管理是一个重要的挑战,尤其是在高并发、多服务器环境下的Web应用。Memcached,作为一个高性能、分布式的内存对象缓存系统,被广泛用于解决这个问题。本篇文章将详细探讨如何使用Memcached...

    memcached+tomcat7共享session所需要的jar包

    - **tomcat7-session-manager-memcached**:这是Tomcat7的一个Session管理器实现,它将默认的Session存储机制替换为使用Memcached。 3. **配置Tomcat**:在Tomcat的`conf/catalina.properties`文件中,添加以下...

    分布式session方案

    分布式 Session 方案是指在分布式系统中,为了解决 Session 问题而采用的方法。 Session 是 Web 应用程序中保存用户信息的机制,当用户请求时,服务器需要记录用户的信息,以便在后续请求中使用。然而,在分布式系统...

    tomcat8+memcached session共享

    在分布式系统中,session共享是一个重要的问题,因为用户在访问不同的服务器节点时,需要保持登录状态和其他会话信息的一致性。Memcached作为一个高性能的分布式内存对象缓存系统,常被用来解决这个问题。 描述中...

    阿里P7大牛实战演练到源码透析——分布式环境session丢失爬坑记

    - **Redis Session存储实现:** Redis作为常用的集中式存储解决方案之一,其Session存储实现是分布式系统中不可或缺的一部分。通过阅读Redis相关源码,理解如何高效地存储和检索Session数据。 - **Nginx负载均衡...

    memcached+tomcat的session共享

    在IT行业中,尤其是在分布式系统和Web应用开发领域,session共享是一个关键问题,特别是在集群环境中。当使用多个服务器来处理用户请求时,确保用户的session数据在所有服务器之间保持一致至关重要。"memcached+...

    session共享 memcached-session-manager 1.9.6 jar

    `memcached-session-manager`通过将用户的session数据存储在Memcached服务器上,而不是每个单独的Tomcat实例的内存中,实现了跨服务器的session共享。这意味着无论用户请求哪个服务器,他们的session数据都能被正确...

    多台tomcat服务的session共享 memcached

    在分布式系统中,Session共享是一个非常重要的问题。多台Tomcat服务的Session共享是指在多台Tomcat服务器之间共享用户会话信息,以便在用户在不同的服务器之间切换时,能够保持会话的一致性。Memcached是一种高性能...

    j2ee项目使用filter和memcached实现session服务器

    在J2EE session管理中,Memcached可以作为集中式的session存储,替代默认的基于cookie或本地服务器内存的session存储方式。 实现步骤如下: 1. **配置Memcached服务器**:首先,你需要安装并运行一个Memcached服务...

    Nginx+tomcat+memcached集群session共享(win7下)所用到

    在构建分布式系统时,有效地管理用户会话(session)是至关重要的。本教程将深入探讨如何在Windows 7环境下,利用Nginx作为反向代理,Tomcat作为应用服务器,以及Memcached作为分布式缓存来实现session共享。下面将...

    memcached tomcat 共享session

    标题中的“memcached tomcat 共享session”指的是在分布式环境中,使用memcached作为缓存系统来实现Tomcat服务器间的...实现这一功能需要对memcached、Tomcat配置、Java客户端库以及分布式系统原理有一定的理解。

    memcached-session-manager

    6. **容错与故障转移**:由于 Memcached 是分布式系统,如果一个节点失效,memcached-session-manager 可以自动切换到其他可用节点,提供了一定程度的容错能力。 7. **扩展性**:随着Web应用规模的扩大,只需添加更...

    memcached管理session资源

    Memcached管理Session资源是一种高效的Web应用session持久化策略,主要利用分布式缓存系统Memcached来存储和管理HTTP会话数据。这种方式可以解决单个服务器或集群中session共享的问题,提高系统的可扩展性和可用性。...

    memcached(十一)memcached-session-manager

    **标题解析:** "memcached(十一)memcached-session-manager" 这个标题指的是一个关于memcached缓存系统与...通过这个教程,读者将能够掌握如何利用memcached作为session存储机制,提升Web应用的效率和可靠性。

    nginx+tomcat+memcached服务架构实现session共享所需jar包

    在构建分布式系统时,有效地管理用户会话(session)是至关重要的一步。"nginx+tomcat+memcached"服务架构是一种常见的解决方案,它利用Nginx作为反向代理和负载均衡器,Tomcat作为Java应用服务器,而Memcached作为...

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

    3. **Memcached**:是一个开源的、高性能、分布式内存对象缓存系统,用于存储session数据,使得所有Tomcat实例可以访问同一份session信息。 4. **Tomcat**:Apache Tomcat是Java Servlet和JavaServer Pages(JSP)的...

    43_说说你们的分布式session方案是啥?怎么做的?.zip

    分布式会话是指在分布式系统中,用户的会话状态能够在集群中的所有节点间共享和同步。这样,无论用户请求发送到哪台服务器,都能获取到正确的会话信息,确保用户体验的一致性。 在Java开发中,常见的分布式Session...

    Tomcat memcached Session依赖jar包

    传统的Tomcat会话管理机制可能会导致性能瓶颈,特别是在大型分布式系统中。为了解决这个问题,开发人员常常采用第三方解决方案,如将Session数据存储到内存缓存系统,如memcached。这就是"Tomcat memcached Session...

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

    为了优化这个问题,我们可以使用`memcached-session-manager`,它是一个专门为Tomcat设计的插件,使得Tomcat能够将用户的session数据存储在Memcached服务器上,实现session的分布式管理。 本文将详细介绍如何在...

    memcached +tomcat7.52 session同步

    为了解决这个问题,我们可以使用分布式缓存系统,如memcached,来实现session的共享和同步。在本场景中,我们将探讨如何在Tomcat 7.52版本中集成memcached,以实现在多个Tomcat实例之间的session共享。 首先,我们...

Global site tag (gtag.js) - Google Analytics