Нестабильность кластера Vertx Hazelcast при перезагрузке обновленной фляги - PullRequest
0 голосов
/ 03 февраля 2019

Я провожу некоторые эксперименты с кластеризованным Vertx (vertx 3.6.0 и vertx-hazelcast 3.6.2).На данный момент я реализовал игрушечный распределенный реестр {String => String}, работающий на нескольких узлах с основными операциями (set, get, del), которые я запускаю по HTTP.Например, curl http://localhost:8081/set/key1/val1 просит узел, прослушивающий порт 8081, сохранить значение val1 под ключом var1.Хранилище данных для реестра - это AsyncMap, который Vertx предоставляет, выполняя vertx.sharedData().<String, String>getAsyncMap(...).До сих пор я не настраивал ничего, связанного с Hazelcast, и поэтому я использую конфигурацию по умолчанию, которая поставляется с библиотекой.Тестовые примеры, такие как сбой и восстановление узлов, добавление новых узлов, одновременное добавление нескольких узлов и т. Д., Работают нормально.

Один из моих тестовых примеров - обновление приложения без простоев.Это выглядит следующим образом:

  1. Некоторые узлы работают за балансировщиком нагрузки HTTP, который будет распределять запросы по узлам
  2. Обновите приложение (добавьте некоторые функции и перекомпилируйте приложение. ДляВ качестве примера я реализовал функцию keys, которая возвращает список ключей, определенных в реестре.
  3. Удалите node_1 из балансировщика нагрузки и остановите его.
  4. Перезапустите node_1 с новым fat-jar, позвольте ему присоединиться к кластеру и повторно синхронизировать карту, и повторно включите его в балансировщике нагрузки.
  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

Есть идеи?

...