Tomcat6 Web 集群的 P2P Hazelcast 会话复制 - 会话同步失败

P2P Hazelcast Session Replication for Tomcat6 Web Clustering - Session Synchronization Fails

我相信我在负载平衡方面或 tomcat 中缺少一些配置,如果有人可以提供帮助并提供解决方案,那就太好了。

我想做什么?

  1. 通过参考此 guide
  2. 为 tomcat6 设置两个具有 P2P Hazelcast 会话复制的 tomcat 实例
  3. 我已将 hazelcast-all-.jar、hazelcast-tomcat-sessionmanager-.jar 和 hazelcast.xml 放在文件夹 $CATALINA_HOME/lib/
  4. 更新了侦听器和上下文配置,如下所示
  5. 更新了 Tomcat 故障转移和 jvmRoute 参数,如下所示
  6. 到目前为止,我能够调出相互连接的 tomcat 个实例,我在 tomcat 日志中看到了这一点。
  7. 用户连接到负载均衡器并路由到均衡器成员 - 这里没有问题。
  8. 但是当我关闭其中一个 tomcat 实例以测试故障转移并确保连接到 tom 实例的用户能够继续使用同一会话访问 cat 实例而无需登录再次。但我相信负载均衡器似乎正在创建一个新会话并强制用户再次登录以与 cat 实例建立会话。我怀疑是这个,但不确定。
  9. 或者会话没有在两个 hazelcast 实例中被复制和同步? - 这正在发生
  10. 我们有可以监视 hazelcast 会话的客户端吗? - 现在我做

我确实提到了这个 issue,它指的是设置 hazelcast.sessionId 而不是 JSESSIONID,但没有提供任何关于如何设置的细节。

版本 -

Apache Haus - 2.2.32 (for load balancing)
Hazelcast - 3.8.6
Java 8
Tomcat - 6.0.48
Session objects that need to be clustered are Serializable.
stickysession=JSESSIONID

负载均衡器配置

 <Proxy balancer://mycluster>
        BalancerMember http://IPAddress1:8080/app/  route=tom
        BalancerMember http://IPAddress2:8080/app/  route=cat
        ProxySet lbmethod=byrequests stickysession=JSESSIONID|jsessionid
 </Proxy>

    ProxyPass /app/ balancer://mycluster/ 
    ProxyPassReverse /app/ balancer://mycluster/

tom 实例 - server.xml

<Listener className="com.hazelcast.session.P2PLifecycleListener"/>
<Engine name="Catalina" defaultHost="localhost"  jvmRoute="tom">

tom 实例 - context.xml

<Manager className="com.hazelcast.session.HazelcastSessionManager" sticky=true/>

cat 实例 - server.xml

<Listener className="com.hazelcast.session.P2PLifecycleListener"/>
<Engine name="Catalina" defaultHost="localhost"  jvmRoute="cat">

cat 实例 - context.xml

<Manager className="com.hazelcast.session.HazelcastSessionManager" sticky=true/>

更新:

我相信以下是我遇到的相同问题session sync failure

虽然我没有太多使用 Apache HTTP 服务器作为负载均衡器的经验,但看着 this page,我认为您需要按如下方式更新您的负载均衡器配置:

<Proxy balancer://mycluster>
    BalancerMember http://IPAddress1:8080/app/  route=tom
    BalancerMember http://IPAddress2:8080/app/  route=cat
    ProxySet lbmethod=byrequests stickysession=hazelcast.sessionId
</Proxy>

ProxyPass /app/ balancer://mycluster/ 
ProxyPassReverse /app/ balancer://mycluster/

Do we have a client where I could monitor hazelcast sessions?

您可以使用 Hazelcast Management Center 来监控集群并浏览存储在 Hazelcast IMap 中的会话条目。所有会话都存储在由其 ID 键控的 Hazelcast IMap 中。请注意,您需要先在集群成员上启用管理中心,然后才能在管理中心上查看任何数据。

您也可以看看Docker code samples for container based session replication to see a working configuration of session replication. Although there's none that uses Apache as a load balancer, there's one that uses Nginx,可能对您有帮助。

我用下面的配置让它工作。认为它需要 jsessionid 和 hazelcast.sessionid,会话复制现在工作得很好。

<Proxy balancer://mycluster>
    BalancerMember http://IPAddress1:8080/app/  route=tom
    BalancerMember http://IPAddress2:8080/app/  route=cat
    ProxySet lbmethod=byrequests stickysession=JSESSIONID|jsessionid|hazelcast.sessionId
</Proxy>

ProxyPass /app/ balancer://mycluster/ 
ProxyPassReverse /app/ balancer://mycluster/