使用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服务。

效果如下
使用Memcached做分布式系统的Session存储
 关闭node1,输入框中输入5,5,效果如下
使用Memcached做分布式系统的Session存储
 证明Session继续生效。关闭浏览器后,再重新打开,因为SessionID变了,所以从Session中取不到任何数据了。还要声明一点就是放入Session要想存储对象必须实现序列化接口。

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

你可能感兴趣的:(tomcat,session,分布式,企业应用,memcache)