Sticky和NON-Sticky会话

时间:2012-05-08 07:29:03

标签: session

我想知道粘性和非粘性会话之间的区别。从网上阅读后我明白了:

粘性:只有单个会话对象。

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

2 个答案:

答案 0 :(得分:542)

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

但是,如果您的网站由位于负载均衡器后面的多个Web服务器提供服务,则负载均衡器会决定每个请求所应用的实际(物理)Web服务器。例如,如果负载均衡器后面有3个Web服务器A,B和C,则可能是从服务器A提供www.mywebsite.com/index.jsp,www.mywebsite.com / login.jsp是从服务器B和www.mywebsite.com/accoutdetails.php由服务器C提供。

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

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

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

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

答案 1 :(得分:87)

我在这里提供了一些更详细的答案: https://stackoverflow.com/a/11045462/592477

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

当你使用负载均衡时,它意味着你有几个tomcat实例,你需要分割负载。

  • 如果您正在使用没有粘性会话的会话复制:想象一下,您只有一个用户使用您的网络应用,并且您有3个 tomcat实例。然后,此用户向您的应用发送多个请求 loadbalancer会将其中一些请求发送到第一个tomcat 实例,并将其他一些请求发送到第二个 实例,以及第三个。
  • 如果你正在使用没有复制的粘性会话:想象一下,你只有一个用户使用你的网络应用程序,你有3个tomcat 实例。此用户向您的应用发送了多个请求,然后是 loadbalancer会将第一个用户请求发送给三个中的一个 tomcat实例,以及由此发送的所有其他请求 用户在他的会话期间将被发送到同一个tomcat实例。 在这些请求期间,如果您关闭或重新启动此tomcat 实例(使用的tomcat实例)loadbalancer发送 剩余的请求仍然是另一个tomcat实例 运行,但因为你不使用会话复制,实例 收到剩余请求的tomcat没有副本 用户会话然后为这个tomcat用户开始一个会话: 用户松开他的会话,但与Web应用程序断开连接 网络应用仍在运行。
  • 如果您正在使用会话复制的粘性会话:想象一下,您只有一个用户使用您的网络应用,并且您有3个tomcat 实例。此用户向您的应用发送了多个请求,然后是 loadbalancer会将第一个用户请求发送给三个中的一个 tomcat实例,以及由此发送的所有其他请求 用户在他的会话期间将被发送到同一个tomcat实例。 在这些请求期间,如果您关闭或重新启动此tomcat 实例(使用的tomcat实例)loadbalancer发送 剩余的请求仍然是另一个tomcat实例 正在运行,因为你使用会话复制,实例tomcat 接收剩余的请求然后有一个用户会话的副本 用户继续他的会话:用户继续浏览您的网站 应用程序没有断开连接,关闭tomcat实例 不会影响用户导航。