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

使用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-win32-1.4.4-14内存数据库

    可做tomcat集群session共享和内存数据库使用,内含32位和64位,需要64位将64位的三个文件替换到32位中即可;简介如下: Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过...

    MVC使用Memcache+Cookie解决分布式系统共享登录状态学习笔记6

    为了解决单机处理的瓶颈,增强软件的可用性,我们... 我们使用MemCache+Cookie方案来解决分布式系统共享登录状态的问题。  Memcache服务器本身就是一个Socket服务端,内部数据采用键值对的形式存储在服务器的内存中

    网站架构技术

    memcached分布式缓存集群的伸缩性挑战 分布式缓存的一致性hash算法 数据存储服务器集群的伸缩性设计 关系数据库集群的伸缩性设计 nosql数据库的伸缩性设计 随需应变:网站的可扩展性 构建可扩展的网站架构...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    亮剑.NET深入体验与实战精要2

    15.4.9 Memcached——分布式缓存系统 560 15.4.10 Cacheman——.NET架构 下的分布式缓存项目 561 15.5 数据库访问性能优化 562 15.5.1 选择合适的.NET数据供应器 563 15.5.2 及时地关闭数据库连接 563 15.5.3 跟踪...

    亮剑.NET深入体验与实战精要3

    15.4.9 Memcached——分布式缓存系统 560 15.4.10 Cacheman——.NET架构 下的分布式缓存项目 561 15.5 数据库访问性能优化 562 15.5.1 选择合适的.NET数据供应器 563 15.5.2 及时地关闭数据库连接 563 15.5.3 跟踪...

    java开源包8

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    javabitset源码-developer-knowledge-map:后端开发人员知识图谱

    存储引擎 InnoDB 和 MyISAM SQL 索引 事务 分库分表 NoSQL 列式数据库 KV 数据库 文档型数据库 全文搜索引擎 图形数据库 MongoDB ElasticSearch 其他 MariaDB PostgreSQL Oracle MSSQL Cassandra 分布式数据库(TiDB...

    java开源包1

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包11

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包2

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包3

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包6

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包5

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包10

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包4

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包7

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

    java开源包9

    使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib ...

Global site tag (gtag.js) - Google Analytics