具有高可用性的两台不同机器的集群?

Cluster of two different machine with high availability?

我有两台不同的机器。一个配置为 IP 192.168.2.100,另一个配置为 192.168.2.101。 这是第一个verticle的代码:

 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());
            });
        });
    }
}

这是第二个verticle的代码:

 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");
        });
    }
}

我尝试使用集群的高可用性来实现消费者消费消息和发送者发送 message.When 尝试杀死发送者以便在故障转移后重新部署 Verticle,我得到了以下异常:

    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(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.access0(HAManager.java:102)
    at io.vertx.core.impl.HAManager.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)

两个集群成员的 class 路径中都应该有 class com.vetx.Sender.Sender,因为它在两边都是 serialized/deserialized。好像其中一个成员没有它。 另外,你确定成员可以组成一个 2 人集群吗?我看到您的网络配置在每个主机上都有一个 IP getTcpIpConfig().addMember("192.168.2.101"),最佳做法是在所有主机上添加所有 IP,即在所有主机上使用相同的网络配置以避免混淆。