Sticky和NON-Sticky会话

Sun*_*pta 230 session

我想知道粘性和非粘性会话之间的区别.从互联网上阅读后我理解的内容:

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

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

TJ-*_*TJ- 581

当您的网站仅由一个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服务器来满足您的请求.

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

  • 在大多数情况下,会话将丢失.如果是[AWS ESB](http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/elb-sticky-sessions.html)_如果实例失败或变得不健康,负载均衡器会将请求路由停止实例,而是根据现有的负载均衡算法选择一个新的健康实例.负载均衡器将会话视为现在"卡住"到新的正常实例,并继续将请求路由到该实例,即使失败的实例返回._ (16认同)
  • 根据什么信息LoadBalancer使HTTP会话变粘?特别是在HTTPS连接上,这个问题变得很有趣.您是否使用Web服务器私钥为LB提供服务,以便能够中断SSL连接并获取HTTP会话?或者LB只是使用客户端IP地址?在这种情况下,多个客户端使用相同IP地址的代理服务器怎么办?或者更糟糕的是,IP地址经常变化的移动客户端?或者甚至还有更好的技术?谢谢 (7认同)
  • 是的,你是绝对正确的.为了在此上下文中使用"x-forwarded-for"标头或sticky-cookie,需要使用_SSL Termination_,因此需要在LB处解密请求. (6认同)
  • @TJ-如果一个节点不可用会发生什么? (4认同)
  • @ g000ze在处理未直接提供给互联网的应用程序时,我认为仅在最外层的代理服务器上启用TLS是很常见的.(负载平衡器可以被视为一种特殊类型的代理服务器,可能过于简单,可以将请求传递给多个服务器中的任何一个.)负载均衡器和其他服务器之间的流量将发生在本地安全的网络上因此,通常没有必要对其进行加密,或者如果需要对其进行加密,则自签名证书就足够了(因为代理可以配置为信任它). (4认同)
  • IP地址可能不是正确的方法.例如,可以通过代理服务器路由请求.其中一种方法是cookie - 负载均衡器可以读/写cookie,可用于识别请求并将其转发到目标服务器. (4认同)
  • 粘性会话内部是如何实现的?我可以想象一个将 IP 地址映射到服务器名称的表,但这很快就会失控,不是吗? (3认同)
  • 我的想法是否正确,您几乎总是希望启用粘性会话? (2认同)

Nic*_*ico 98

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

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

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

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

  • 嗯..读到这我不知道:有第四个选择是否有意义:非粘性WITH会话复制?或换种说法:如果有人将会话复制到其他实例,则使用粘性会话有什么好处?我的意思是,如果您要跨实例复制会话,则也可以将请求转发到任何服务器,对吗?我想念什么? (7认同)
  • 这应该是公认的答案. (6认同)
  • 嗯,我明白了-如果我理解正确,那意味着在整个集群中复制所有会话将在内部淹没集群-我看到了问题。哦,现在我仔细看了一下您的答案,我发现这实际上是您描述的第一种情况。 (2认同)