时间:2021-05-20
前言
本文主要探讨集群后不同Web服务器获取Session数据的问题解决方案。
Session Stick
Session Stick 方案即将客户端的每次请求都转发至同一台服务器,这就需要负载均衡器能够根据每次请求的会话标识(SessionId)来进行请求转发,如下图所示。
这种方案实现比较简单,对于Web服务器来说和单机的情况一样。但是可能会带来如下问题:
如果有一台服务器宕机或者重启,那么这台机器上的会话数据会全部丢失。
会话标识是应用层信息,那么负载均衡要将同一个会话的请求都保存到同一个Web服务器上的话,就需要进行应用层(第7层)的解析,这个开销比第4层大。
负载均衡器将变成一个有状态的节点,要将会话保存到具体Web服务器的映射。和无状态节点相比,内存消耗更大,容灾方面也会更麻烦。
Session Replication
Session Replication 的方案则不对负载均衡器做更改,而是在Web服务器之间增加了会话数据同步的功能,各个服务器之间通过同步保证不同Web服务器之间的Session数据的一致性,如下图所示。
Session Replication 方案对负载均衡器不再有要求,但是同样会带来以下问题:
同步Session数据会造成额外的网络带宽的开销,只要Session数据有变化,就需要将新产生的Session数据同步到其他服务器上,服务器数量越多,同步带来的网络带宽开销也就越大。
每台Web服务器都需要保存全部的Session数据,如果整个集群的Session数量太多的话,则对于每台机器用于保存Session数据的占用会很严重。
Session 数据集中存储
Session 数据集中存储方案则是将集群中的所有Session集中存储起来,Web服务器本身则并不存储Session数据,不同的Web服务器从同样的地方来获取Session,如下图所示。
相对于Session Replication方案,此方案的Session数据将不保存在本机,并且Web服务器之间也没有了Session数据的复制,但是该方案存在的问题在于:
读写Session数据引入了网络操作,这相对于本机的数据读取来说,问题就在于存在时延和不稳定性,但是通信发生在内网,则问题不大。
如果集中存储Session的机器或集群出现问题,则会影响应用。
Cookie Based
Cookie Based 方案是将Session数据放在Cookie里,访问Web服务器的时候,再由Web服务器生成对应的Session数据,如下图所示。
但是Cookie Based 方案依然存在不足:
Cookie长度的限制。这会导致Session长度的限制。
安全性。Seesion数据本来是服务端数据,却被保存在了客户端,即使可以加密,但是依然存在不安全性。
带宽消耗。这里不是指内部Web服务器之间的宽带消耗,而是数据中心的整体外部带宽的消耗。
性能影响。每次HTTP请求和响应都带有Seesion数据,对Web服务器来说,在同样的处理情况下,响应的结果输出越少,支持的并发就会越高。
总结
前面四个方案都是可行的,但是对于大型网站来说,Session Sticky和Session数据集中存储是比较好的方案。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
java操作mongo查询的实例详解前言:MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
java解决分布式环境中高并发环境下数据插入重复问题前言原因:服务器同时接受到的重复请求现象:数据重复插入/修改操作解决方案:分布式锁对请求报文生成摘要信息+r
RedisCluster数据分片机制Redis集群简介RedisCluster是Redis的分布式解决方案,在3.0版本正式推出,有效地解决了Redis分布式方
redisclusterrediscluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求自动将数据进行分片,每个m
ZooKeeper是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于ZooKeeper实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集