Кластер из двух разных машин с высокой доступностью?

У меня две разные машины. Один настроен с IP 192.168.2.100, а другой - с 192.168.2.101. Это код первой вертикали:

 public class Sender extends AbstractVerticle {

public static void main(String... args) {

        // Configuration du cluster manager
        Config config = new Config();
        config.getNetworkConfig().getJoin().getTcpIpConfig().addMember("192.168.2.101");

        VertxOptions options = new VertxOptions();
        options.setClusterManager(new HazelcastClusterManager());
        options.setClusterHost("192.168.2.100");
        options.setClustered(true);
        options.setHAEnabled(true);


        Vertx.clusteredVertx(options, vertx ->
                vertx.result().deployVerticle(Sender.class.getName(), new DeploymentOptions().setHa(true))
        );
    }


    @Override
    public void start() throws Exception {

        vertx.setPeriodic(5000, id -> {
            vertx.eventBus().send("Address", "message",rep->{
            System.out.println("response : "+rep.result().body());
            });
        });
    }
}

И это код второй вертикали:

 package com.vetx.Consumer;
import com.hazelcast.config.Config;



public class Consumer extends AbstractVerticle {

    private String name = null;

    public Consumer(String name) {
        this.name = name;
    }
    public Consumer(){

    }

    public static void main(String... args) {

        // Configuration du cluster manager
        Config config = new Config();
        config.getNetworkConfig().getJoin().getTcpIpConfig().addMember("192.168.2.100");

        VertxOptions options = new VertxOptions();
        options.setClusterManager(new HazelcastClusterManager());
        options.setClusterHost("192.168.2.101");
        options.setClustered(true);
        options.setHAEnabled(true);



        Vertx.clusteredVertx(options, vertx ->
                vertx.result().deployVerticle(Consumer.class.getName(), new DeploymentOptions().setHa(true))
        );
    }


    @Override
    public void start() throws Exception {

        vertx.eventBus().consumer("Address", message -> {
            System.out.println(" received message: " +message.body());
           message.reply("Success");
        });
    }
}

Я пытаюсь использовать высокую доступность с кластером для реализации потребителя, чтобы потреблять сообщение, и отправителя, чтобы отправить сообщение. При попытке убить отправителя для повторного развертывания вертикали после отработки отказа я получил следующее исключение:

    SEVERE: Failed to redeploy verticle after failover
java.lang.ClassNotFoundException: com.vetx.Sender.Sender
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at io.vertx.core.impl.JavaVerticleFactory.createVerticle(JavaVerticleFactory.java:37)
    at io.vertx.core.impl.DeploymentManager.createVerticles(DeploymentManager.java:229)
    at io.vertx.core.impl.DeploymentManager.lambda$doDeployVerticle$2(DeploymentManager.java:202)
    at io.vertx.core.impl.FutureImpl.setHandler(FutureImpl.java:76)
    at io.vertx.core.impl.DeploymentManager.doDeployVerticle(DeploymentManager.java:171)
    at io.vertx.core.impl.DeploymentManager.doDeployVerticle(DeploymentManager.java:143)
    at io.vertx.core.impl.DeploymentManager.deployVerticle(DeploymentManager.java:131)
    at io.vertx.core.impl.HAManager.doDeployVerticle(HAManager.java:281)
    at io.vertx.core.impl.HAManager.processFailover(HAManager.java:553)
    at io.vertx.core.impl.HAManager.checkFailover(HAManager.java:489)
    at io.vertx.core.impl.HAManager.nodeLeft(HAManager.java:309)
    at io.vertx.core.impl.HAManager.access$100(HAManager.java:102)
    at io.vertx.core.impl.HAManager$1.nodeLeft(HAManager.java:152)
    at io.vertx.spi.cluster.hazelcast.HazelcastClusterManager.memberRemoved(HazelcastClusterManager.java:325)
    at com.hazelcast.internal.cluster.impl.ClusterServiceImpl.dispatchEvent(ClusterServiceImpl.java:916)
    at com.hazelcast.internal.cluster.impl.ClusterServiceImpl.dispatchEvent(ClusterServiceImpl.java:88)
    at com.hazelcast.spi.impl.eventservice.impl.LocalEventDispatcher.run(LocalEventDispatcher.java:56)
    at com.hazelcast.util.executor.StripedExecutor$Worker.process(StripedExecutor.java:217)
    at com.hazelcast.util.executor.StripedExecutor$Worker.run(StripedExecutor.java:200)

1 ответ

Решение

Оба члена кластера должны иметь класс com.vetx.Sender.Sender в их classpath, так как он будет сериализован / десериализован с обеих сторон. Похоже, один из участников не имеет его. Кроме того, вы убедились, что участники могут сформировать кластер из 2? Я вижу, что у вашей конфигурации сети есть один ip на каждом хосте getTcpIpConfig().addMember("192.168.2.101")Лучшей практикой является добавление всех ip на всех хостах, т. е. иметь одинаковую конфигурацию сети на всех хостах, чтобы избежать путаницы.

Другие вопросы по тегам