1、什么是session,什么是session一致性
什么是session?
服务器会为每个用户创建一个会话,存储用户的相关信息,以便多次请求,能够定位到同一个上下文中,在web开发中,web-server可用自动的为同一个浏览器的访问用户,自动创建session,提供数据存储功能,最常见的会把用户的登录信息,用户信息存储在session中,以保持登录状态。
什么session一致性问题?
只要用户不重启浏览器,每次http短连接请求,理论上服务端都能定位到session,都能够定位到同一台web-server,以保持会话,这就是所谓的session一致性问题
2、解决session一致性问题,有哪些方案?
方案1: session同步法
思路: 站点集群session同步
![](https://img.kancloud.cn/22/4e/224e709eb5d40840a7f023952cdcf267_561x377.png)
多个web-server之间相互同步session,这样每个web-server之间都包含全部的session
优点: web-server的功能,应用程序不需要修改任何代码
缺点: session同步需要数据传输,需要占大量的带宽,每台web-server需要维护的session会很多,数据量受内存限制,没办法进行水平扩展,当有多台web-server,性能下降
方案2: 客户端存储法
思路: session存储在客户端
缺点: 每次http请求都需要携带session,非常占用外网的带宽,数据存储在端上,并在网络上进行传输,存在泄密、篡改、窃取等安全隐患,存储量的大小会受到端上cookie的限制
方案3: 反向代理hash一致性(四层、七层)
思路: 反向代理路由保障
![](https://img.kancloud.cn/ae/3b/ae3bd1a6040712d9f6db7f9bf30f4570_1333x409.png)
四层: ip hash
七层: 根据某些head属性,比如session_ip或用户id做hash
优点: 只需要修改nginx的配置,不需要修改业务代码,可用水平扩展
缺点: 如果web-server重启,有部分用户会受影响,需要重新登录,如果webserver水平扩展,那么nginx会重新hash,session会重新分布,也会导致一部分用户路由不到正确的session
方案4: 后端统一存储法
思路: 不存储在站点,统一存储在后端(数据库、缓存)
将session存储在web-server后端的存储层,数据库或者缓存,如图
![](https://img.kancloud.cn/4c/a8/4ca866ad389069f98675fd469e8ec9b5_1000x466.png)
优点: 没有安全隐患,session不用在外网上进行传输,可用实现web层的任意水平扩展
缺点: 增加了一次网络调用,需要修改应用程序的代码,需要应用代码管理session
建议使用高可用的缓存(比如redis)
总结: 推荐使用方案4,使用缓存统一存储session