大型网站架构设计-memcached分布式 session 管理

2014-11-21 20:11:21     120 人阅读    

           传统的应用服务器,如tomcat、jboss等,其自身所实现的session管理大部分都是基于单 机的。对于大型分布式网站来说,支撑其业务的远远不止一台服务器,而是一个分布式集群, 请求在不同服务器之间跳转。那么,如何保持服务器之间的session同步呢?传统网站一般通过 将一部分数据存储在cookie中,来规避分布式环境下session的操作。这样做的弊端很多,一方 面cookie的安全性一直广为垢病,另一方面cookie存储数据的大小是有限制的。随着移动互联 网的发展,很多情况下还得兼顾移动端的session需求,使得采用cookie来进行session同步的 方式的弊端更为凸显。分布式session正是在这种情况下应运而生的。


          对于系统可靠性要求较高的用户,可以将session持久化到DB中,这样可以保证宕机时会 话不易丢失,但缺点也是显而易见的,系统的整体吞吐将受到很大的影响。另一种解决方案便 是将session统一存储在缓存集群上,如memcache,这样可以保证较高的读、写性能,这一点 对于并发量大的系统来说非常重要;并且从安全性考虑,session毕竟是有有效期的,使用缓存 存储,也便于利用缓存的失效机制。使用缓存的缺点是,一旦缓存重启,里面保存的会话也就 丢失了,需要用户重新建立会话。

 


          如图2-4所示,前端用户请求经过随机分发之后,可能会命中后端任意的Web Server,并 且Web Server也可能会因为各种不确定的原因宕机。在这种情况下,session是很难在集群间同 步的,而通过将session以sessionid作为key,保存到后端的缓存集群中,使得不管请求如何分 配,即便是Web Server宕机,也不会影响其他Web Server通过sessionid从Cache Server中获得 session,这样既实现了集群间的session同步,又提高了 Web Server的容错性。

      

图2-4基于缓存的分布式session架构

           这里以Tomcat作为Web Server来举例,通过一个简单的工具memcached-session- manager9, 实现基于memcache的分布式session。
           memcached-session-manager是一个开源的高可用的Tomcat session共享解决方案,它支持 Sticky模式和Non-Sticky模式。Sticky模式表示每次请求都会被映射到同一台后端Web Server, 直到该Web Server宕机,这样session可先存放在服务器本地,等到请求处理完成再同步到后端memcache服务器;而当Web Server宕机时,请求被映射到其他Web Server,这时候,其他Web Server可以从后端memcache中恢复session。对于Non-Sticky模式来说,请求每次映射的后端 Web Server是不确定的,当请求到来时,从memcache中加载session;当请求处理完成时,将session 再写回到 memcache。


         以 Non-Sticky 模式为例,它需要给 Tomcat 的$CATALINA_HOME/con^7context.xml 文件配 置SessionManager,具体配置如下:

〈Manager className=nde.javakaffee.web.msm.MemcachedBackupSessionManagern memcachedNodes=Mn1:192.168.0.100:11211,n2:192.168.0.101:11211M sticky="false" sessionBackupAsync="false" lockingMode="auto"
requestUriIgnorePattern=".*\.(ico|png丨gif|jpg丨css|js)$"
transcoderFactoryClass=nde.javakaffee.web.msni.serializer.kry〇.Kry〇TranscoderFactoryn
/>


         其中:memcachedNodes指定了 memcache的节点;sticky表示是否采用Sticky模式; sessionBackupAsync表示是否采用异步方式备份session; lockingMode表示session的锁定模式; auto表示对于只读请求,session将不会被锁定,如果包含写入请求,则session会被锁定; requestUriIgnorePattem表示忽略的url; transcoderFactoryClass用来指定序列化的方式,这里采用 的是Kryo序列化,也是memcached-session-manager比较推荐的一种序列化方式。


         memcached-session-manager 依赖于 memcached-session-manager-${version}jar,如果使用的是 tomcat6,贝丨J还需要下载 memcached-session-manager-tc6-${version}.jar,并且它还依赖 memcached- ${version}jar进行memcache的访问。在启动Tomcat之前,需要将这些jar放在$CATALINA_ HOME/lib/目录下。如果使用第三方序列化方式,如Ktyo,还需要在Web工程中引入相关的第三方 库,Kryo 序列化所依赖的库,包括 kryo-${version}-all.jar、kryo-serializers-${version}.jar 和 msm-kryo-serializer. ${version}jar。

本文出自   《大型分布式网站架构设计与实践试读样章》 试读,如果感觉到对你有帮助可以去购买该书


原文地址:http://www.itmmd.com/201411/203.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

大型网站架构设计-持久化存储介绍   上一篇
下一篇  大型网站架构设计-memcache AP丨与分布式

精彩回复
发表评论
姓名:       

《程序员app》专门为程序员量身定做!