30

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

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

如果您必须启用粘性会话,谁能解释会话复制的真正用途是什么?因为那样你将不必要地在每个节点上复制会话,当具有给定会话 id 的请求总是去同一个节点时。在节点崩溃的情况下这可能是有益的,但是这种情况不会经常发生,并且仅为此使用会话复制似乎有点过头了。

4

3 回答 3

83

正如Mindas之前解释的那样:

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

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

我认为唯一真正的好处是能够不假思索地关闭 Tomcat 实例。这尤其适用于今天的云世界(想想亚马逊 AWS 现货实例),此时节点可以非常频繁地打开和关闭。替代方案是购买一个支持节点耗尽的体面的负载均衡器。但是体面的负载均衡器很昂贵,而且耗尽需要时间。

我能想到的另一种情况是购物车(实施不佳),其中物品保留在其中HttpSession并且关闭将需要用户重新购买它们(这可能会导致销售损失)。

但在大多数情况下,你是对的——同时拥有粘性会话和会话复制的好处是非常微不足道的。

于 2011-06-17T22:04:09.863 回答
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.xmlcacheMode参数中设置为LOCAL.

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

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

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

<Engine name="jboss.web" defaultHost="localhost" jvmRoute="YOUR_NODE_NAME">
于 2012-03-30T19:18:22.573 回答