2

在 Tomcat 的上下文中,是否可以在不启用粘性会话的情况下进行会话复制?

我了解粘性会话的目的是让客户端在整个会话期间“坚持”到 1 台服务器。使用会话复制,客户端与服务器的交互在整个集群(许多 Web 服务器)中复制。

在上述情况下,是否可以进行会话复制?即客户端的会话通过网络服务器传播,并且与任何一个网络服务器的每次交互都被复制,因此,允许无缝交互。

4

3 回答 3

2

AFAIK,tomcat 集群不支持非粘性会话。来自tomcat 文档

确保您的负载均衡器配置为粘性会话模式。

但是有一个解决方案(我创建,所以你知道我有偏见:-))称为memcached-session-manager (msm),它也支持非粘性会话。msm 使用memcached(或任何使用 memcached 协议的后端)作为会话备份/存储的后端。

在非粘性模式下,会话仅存储在 memcached 中,不再存储在 tomcat 中,与非粘性会话一样,会话存储必须是外部的(以避免陈旧数据)。

它还支持会话锁定:对于多个非粘性会话,并行请求可能会遇到不同的 tomcat,并且可以并行修改会话,因此某些会话更改可能会被其他会话覆盖。会话锁定允许同步发送到不同 tomcat 的并行请求。

msm 主页主要描述了粘性会话方法(仅以此开头),有关非粘性会话的详细信息,您可以在邮件列表中搜索或询问

可以在msm wiki (SetupAndConfiguration)中找到有关配置的详细信息和示例。

只是为了让您了解复杂性:您需要的是一个或多个运行的memcached服务器(或类似的 memcached)和一个更新的 tomcat context.xml,如下所示:

<Context>
  ...
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:host1.domain.com:11211,n2:host2.domain.com:11211"
    sticky="false"
    sessionBackupAsync="false"
    lockingMode="auto"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    />
</Context>

你的负载均衡器不需要特殊的配置,所以一旦你有了这些东西,你就可以开始测试你的应用程序了。

于 2012-02-20T12:04:00.483 回答
0

这里有一篇关于这个主题的优秀文章:

他们提到的兵马俑产品在这里有一个简单的教程:

Terracotta 在 Tomcat 上工作,但您必须注意检查哪些 Terracotta 是免费的,哪些是商业的。几年前,他们的多余商店已付款,我不记得该解决方案是单独的产品。

于 2012-02-20T14:18:30.413 回答
0

我实际上已经找到了这个问题的反面。带有 OOTB 选项的会话复制(Tomcat7)只能在没有粘性会话的情况下正常工作。打开日志记录后,我发现启用 JVMRoutes 后,我的会话 ID 从 A123456789 变为 A123456789.01——后缀为 jvmroute。该会话已成功从集群中的节点 01 复制到节点 02,但使用相同的 ID (A123456789.01)。当我从集群中取出节点 01 时,流量开始停留在节点 02 上——它现在寻找当然不存在的会话 A123456789.02。.01 在那里,但基本上处于闲置状态,直到它过期。如果我启动另一台服务器并复制会话然后将 02 关闭,我会得到更奇怪的行为,因为会话是在它停止的地方继续进行的。

对我来说,到目前为止,没有粘性会话的会话复制(只是集群中节点之间的常规 RR)是唯一有效的方法。

于 2014-07-17T14:58:14.820 回答