【问题标题】:P2P Hazelcast Session Replication for Tomcat6 Web Clustering - Session Synchronization FailsTomcat6 Web 集群的 P2P Hazelcast 会话复制 - 会话同步失败
【发布时间】:2023-03-16 17:15:01
【问题描述】:

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

我想做什么?

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

【问题讨论】:

    标签: java tomcat6 hazelcast session-replication


    【解决方案1】:

    虽然我没有太多使用 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/
    

    我们有可以监控 hazelcast 会话的客户端吗?

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

    您还可以查看Docker code samples for container based session replication 以查看会话复制的工作配置。虽然没有使用 Apache 作为负载均衡器,但 one that uses Nginx 可能对您有所帮助。

    【讨论】:

    • 谢谢您,您非常接近并且部分正确。请参阅我对有效配置的回答。会话复制现在工作得很好。
    【解决方案2】:

    我得到它使用以下配置。认为它需要 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/
    

    【讨论】:

      猜你喜欢
      • 2016-05-23
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多