分布式集群下的session同步问题

一、概述

        传统的应用服务器,自身实现的session管理是大多是基于单机的,对于大型分布式网站来说,支撑其业务的远远不止一台服务器,而是一个分布式集群,请求在不同的服务器之间跳转。那么,如何保持服务器之间的session同步呢?

         分布式环境下,如果一次请求被负载均衡分配到了服务器A,如果按照一般的方式存储session,在A的本地会存储session,如果此次会话没有结束,下一次的请求被负载均衡到了B服务器(或者其他的非A服务器)那么上次的请求的session信息将不再存在。如果不做任何处理的话,用户将出现频繁登录的现象。所以分布式环境下session的存储显得格外重要。

二、分布式session存储方法

1、持久化

       将session的存储放在数据库中,进行持久化,每台服务器要使用session的时候,可以同时向数据库中去存取,这样可以保证当服务器宕机的时候,可以保持数据不容易丢失。

但是缺点也很明显,整个系统的吞吐量下降。

2、粘性session

       原理:粘性session 是指将一个请求绑定到固定的服务器上,正如上面所说,如果设置了粘性session,负载均衡将请求转发到了服务器A上,此用户以后的每一次请求都会转发到服务器A上,相当于用户和服务器黏在一起了。

       优点:实现很简单,可以用Nginx的ip_hash机制配置,不需要对session做处理。

       缺点:不是高可用的,如果当前访问的宕机了,请求会转发到其他的服务器,当前请求的session信息将会失效。适合用在故障对用户的的影响较小的场景下。

3、session复制

        原理:任何一个服务器上的session发生变化,该节点会把这个 session的所有内容序列化,然后广播给所有其它节点,不管其他服务器需不需要session,以此来保证Session同步。

        优点:可容错,各个服务器之间session能够实时响应;

        缺点:网络负荷会有一定的压力(可能会堵塞,拖慢服务器)。

 4、session缓存机制

       使用缓存服务器保存session,不管是memcache还是redis要以集群的方式来提供session服务。并且memcache和redis的快速访问具有很大的优势,可以提供较高的读写性能,这一点对并发量大的系统来说很重要。从安全性来考虑,session时候过期时间的,利用缓存存储可以利用缓存的失效机制。

 5、客户端存储

       服务端存储所有用户的session,内存占用较大,可以将session存储到浏览器cookie中。

       缺点:数据存储在客户端上,并在网络传输,存在泄漏、篡改、窃取等安全隐患。session存储的数据大小受cookie限制。这种方式不建议使用。

6、SpringSession实现

        具体实现原理后续补充说明。

三、总结

      本文中提到的分布式session的6种处理策略,其中就应用广泛性而言,第四种方式,也就是基于第三方缓存框架共享session,应用的最为广泛,无论是效率还是扩展性都很好。

        

你可能感兴趣的:(技术总结)