当前位置: 首页 > 知识库问答 >
问题:

滚动更新时使用Hazelcast错误的kubernetes上的Camel集群

轩辕源
2023-03-14

我有一个嵌入式Hazelcast实例,我将其配置为使用k8s API(服务发现),并使用Route Policy拥有一个主动/被动集群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实例时,是否需要将实例添加到camel组件

我正在使用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

共有1个答案

郭翰墨
2023-03-14

如果您将Hazelcast与滚动升级(或缩小)一起使用,您应该配置如下所述的优雅关闭:

  • 库伯内特斯滚动升级和缩放
  • Hazelcast Docker优雅关机
 类似资料:
  • 使用Helm创建Tomcat吊舱 helm创建hello-world 更改了deployment.yaml中的映像名和部署名

  • 滚动更新 TiDB 集群时,会按 PD、TiKV、TiDB 的顺序,串行删除 Pod,并创建新版本的 Pod,当新版本的 Pod 正常运行后,再处理下一个 Pod。 滚动升级过程会自动处理 PD、TiKV 的 Leader 迁移与 TiDB 的 DDL Owner 迁移。因此,在多节点的部署拓扑下(最小环境:PD * 3、TiKV * 3、TiDB * 2),滚动更新 TiKV、PD 不会影响业务

  • 我为不同的项目安装了两个kubernetes,在我所看到的最好的情况下,它们在重要的区域具有等效的配置,但这两个执行滚动更新的方式不同。 两者都是使用KOPS安装在AWS上的。

  • 我正在使用hazelcast集群的两个成员运行一个POC,使用3.4.1版本的hazelcast。我观察到一个奇怪的行为,其中一个成员不断抛出WrongTargetException。这是一个罕见的场景,我能够通过以下事件序列复制: 假设我运行的集群有两个成员,比如X和Y。 从集群中拔出Y,使其变得无响应。 X认为Y没有响应,因此将其从集群中删除。 再次插入Y,Y假设它没有收到来自X的任何响应/心

  • 为了在生产中部署express Node.js api,我希望使用kubernetes,以下步骤如下: 在google cloud中创建集群 从git将代码克隆到集群 Docker build-t gcr.io/[GCLOUDID]/app:v1。 Docker pushgcr.io/[GCLOUDID]/app:v1 Kubectl运行app--image=gcr.io/[GCLOUDID]/a

  • 我需要在gke中部署一个Web应用程序。该应用程序由两个pod组成,需要扩展到约30个副本。 滚动更新需要大约30秒/吊舱在我们的设置。 旧标题:如何在GKE集群上启用部署API? 我尝试使用部署,因为它们允许并行更新多个pod。但是,正如nshttpd在《kubernetes slack上的谷歌容器》中指出的那样:我可能错了,但我认为GKE集群没有beta版的功能。因此,如果您想要部署,就必须启