会话复制是否可以在没有粘性会话的情

时间:2012-02-20 11:27:27

标签: apache tomcat load-balancing cluster-computing session-replication

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

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

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

3 个答案:

答案 0 :(得分:2)

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

  

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

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

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

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

msm home page主要描述了粘性会话方法(因为它仅以此开头),有关您可能在mailing list上搜索或询问的非粘性会话的详细信息。

有关配置的详细信息和示例,请参阅msm wiki (SetupAndConfiguration)

只是为了让您了解复杂性:您需要的是运行一个或多个memcached服务器(或者说类似于memcached的s.th.)和更新的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>

您的负载均衡器不需要特殊配置,因此一旦您准备好这些东西,您就可以开始测试您的应用程序了。

答案 1 :(得分:0)

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

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

Terracotta适用于Tomcat,但你必须注意检查哪些兵马俑是免费的,哪些是商业的。几年前他们的冗余商店已经付清了,我不记得这个解决方案是一个独立的产品。

答案 2 :(得分:0)

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

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

相关问题