首页 > 解决方案 > Vertx hazelcast集群在重新加载更新的fat-jar时不稳定

问题描述

我正在用集群 Vertx(vertx 3.6.0 和 vertx-hazelcast 3.6.2)做一些实验。目前,我实现了一个玩具分布式注册表 {String => String},它在几个节点上运行,具有由 HTTP 触发的基本操作 ( set, get, )。del例如curl http://localhost:8081/set/key1/val1请求节点侦听端口8081以将值存储val1在 key 下var1。注册表的数据存储是 Vertx 通过执行提供的 AsyncMap vertx.sharedData().<String, String>getAsyncMap(...)。到目前为止,我没有配置任何与 Hazelcast 相关的内容,因此,我使用的是库附带的默认配置。节点故障和恢复、添加新节点、同时添加多个节点等测试用例工作正常。

我的一个测试用例是没有停机时间的应用程序更新。如下:

  1. 让一些节点在 HTTP 负载平衡器后面运行,该负载平衡器将在节点上分发请求
  2. 更新应用程序(添加一些功能并重新编译应用程序。为了示例,我实现了一个keys返回注册表中定义的键列表的函数)。
  3. 从负载均衡器中移除node_1并停止它。
  4. 用新的 fat-jar重启node_1,让它加入集群并重新同步地图,并在负载均衡器中重新启用它。
  5. 对所有节点执行相同的操作。
  6. 使客户端能够使用新功能。

问题发生在第 4 步:更新的节点大部分时间重新启动,没有记录任何错误,但我在尚未更新的节点上收到错误和异常,如果发生这种情况,新节点上的映射不同步(空) 并且旧节点不再响应 HTTP 请求。这不是系统的,有时一切都很好,但大多数时候,繁荣!

例如:

févr. 03, 2019 7:56:54 AM com.hazelcast.internal.partition.operation.MigrationRequestOperation
WARNING: [192.168.8.149]:5701 [dev] [3.10.5] Error while executing beforeMigration()
java.lang.NoClassDefFoundError: com/hazelcast/map/impl/querycache/publisher/AccumulatorSweeper
    at com.hazelcast.map.impl.MapMigrationAwareService.flushAndRemoveQueryCaches(MapMigrationAwareService.java:104)
    at com.hazelcast.map.impl.MapMigrationAwareService.beforeMigration(MapMigrationAwareService.java:88)
    at com.hazelcast.spi.impl.CountingMigrationAwareService.beforeMigration(CountingMigrationAwareService.java:76)
    at com.hazelcast.map.impl.MapService.beforeMigration(MapService.java:147)
    at com.hazelcast.internal.partition.operation.BaseMigrationOperation.executeBeforeMigrations(BaseMigrationOperation.java:180)
    at com.hazelcast.internal.partition.operation.MigrationRequestOperation.executeBeforeMigrations(MigrationRequestOperation.java:186)
    at com.hazelcast.internal.partition.operation.MigrationRequestOperation.run(MigrationRequestOperation.java:216)
    at com.hazelcast.spi.Operation.call(Operation.java:148)
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.call(OperationRunnerImpl.java:202)
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:191)
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:405)
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.process(OperationThread.java:115)
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.run(OperationThread.java:100)

我在使用相同的源代码执行相同的进程时得到的另一个示例:

févr. 03, 2019 8:24:30 AM com.hazelcast.nio.tcp.TcpIpConnectionManager
INFO: [192.168.8.149]:5701 [dev] [3.10.5] Established socket connection between /192.168.8.149:5701 and /192.168.8.149:34634
févr. 03, 2019 8:24:32 AM com.hazelcast.internal.networking.nio.iobalancer.IOBalancer
SEVERE: [192.168.8.149]:5701 [dev] [3.10.5] IOBalancer failed
java.lang.NoClassDefFoundError: com/hazelcast/internal/networking/nio/NioInboundPipeline$StartMigrationTask
    at com.hazelcast.internal.networking.nio.NioInboundPipeline.requestMigration(NioInboundPipeline.java:115)
    at com.hazelcast.internal.networking.nio.iobalancer.IOBalancer.tryMigrate(IOBalancer.java:212)
    at com.hazelcast.internal.networking.nio.iobalancer.IOBalancer.scheduleMigrationIfNeeded(IOBalancer.java:153)
    at com.hazelcast.internal.networking.nio.iobalancer.IOBalancer.checkInboundPipelines(IOBalancer.java:146)
    at com.hazelcast.internal.networking.nio.iobalancer.IOBalancerThread.run(IOBalancerThread.java:50)
Caused by: java.lang.ClassNotFoundException: com.hazelcast.internal.networking.nio.NioInboundPipeline$StartMigrationTask
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 5 more

任何想法 ?

标签: javahazelcastvert.x

解决方案


推荐阅读