【问题标题】:Camel cluster on kubernetes using Hazelcast error when rolling updates滚动更新时 kubernetes 上的骆驼集群使用 Hazelcast 错误
【发布时间】:2021-02-09 08:37:09
【问题描述】:

我有一个嵌入式 Hazelcast 实例,我将其配置为使用 k8s API(服务发现),并使用路由策略来拥有一个主动/被动集群 FTP 阅读器。

集群中至少有 3 个实例。我的滚动更新是先添加一个新实例,然后再替换旧实例。

我在滚动更新时收到此错误。

[com.hazelcast.core.HazelcastInstanceNotActiveException - Hazelcast instance is not active!]com.hazelcast.core.HazelcastInstanceNotActiveException: Hazelcast instance is not active! 
at com.hazelcast.spi.impl.AbstractDistributedObject.throwNotActiveException(AbstractDistributedObject.java:115) 
at com.hazelcast.spi.impl.AbstractDistributedObject.lifecycleCheck(AbstractDistributedObject.java:110) 
at com.hazelcast.spi.impl.AbstractDistributedObject.getNodeEngine(AbstractDistributedObject.java:104) 
at com.hazelcast.map.impl.proxy.MapProxyImpl.tryLock(MapProxyImpl.java:500) 
at org.apache.camel.component.hazelcast.policy.HazelcastRoutePolicy.acquireLeadership(HazelcastRoutePolicy.java:296) 
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) 
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 
at java.base/java.lang.Thread.run(Thread.java:834)

看起来 Hazelcast 实例在骆驼有机会为该集群选举新领导之前停止。

问题:

  1. 在代码中创建 Hazelcast 实例时,是否需要将实例添加到骆驼组件中?
  2. 如何控制关闭顺序以确保将锁迁移到其他节点?
  3. 有任何代码示例说明应该如何做到这一点?

我正在使用 Hazelcast kubernetes 插件

    Config config = new Config();

    config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);

    config
        .getNetworkConfig()
        .getJoin()
        .getKubernetesConfig()
        .setEnabled(true)
        .setProperty("namespace", "aaaa")
        .setProperty("service-name", "bbbb");

    HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance(config);

然后我创建一个路由策略

    HazelcastRoutePolicy routePolicy = new HazelcastRoutePolicy(hz);
    routePolicy.setLockMapName("etl");
    routePolicy.setLockKey("etl-key");
    routePolicy.setLockValue("etl-value");
    routePolicy.setTryLockTimeout(5, TimeUnit.SECONDS);
    context.getRegistry().bind("cluster", routePolicy);

并在我的路线中使用此政策:

        .routePolicyRef("cluster")

提前致谢:)

编辑

我认为这是相关的,我总是将 Hazelcast 节点的数量增加一倍作为 Pod。 我启动了一个 3 个容器集群并在日志中看到 6 个。

Members {size:6, ver:6} [
      Member [172.30.0.3]:5701 - ae3861bb-3f77-427e-ada1-5b669c89776f
      Member [172.30.0.4]:5701 - cd7741f0-a3b1-4883-a8bb-c3fecaad6b14 this
      Member [172.30.0.2]:5701 - 3403bbee-8141-4572-bbd2-4379bf452e79
      Member [172.30.0.3]:5702 - 0d48a691-b166-4d29-9b34-77b93be4370b
      Member [172.30.0.4]:5702 - d36f0342-730e-40e6-a18e-cf72d9d4b574
      Member [172.30.0.2]:5702 - f3644c6c-afe7-4f48-9832-b604830b6955

【问题讨论】:

    标签: kubernetes apache-camel hazelcast


    【解决方案1】:

    如果您将 Hazelcast 与滚动升级(或缩减)一起使用,则应按照此处所述配置正常关闭:

    【讨论】:

    • 不是这样,我有所有这些 JVM 标志。我怀疑启动了两个 Hazelcast 实例。
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2019-12-16
    • 1970-01-01
    相关资源
    最近更新 更多