Session 如何避免给定分布式体系结构中的单点故障

Session 如何避免给定分布式体系结构中的单点故障,session,architecture,scalability,high-availability,distributed-system,Session,Architecture,Scalability,High Availability,Distributed System,我经历了这一切 这就是我被卡住的地方。解释问题- 让我们假设LB使用循环的方法 根据第一个映像,所有服务器都在其本地空间中存储会话,其他服务器无法访问该会话。如果下次出现相同的请求,并且LB将此请求重定向到另一台服务器,则该服务器将询问身份验证。从用户的角度来看,这是非常恼人的 如第二幅图所示,所有服务器都在共享会话。在这种情况下,当下一个请求来自同一个客户机时,LB重定向到另一个服务器。现在,它将从会话主机获取信息,而不是请求身份验证 这在上面的视频链接中提到 问题- 现在会话主机成为单点故

我经历了这一切

这就是我被卡住的地方。解释问题-

让我们假设LB使用循环的方法

根据第一个映像,所有服务器都在其本地空间中存储会话,其他服务器无法访问该会话。如果下次出现相同的请求,并且LB将此请求重定向到另一台服务器,则该服务器将询问身份验证。从用户的角度来看,这是非常恼人的

如第二幅图所示,所有服务器都在共享会话。在这种情况下,当下一个请求来自同一个客户机时,LB重定向到另一个服务器。现在,它将从会话主机获取信息,而不是请求身份验证

这在上面的视频链接中提到

问题-

  • 现在会话主机成为单点故障。如果主机停机,将严重影响可用性。我们如何避免这种情况
  • 您有这些选项(假设会话是无论如何都不能丢失的)

    1) 会话数据存储是一个高度可用的数据存储。例如:您可以将MongoDB副本集用于这样的会话存储。它由三个MongoDB节点组成,其中有一个主节点和两个从节点(最小值),当主节点下降时,其中一个节点升级为主节点。这次选举可能需要几秒钟,但会议不会失败

    2) 使用内存中的数据共享库进行数据分区和复制。一个例子是Hazelcast for Java。它为您提供跨web层的对象级共享,您可以在这里存储共享的会话。请注意,在这种情况下(磁盘上)没有数据持久性


    3) 到目前为止,我使用的最具可扩展性的方法是使用客户端会话,而不使用服务器端数据/会话存储。在这种情况下,您可以在每个应用服务器中存储一个很长的密钥,并在使用该密钥加密数据后设置cookie中的所有数据。这种方法的唯一问题是,您需要对会话中存储的内容进行非常有选择性的选择,因为cookie上的数据大小有限制。这种加密是双向的。大多数基于SAAS的工具都使用这种方法。

    将会话主机实现为复制数据存储有助于消除单点故障。例如,使用像Hazelcast这样的复制缓存将保持缓存的复制和分布,从而消除单点故障。还有其他的像Memcached和Mongo。可以通过虚拟ip地址实现自动故障切换。

    正是由于这个原因,通常会话主机(如memcache)前面有一个VIP(虚拟ip)并且有多个主机。在分布式体系结构中,您通常希望有1-N台主机。大多数大规模运营的公司使用Couchbase(memcahce Bucket)等数据存储来存储会话状态,因为它快速、冗余且高度可扩展

    在负载平衡器中实现粘性会话逻辑。这可能会起作用。或者使用客户端会话。在客户端保存信息称为cookie。但是你不能存太多。这是会话和cookie之间的一个主要区别。