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
多学习多思考。