在web项目中,会话管理是一个非常重要得部分;通常由符合session规范的容器来进行存储管理,因此容器一旦重启或者关闭,会话就会失效;要打造一个高可用的分布式系统,就要把session管理独立出来;
目前主要有以下几种方案(本人已知):
1、硬件F5
黏性会话,硬件较贵,成本高,本人没有接触过;
2、容器间的session共享
容器自带该功能,配置简单,上手容易;但必须是相同的容器之间共享(例tomcat - tomcat,有限制),大量的session复制、session内容的序列化、会占用较多系统资源,影响系统性能;大量的session内容广播也容易导致网络瓶颈,引起网络拥堵(该方案缺点太多,也没有使用过);
3、Nginx ip_hash黏性会话
成本低,实现容易;如果出现单点故障,不会转发到正常的服务器上, 需要配合heath_check插件做健康检查;但是就算转发到健康服务器上,由于该服务器没有session,任需要用户重新登录,无法做到用户无感知;
4、JWT(Java Web Token)
5、cache db
即cache db缓存session信息,应用服务器将session信息存在cache db中,当集群中的某一个应用服务器发生故障时,其他应用服务接收到请求后,可以从cache db中获取session,从而实现session的共享;
a、MSM(memchached_session_manage)