在 Tomcat 的上下文中,是否可以在不启用粘性会话的情况下进行会话复制?
我了解粘性会话的目的是让客户端在整个会话期间“坚持”到 1 台服务器。使用会话复制,客户端与服务器的交互在整个集群(许多 Web 服务器)中复制。
在上述情况下,是否可以进行会话复制?即客户端的会话通过网络服务器传播,并且与任何一个网络服务器的每次交互都被复制,因此,允许无缝交互。
在 Tomcat 的上下文中,是否可以在不启用粘性会话的情况下进行会话复制?
我了解粘性会话的目的是让客户端在整个会话期间“坚持”到 1 台服务器。使用会话复制,客户端与服务器的交互在整个集群(许多 Web 服务器)中复制。
在上述情况下,是否可以进行会话复制?即客户端的会话通过网络服务器传播,并且与任何一个网络服务器的每次交互都被复制,因此,允许无缝交互。
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>
你的负载均衡器不需要特殊的配置,所以一旦你有了这些东西,你就可以开始测试你的应用程序了。
这里有一篇关于这个主题的优秀文章:
他们提到的兵马俑产品在这里有一个简单的教程:
Terracotta 在 Tomcat 上工作,但您必须注意检查哪些 Terracotta 是免费的,哪些是商业的。几年前,他们的多余商店已付款,我不记得该解决方案是单独的产品。
我实际上已经找到了这个问题的反面。带有 OOTB 选项的会话复制(Tomcat7)只能在没有粘性会话的情况下正常工作。打开日志记录后,我发现启用 JVMRoutes 后,我的会话 ID 从 A123456789 变为 A123456789.01——后缀为 jvmroute。该会话已成功从集群中的节点 01 复制到节点 02,但使用相同的 ID (A123456789.01)。当我从集群中取出节点 01 时,流量开始停留在节点 02 上——它现在寻找当然不存在的会话 A123456789.02。.01 在那里,但基本上处于闲置状态,直到它过期。如果我启动另一台服务器并复制会话然后将 02 关闭,我会得到更奇怪的行为,因为会话是在它停止的地方继续进行的。
对我来说,到目前为止,没有粘性会话的会话复制(只是集群中节点之间的常规 RR)是唯一有效的方法。