286

我想知道粘性会话和非粘性会话之间的区别。从网上阅读后我的理解是:

Sticky:只有一个会话对象会在那里。

非粘性会话:每个服务器节点的会话对象

4

2 回答 2

671

当您的网站仅由一个 Web 服务器提供服务时,对于每个客户端-服务器对,都会创建一个会话对象并保留在 Web 服务器的内存中。来自客户端的所有请求都转到此 Web 服务器并更新此会话对象。如果在交互期间需要将某些数据存储在会话对象中,则将其存储在此会话对象中,并在会话存在时一直保留在那里。

但是,如果您的网站由位于负载均衡器后面的多个 Web 服务器提供服务,则负载均衡器将决定每个请求应该发送到哪个实际(物理)Web 服务器。例如,如果负载均衡器后面有 3 个 Web 服务器 A、B 和 C,则 www.mywebsite.com 可能服务器 A 提供,www.mywebsite.com从服务器 B 提供,而www.mywebsite.com / 由服务器 C 提供。

现在,如果请求是从(物理上)3 个不同的服务器提供的,每个服务器都为您创建了一个会话对象,并且因为这些会话对象位于三个独立的盒子上,所以没有直接的方法可以知道会话对象中有什么的另一个。为了在这些服务器会话之间进行同步,您可能必须将会话数据写入/读取到所有人通用的层中 - 例如数据库。现在,为此用例向数据库写入数据和从数据库读取数据可能不是一个好主意。现在,粘性会话的作用来了。

如果负载均衡器被指示使用粘性会话,那么您的所有交互都将发生在同一台物理服务器上,即使存在其他服务器也是如此。因此,在您与本网站的整个交互过程中,您的会话对象将是相同的。

总而言之,在粘性会话的情况下,您的所有请求都将被定向到同一个物理 Web 服务器,而在非粘性负载均衡器的情况下,可以选择任何 Web 服务器来处理您的请求。

例如,您可以在此处阅读有关 Amazon 的 Elastic Load Balancer 和粘性会话:http: //aws.typepad.com/aws/2010/04/new-elastic-load-balancing-feature-sticky-sessions.html

于 2012-11-30T08:57:25.730 回答
119

我在这里给出了更多细节的答案: https ://stackoverflow.com/a/11045462/592477

或者你可以在那里阅读==>

当您使用负载平衡时,这意味着您有多个 tomcat 实例并且您需要划分负载。

  • 如果您使用没有粘性会话的会话复制:假设您只有一个用户使用您的网络应用程序,并且您有 3 个 tomcat 实例。该用户向您的应用程序发送多个请求,然后负载均衡器会将其中一些请求发送到第一个 tomcat 实例,并将其中一些请求发送到第二个实例,其他一些发送到第三个实例。
  • 如果您使用没有复制的粘性会话:假设您只有一个用户在使用您的 Web 应用程序,而您有 3 个 tomcat 实例。该用户向您的应用程序发送多个请求,然后负载均衡器将第一个用户请求发送到三个 tomcat 实例之一,该用户在其会话期间发送的所有其他请求将发送到同一个 tomcat 实例。在这些请求期间,如果您关闭或重新启动此 tomcat 实例(使用的 tomcat 实例),负载均衡器会将剩余请求发送到仍在运行的另一个 tomcat 实例,但是由于您不使用会话复制,因此接收的实例 tomcat剩余的请求没有用户会话的副本,那么对于这个 tomcat,用户开始一个会话:尽管网络应用程序仍在运行,但用户失去了他的会话并与网络应用程序断开连接。
  • 如果您使用带有会话复制的粘性会话:假设您只有一个用户在使用您的 Web 应用程序,而您有 3 个 tomcat 实例。该用户向您的应用程序发送多个请求,然后负载均衡器将第一个用户请求发送到三个 tomcat 实例之一,该用户在其会话期间发送的所有其他请求将发送到同一个 tomcat 实例。在这些请求期间,如果您关闭或重新启动此 tomcat 实例(使用的 tomcat 实例),负载均衡器会将剩余请求发送到仍在运行的另一个 tomcat 实例,因为您使用会话复制,接收剩余请求的实例 tomcat 具有用户会话的副本,然后用户继续他的会话:用户继续浏览您的网络应用程序而不会断开连接,tomcat 实例的关闭不会影响用户导航。
于 2016-09-13T11:14:15.127 回答