分布式 session

来源:互联网 发布:java图形界面时间控件 编辑:程序博客网 时间:2024/04/30 15:45

传统的应用服务器,如 tomcat、jboss 等,其自身所实现的 session 管理大部分都是基于单机的。对于大型分布式网站来说,支撑其业务的远远不止一台服务器,而是一个分布式集群,请求在不同服务器之间跳转。那么,如何保持服务器之间的 session 同步呢?传统网站一般通过将一部分数据存储在 cookie 中,来规避分布式环境下 session 的操作。这样做的弊端很多,一方面 cookie 的安全性一直广为诟病,另一方面 cookie 存储数据的大小是有限制的。随着移动互联网的发展,很多情况下还得兼顾移动端的 session 需求,使得采用 cookie 来进行 session 同步的方式的弊端更为凸显。分布式 session 正是在这种情况下应运而生的。对于系统可靠性要求较高的用户,可以将 session 持久化到 DB 中,这样可以保证宕机时会话不易丢失,但缺点也是显而易见的,系统的整体吞吐将受到很大的影响。另一种解决方案便是将 session 统一存储在缓存集群上,如 memcache,这样可以保证较高的读、写性能,这一点对于并发量大的系统来说非常重要;并且从安全性考虑,session 毕竟是有有效期的,使用缓存存储,也便于利用缓存的失效机制。使用缓存的缺点是,一旦缓存重启,里面保存的会话也就丢失了,需要用户重新建立会话。,前端用户请求经过随机分发之后,可能会命中后端任意的 Web Server,并且 Web Server 也可能会因为各种不确定的原因宕机。在这种情况下,session 是很难在集群间同步的,而通过将 session 以 sessionid 作为 key,保存到后端的缓存集群中,使得不管请求如何分配,即便是 Web Server 宕机,也不会影响其他 Web Server 通过 sessionid 从 Cache Server 中获得session,这样既实现了集群间的 session 同步,又提高了 Web Server 的容错性。这里以 Tomcat 作为 Web Server 来举例, 通过一个简单的工具 memcached-session- manager 9 ,实现基于 memcache 的分布式 session。memcached-session-manager 是一个开源的高可用的 Tomcat session 共享解决方案,它支持Sticky 模式和 Non-Sticky 模式。Sticky 模式表示每次请求都会被映射到同一台后端 Web Server,直到该 Web Server 宕机,这样 session 可先存放在服务器本地,等到请求处理完成再同步到后端memcache 服务器;而当 Web Server 宕机时,请求被映射到其他 Web Server,这时候,其他 WebServer 可以从后端 memcache 中恢复 session。对于 Non-Sticky 模式来说,请求每次映射的后端Web Server 是不确定的,当请求到来时,从 memcache 中加载 session;当请求处理完成时,将session 再写回到 memcache。以 Non-Sticky 模式为例,它需要给 Tomcat 的$CATALINA_HOME/conf/context.xml 文件配置 SessionManager,具体配置如下:

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.0.100:11211,n2:192.168.0.101:11211"
sticky="false"
sessionBackupAsync="false"
lockingMode="auto"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>

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

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


0 0