java - Tomcat6 Web 集群的 P2P Hazelcast session 复制 - session 同步失败

标签 java tomcat6 hazelcast session-replication

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

我想做什么?

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

我确实引用了这个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 中的 session 条目。所有 session 都存储在 Hazelcast IMap 中,并通过其 ID 进行键入。请注意,您需要在集群成员上启用管理中心,然后才能查看管理中心上的任何数据。

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

关于java - Tomcat6 Web 集群的 P2P Hazelcast session 复制 - session 同步失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46964194/

相关文章:

java - 当 mediaSets 中附加 java 7 时,install4j 工具提示卡住

Java 象棋棋盘

windows - JRuby on Rails 无法与在 Windows Server 2008 上作为服务运行的 Tomcat 一起使用

java - 服务器上用于序列化的 Hazelcast 类定义

java - 使用 Excel 表中的信息填充 Mysql 表,包括图像的相对路径

java - 为什么 Tomcat 7x 不需要在 web.xml 中配置 WSServletContextListener 和 WSServlet 来部署 Jax-ws 服务?

java - 作用域 bean 应如何在 Hazelcast 中触发 session 创建

spring-boot - 中型数据项目需要选择哪个分布式数据库

java - 如何在 drools 7 中创建可重复使用的 KieBase