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

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

多学习多思考。



评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值