粘性会话和会话复制

时间:2011-06-16 06:14:29

标签: session tomcat session-replication

我正在评估在tomcat中使用会话复制的粘性会话的情况。从我最初的评估开始,我认为如果我们启用会话复制,那么在一个tomcat节点中启动的会话将被复制到所有其他tomcat节点,因此我们不需要粘性会话来继续会话,并且任何节点都可以接收请求

但似乎会话复制通常与粘性会话一起使用,否则只要请求转到其他节点,就需要更改会话ID。参考:http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html#Bind_session_after_crash_to_failover_node

如果您必须启用粘性会话,有人可以解释会话复制的真正用途吗?因为当具有给定会话ID的请求始终到达同一节点时,您将不必要地在每个节点上复制会话。在节点崩溃的情况下它可能是有益的,但是这不会经常发生并且仅使用会话复制似乎是一种过度杀伤。

3 个答案:

答案 0 :(得分:67)

正如 Mindas 之前解释过的那样:

当你使用负载均衡时,它意味着你有几个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实例 不会影响用户导航。

答案 1 :(得分:8)

我认为唯一真正的好处是能够在没有多想的情况下关闭Tomcat实例。特别是当节点可以经常打开和关闭时,这适用于云世界(想想亚马逊AWS点实例)。替代方案是购买一个支持节点排放的合适负载均衡器。但体面的负载平衡器价格昂贵,而且耗水需要时间。

我能想到的另一个场景是(购物车的实施不佳),其中物品保存在HttpSession中,关闭则需要用户重新购买(这可能会导致销售损失) )。

但在大多数情况下,你是对的 - 让粘性会话和会话复制都可以忽略不计。

答案 2 :(得分:0)

用mod_jk在“所有”基本配置中澄清JBoss 5.X上的配置问题。在workers.properties文件中设置粘性会话

 worker.list=loadbalancer

 ... nodes configuration omitted

 worker.loadbalancer.balance_workers=node1,node2
 worker.loadbalancer.sticky_session=True

不会阻止会话复制。为了在JBoss上关闭会话复制,我们需要设置$ JBOSS_HOME \ server \ YOUR_NODE_NAME \ deploy \ cluster \ jboss-cache-manager.sar \ META-INF \ jboss-cache-manager-jboss-beans.xml {{ 1}}参数cacheMode

通常在粘性会话场景中,我们不希望会话复制,因为我们不希望额外的开销与复制会话所需的大量I / O操作相关联。

事实上,如果使用粘性会话,我们不需要在“所有”配置中运行JBoss,我们可能会使用“默认”或“基于标准”的配置。

唯一需要做的就是更改$ JBOSS_HOME / server / YOUR_NODE_NAME / deploy / jbossweb.sar / server.xml:

LOCAL