粘性会话和非粘性会话

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

黏糊糊的:只有一个会话对象。

粘贴式会话:每个服务器节点的会话对象

187268 次浏览

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

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

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

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

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

作为一个例子,你可以在这里读到亚马逊的弹性负载均衡器和粘性会话:http://aws.typepad.com/aws/2010/04/new-elastic-load-balancing-feature-sticky-sessions.html

我在这里做了一个更详细的回答: https://stackoverflow.com/a/11045462/592477 < / p >

或者你可以在这里读==>

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

    假设你只有一个用户在使用你的web应用,而你有3个 tomcat实例。然后,该用户向您的应用程序发送几个请求 loadbalancer将其中一些请求发送到第一个tomcat 实例,并将这些请求中的其他一些发送到第二个 假设你只有一个用户在使用你的web应用,而你有3个tomcat 实例。这个用户向你的应用程序发送几个请求,然后 Loadbalancer将第一个用户请求发送到三个请求中的一个 Tomcat实例,以及由它发送的所有其他请求 用户在会话期间将被发送到相同的tomcat实例。 在这些请求期间,如果关闭或重新启动该tomcat 实例(使用tomcat实例),loadbalancer发送 剩余的请求到另一个仍然存在的tomcat实例 但是,由于您不使用会话复制,实例 接收其余请求的Tomcat没有副本 用户会话然后为这个tomcat用户开始一个会话 用户失去了他的会话,并与web应用程序断开连接 . web应用仍在运行 假设你只有一个用户在使用你的web应用,而你有3个tomcat 实例。这个用户向你的应用程序发送几个请求,然后 Loadbalancer将第一个用户请求发送到三个请求中的一个 Tomcat实例,以及由它发送的所有其他请求 用户在会话期间将被发送到相同的tomcat实例。 在这些请求期间,如果关闭或重新启动该tomcat 实例(使用tomcat实例),loadbalancer发送 剩余的请求到另一个仍然存在的tomcat实例 在使用会话复制时,运行实例tomcat 接收到剩余的请求就有一个用户会话的副本 用户继续他的会话:用户继续浏览你的网页 App未断开连接,关闭tomcat实例 不影响用户导航

假设用户发送了一个请求来获取它的配置文件,在我们的web应用程序实例的内存中不会有任何东西。我们在发送响应之前从DB nit中获得用户配置文件,我们将数据保存在内存中,比如说Instance3。但是来自同一用户的下一个请求可以发送到任何实例。

当请求第一次到达Instance3时,它将创建一个具有会话id的会话。当响应被发送到客户端时,将向客户端提供一个cookie。所以下次这个客户端发出请求时,这个cookie将被附加到请求上,负载均衡器将查看这个cookie,负载均衡器将知道该请求必须转发到Instance3。这是sticky session解决方案。它的缺点是如果Instance3崩溃了怎么办?负载均衡器将请求路由到其他实例,但它们没有缓存。存储在Instance3中的所有用户都有很高的延迟。这将影响系统的reliability

如果将会话存储在所有实例中,现在就会出现内存问题。假设一个实例可以存储100个用户会话,而您有3个实例,那么您将能够存储300个会话。但是如果每个实例存储每个会话,那么在所有3个实例中只能存储100个会话。因此这将影响应用程序的scalability

stickynon-sticky会话是stateful replication的组件。如果你想要higher scalability,你没有在你的web应用实例上缓存任何东西,你的web实例会在每个请求时击中DB,但这会导致high latency

更好的方法是无状态复制,即不在应用程序实例上存储任何东西,而是使用服务器端缓存(memcached/redis)。