在集群中部署多个服务器如何解决SESSION问题?

余坚锐


首先我们来分析这个问题,问题里出现了两个关键词:集群、Session,在回答问题之前我们先来聊聊这两个关键词。

集群

说到集群首先给人的第一感觉是一大堆的服务器,其实这种想法是片面的,集群是指多台服务器上部署同一个业务,通俗说就是同一件事多个人来干。谈到集群就不得不说分布式。分布式是为了解决业务的高耦合性产生,将一个宠大的任务拆分成多个子任务部署在不同服务器上,这就是分布式。

Session

由于HTTP协议是无状态的,浏览器的每一次访问对于服务器来说都是第一次访问,服务器就好像得了阿兹海默症(健忘症)。为了解决这个问题,Cookie和Session两兄弟应运而生。

用户访问Web服务器后,服务器生成了Session并将唯一标识符(SessionID)存放在客户端Cookie中,下次浏览器发出请求就会携带Cookie,服务器根据Cookie中的SessionID就去找对应的Session,找到了则代表会话成功。

集群部署时Session会出什么问题?

因为Session默认是存储在服务器端的,而集群部署时用户的请求可能会被定向至不同的节点服务器上,所以可能第一次访问时保存了会话状态,第二次访问又被定向到其它节点(其它节点上并没有此用户的Session信息)上导致会话状态丢失!

如何解决集群环境下的Session同步问题?

解决这个问题,我们只要确保所有节点服务器共用Session即可,方案有以下几种供大家选择:

1、粘性Session

同一个用户的请求分配到同一台服务器(通过一致性HASH算法实现),这样始终在这台服务器上寻找Session,称为粘性Session。

2、Session复制

将所有节点服务器上的Session保持同步复制状态,任何一台节点上产生新的Session都复制到其它节点服务器。

3、Session共享

将Session放在统一的地方集中管理(如:Session入库、存入Redis等),然后所有节点服务器统统从这个地方存取Session即可。


以上这几种解决方案应用最广的就是Session共享机制,既可解决Session同步问题又无需担心数据丢失。

以上就是我的观点,对于这个问题大家是怎么看待的呢?欢迎在下方评论区交流 ~ 我是科技领域创作者,十年互联网从业经验,欢迎关注我了解更多科技知识!

网络圈


我是一个有10年项目架构经验的java软件工程师,欢迎关注我,了解更多java前沿技术!目前一般都是使用redis共享session解决这个问题。


分享到:


相關文章: