使用Memcached做分布式系统的Session存储
1. 前言
Memcache除了可以做Hibernate的二级缓存外,还可以做很多很多事情。在互联网应用中,往往通过它作为缓存解决方案来保存数据,进而减少数据库的负载,而在分布式系统中,Session在不同Node中的复制,是一个比较常见的问题啦。而且在分布式系统中还要实现Session的修复,就是其中一个Node宕机了,另一个Node立即可以接管宕机Node的所有Session信息,Memcache又可以当做分布式系统的Session解决方案。
2. 使用Memcache的原因
那个是使用Web容器自身的Session共享机制,这就有几个问题。第一,就是配置文件有点冗长,若Node较多的情况下,每个Server都得一坨一坨地摆在那里。第二,就是每个Node都得知道其他Node的存在,好进行心跳监听,以便进行Session的复制,消耗的性能相对来说比较大一些,因此还是采用一个集中式的中间件比较好,将Web的Session托管出去,想要的时候尽管去中间件取就行了。当然了,如果采用黏着性访问,比如使用mod_jk这种黏着性访问,就不会跨越Node,Session也不用随时进行复制。但是对于mod_jk进行Node宕机的Session恢复和proxy一样都是使用底层的Web容器进行的,所以依然有缺点。总的来说Memcached作为分布式的托管Session的方案还是比较得当的。
3. 配置环境
Apache的配置完全相同,在此不再赘述。
之后下载Memcache的tomcat插件,请查看附件~
之后修改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. 测试
下面我们依然在2个Node上部署好原先那个helloWeb的工程,工程简单,就一个首页。
先开启memcache服务,之后在开启2个Tomcat服务。
效果如下
关闭node1,输入框中输入5,5,效果如下
证明Session继续生效。关闭浏览器后,再重新打开,因为SessionID变了,所以从Session中取不到任何数据了。还要声明一点就是放入Session要想存储对象必须实现序列化接口。