您的位置:首页 > 其它

对于 分布式下session同步问题 解决方案的思考

2017-03-19 11:47 225 查看
List:

1.前言

2.解决方案

3.总结思考

……1.前言……

       随着web访问量的日渐增加,高并发的问题出现。大型网站web架构都使用集群或分布式来提高网站的服务效率。之前一个用户访问商城网页,如果使用Nginx+tomcat们实现负载均衡,由于Nginx会把不同的请求分发到某一个tomcat中,tomcat在运行的时候分别在不同的容器中,这样当用户第二次访问的时候,根据权重、轮训、随机等方法,请求很可能不是上一次的容器来处理。

      如果没有解决session同步问题,用户一会儿是登陆状态,跳转一个请求之后是未登陆状态,那就尴尬了。

      那如何来解决session内容统一,session内容共享的问题呢?

……2.解决方案……

集群环境下session储存问题解决方案:

1.利用数据库同步session。

      这个是最简单的方法,将session数据持久化到硬盘中。在DB中专门有table来维护session信息。如果你的DB也做了集群,那么sessiontable也要每台节点一个,实现同步。在网站运行中,数据库的负担本来就很大了,如果网站的session信息还存到DB中,很容易产生数据库访问瓶颈问题。

2.利用cookie存session。

       大家应该都知道session存放到服务器,cookie是存放到客户端的。那么当我访问了模块A,将session存到服务器,那么如果用户跳转到模块B的时候,就去session中找,没有就去cookie中找。这样也是有一定风险的,当用户本地禁用了cookie,那就无法实现同步了。cookie的安全性不高,就算编码的时候使用加密算法加密了,那还是可以伪造cookie信息的。

3.应用服务器之间复制session

        我们平时使用的web服务器有tomcat,Apache,Nginx。在集群环境下tomcat同步session,根据负载均衡的原理寻找节点。tomcat之间实现了session同步,因此信息是可以共享的。但是也有缺点,缓存对象过大,性能会降低,session内容需要序列化,才能传输,也会消耗IO。使用广播的方式在网络间传输,会造成局域网瓶颈。

4.使用cacheDB存储session实现共享

        每个用户登录之后会生成一个token,根据token到redis查询用户信息,如果用户信息不存在说明session已经过期,返回400并提示用户session已经过期。如果找到则复制到本机,这样实现session共享和高可用。可以支持黏性和非黏性的session(当用户首次发出请求,通过路由转发到一台server之后,下次它还找这个节点。这种策略被称为粘性session(session sticky))。我们需要实现sessionmanager来管理session的生命周期。使用redis主从节点架构,同时master和slave要双向同步,这样就不会出现单点故障问题了。同时如果一个节点宕机。另一个可以升为master。这样保证了session信息的高可用。

5.Spring Session

         提供了一套创建和管理Servlet HttpSession的方案。Spring Session提供了集群Session(Clustered Sessions)功能,默认采用外置的Redis来存储Session数据,以此来解决Session共享的问题。同样也是一个解决分布式session共享的好方法。这里有博客做参考:http://blog.csdn.net/xlgen157387/article/details/60321984

……3.总结思考……

关于session数据共享问题是实现分布式必须要面对的,建议方案4

多学习多思考。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: