我正在尝试使用Hazelcast Tomcat Web会话复制在两个Tomcat实例之间实现基于粘性会话的负载平衡。出于测试目的,我在两个不同的Tomcat实例上部署了应用程序,并通过Apache HTTPD处理负载平衡。 jvmroute参数和mod-proxy设置都很好,负载平衡没有问题。
问题在于跨两个实例的会话复制。当第一台服务器(当前正在服务请求)发生故障时,请求将被发送到第二台服务器。 Hazelcast群集通过故障转移识别会话,并使用新会话ID(后缀为第二台服务器的jvmroute参数)复制会话 - 如Hazelcast文档https://github.com/hazelcast/hazelcast-tomcat-sessionmanager#sticky-sessions-and-tomcat中所述)。但是,对于故障转移请求,会话属性将在较旧的会话中更新(通过jvmroute失败)并且不会被复制,从而导致后续请求失败。
我已经阅读了文档,但此时无法找到解决方案。我确信我错过了一些设置,因为这将是故障转移方案的基本设置。
有人可以帮帮我吗?如果您需要任何其他详细信息,请与我们联系。
[UPDATE] 跟踪流后,能够确定正确调用com.hazelcast.session.HazelcastSessionChangeValve中的handleTomcatSessionChange。 request.changeSessionId(newSessionId)调用发生并发布,如果我显示requestedsession id的值,则更新该值。但是,会话ID本身不会更新,这会导致request.getSession()。getId()调用中的旧ID。