在web应用中,因为http的请求响应式,无状态。要记录用户相关的状态信息,好比电商网站的购物车,好比用户是否登陆等,都须要使用session。咱们知道session是由servlet容器建立和管理,存储在服务器端,而且与客户端浏览器相关(中止web应用,关闭浏览器session都会失效)。前端
若是一个web应用,部署到一台服务器(一个tomcat),那么session使用起来至关的方便,没有额外的担忧,直接由servlet容器建立和管理便可。然而今天,一个web应用面临大量用户,高并发的访问(咱们有十多亿同胞,骄傲啊!)。那么不管如何一个tomcat是难以提供服务的,就须要集群方式部署大量的tomcat,共同提供服务。也就是咱们耳熟能详 的:集群、分布式、负载均衡。架构大概是这个样子:nginx
应用场景描述:程序员
1.小明正在维护一个web应用:www.xx.com。该web应用是一个电商网站,起初用户量不多,业务量也不大。小明经过一台tomcat部署应用,而且把用户登陆信息,购物车信息都保存在session中。应用服务良好,没有任何问题。web
2.一年之后,小明经过搜索引擎优化,购买流量的方式,推广该电商网站,再加上商品质量不错,性价比很高:物美价廉。很受用户欢迎。短期内容增长了不少新的用户,并发量指数级提高,此时一台tomcat难以正常提供服务了浏览器
3.因而小明经过横向扩展,增长tomcat服务器,集群方式部署:www.xx.com应用。经过三台tomcat搭建集群环境:tomcat1/tomcat2/tomcat3。tomcat
4.在tomcat服务器集群以前,经过nginx服务器实现:负载均衡+反向代理服务器
5.集群环境部署好应用之后,小明遇到了一个问题:用户没法正常购物了,须要频繁登陆???。这但是是个大问题!!!session
6.经过无数个夜晚的失眠(程序员遇到问题后都是这样的!问题不解决难以入睡),小明终于想清楚了问题所在,描述以下:架构
6.1.因为是搭建了集群环境(三个tomcat),以及前端服务器nginx实现的负载均衡并发
6.2.用户访问流程是这样的:
a.用户访问www.xx.xom/login发起登陆请求,首先是请求到达nginx服务器
b.nginx服务器将用户的登陆请求,反向代理到tomcat2服务器,实现登陆,而且建立会话session
c.当用户登陆成功之后,发起访问商品列表的请求:www.xx.com/list,请求仍是首先到达nginx服务器
d.nginx服务器将用户访问商品列表请求,反向代理到tomcat服务器。此时因为用户是在tomcat2实现的登陆(在tomcat2建立session),那么在tomcat3服务器并无session,所以tomcat3服务器响应用户(还未登陆,须要先登陆)
e.因而乎用户就很郁闷了:刚才不是登陆过了吗???形成此问题的根本缘由就是:在集群环境下,没有实现session的共享
g.请思考:在集群环境下,如何实现session的共享呢?