粘性和非粘性会话


254

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

粘性:仅单个会话对象将在那里。

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

Answers:


612

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

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

现在,如果(实际上)从3个不同的服务器提供请求,则每个服务器都为您创建了一个会话对象,并且由于这些会话对象位于三个独立的盒子上,因此无法直接知道会话对象中的内容其他的。为了在这些服务器会话之间进行同步,您可能必须将会话数据写入/读取到所有人都通用的层中(例如DB)。现在,对于这种用例,将数据写入数据库或从数据库读取数据可能不是一个好主意。现在,粘性会话的作用到了。

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

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

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


4
@ TJ-如果一个节点不可用怎么办?
gstackoverflow 2015年

20
在大多数情况下,会话将丢失。对于AWS ESB, 如果某个实例发生故障或运行状况不佳,则负载均衡器将停止将请求路由到该实例,而是根据现有的负载均衡算法选择一个新的正常实例。负载平衡器现在将会话视为“卡住”了新的运行状况良好的实例,并且即使有故障的实例返回,也会继续将请求路由到该实例。
TJ-

8
根据什么信息,LoadBalancer会使HTTP会话变为粘滞状态?特别是在HTTPS连接上,此问题变得很有趣。您是否向LB提供了Web服务器私钥,以便它能够断开SSL连接并获取HTTP会话?还是LB仅使用客户端IP地址?在这种情况下,多个客户端使用相同IP地址的代理服务器又如何呢?甚至更糟的是,移动客户端的IP地址经常更改?还是为此有更好的技术?谢谢
g000ze

6
是的,您绝对正确。为了在这种情况下使用“ x-forwarded-for”标头或粘性cookie,需要使用SSL终止,因此,需要在LB处解密请求。
TJ-

4
@ g000ze当处理不直接提供给Internet的应用程序时,我相信仅在最外部的代理服务器上启用TLS是很常见的。(负载平衡器可能被简单地视为一种特殊类型的代理服务器,可以将请求传递给多个服务器中的任何一个。)负载平衡器与其他服务器之间的通信将发生在安全的本地网络上,因此通常不必加密它,或者如果需要对其进行加密,则自签名证书就足够了(因为可以将代理配置为信任它)。
jpmc26 2016年

106

我已经在这里提供了更多详细信息的答案:https : //stackoverflow.com/a/11045462/592477

或者您可以在这里阅读==>

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

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

8
嗯..阅读我不知道:有第四个选择是否有意义:非粘性WITH会话复制?或换种说法:如果一直将会话复制到其他实例,则使用粘性会话有什么好处?我的意思是,如果您要跨实例复制会话,则也可以将请求转发到任何服务器,对吗?我想念什么?
dingalapadum

@dingalapadum是正确的,从理论上讲,您可以进行会话复制而无需使用粘性会话。但是,如果群集较大,则对网络性能不利。然后,将会话复制与粘性会话一起使用的一些策略在tomcat中是这样的(tomcat.apache.org/tomcat-9.0-doc/cluster-howto.html)是放置一个粘性会话,并且只有一个副本(此处为一个节点)称为备份管理器,可保留所有节点会话复制。
Nico

然后,粘性会话仅允许您拥有一个会话副本,这在大型集群中是最好的。
Nico

2
嗯,我明白了-如果我理解正确,那意味着在整个集群上复制所有会话将在内部淹没集群-我看到了问题。哦,现在我仔细看了一下您的回答,我看到,这实际上是您描述的第一种情况...“啊,我” ..
dingalapadum

@dingalapadum,欢迎您提出问题,它可以改善答案
Nico
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.