分布式session方案
1 客户端存储session
服务器不需存储session,用户保存自己的session信息到cookie中。节省服务端资源
缺点:
- 每次http请求,携带用户在cookie中的完整信息,浪费网络带宽
- session数据放在cookie中,cookie有长度限制4K,不能保存大量信息
- session数据放在cookie中,存在泄漏、篡改、窃取等安全隐患,且随时可能会被清理或者有些用户会关闭cookie
2 Session通过Nginx后散列
基于nginx实现,做负载均衡的时候,根据ip做hash处理。比如IP尾号为1、3、5、7、9的请求到服务A上,IP尾号为2、4、6、8、0的请求到服务B上。就可以解决session问题,固定的ip会分配到固定服务器上。
缺点:
- 存在单点故障问题,某个服务挂了,会造成分配到这个服务器上的客户全部异常,没有解决高可用性。某个ip段的客户数量就是很大,超过这个服务器承受范围了,也会引起服务器故障和客户的请求超时,甚至请求异常。
3 Session Relication(拷贝、复制)
Tomcat原生是支持,只需要修改配置文件
缺点:
- 因为这样session同步是需要服务器之间数据传输,这样占用大量的网络带宽,同时也降低了集群所带来的业务处理能力的又是
- 同步的时间也是一个问题,比如用户可能会在同步时间内刚好访问到正在同步的服务器,可能会拿不到数据,或者不一致,一样也是会出现数据不一致的问题
- 集群的水平扩张收到限制,因为这样同步,任意一台web-server保存的数据都是所有web-server的session总和,受到内存限制无法水平扩展更多的web-server。
- 这种方式并不适合大型的分布式;
4 Session Center
基于redis等第三方工具实现,不管请求到哪个服务器,都把session信息,保存在redis中。每个服务器,都从redis里获取用户信息。这种方案,是目前大家普遍在用的,但是它也需要对redis进行高可用性维护,增加了系统复杂度。