【问题标题】:Can Hazelcast connect as a client to existing Hazelcast cluster instead of joining as a member of the cluster to implement vertx clusteringHazelcast 可以作为客户端连接到现有的 Hazelcast 集群,而不是作为集群的成员加入以实现 vertx 集群
【发布时间】:2015-10-20 15:41:55
【问题描述】:

我们目前使用 vertx 和 hazelcast 作为其集群实现。为了让它按照文档工作 hazelcast 嵌入在我们的应用程序中,这意味着它将作为集群的成员加入。我们希望我们的应用程序独立于 Hazelcast。原因是当 Hazelcast 缓存变得不一致时,我们会关闭所有服务器并重新启动。相反,我们希望将 Hazelcast 保留在它自己的服务器上,并将 vertx 作为客户端连接,因此我们重新启动 hazelcast 独立于我们的应用程序服务器。 Zookeeper 集群实现完全按照我们的意愿进行,但我们不想仅出于此目的维护另一个集群,因为我们还将 Hazelcast 用于应用程序内部的其他缓存目的。目前我们正在做一些类似的事情来让 vertx 工作。

        Config hazelcastConfig = new Config();

        //Group
        GroupConfig groupConfig = new GroupConfig();
        groupConfig.setName(hzGroupName);
        groupConfig.setPassword(groupPassword);
        hazelcastConfig.setGroupConfig(groupConfig);

        //Properties
        Properties properties = new Properties();
        properties.setProperty("hazelcast.mancenter.enabled", "false");
        properties.setProperty("hazelcast.memcache.enabled", "false");
        properties.setProperty("hazelcast.rest.enabled", "false");
        properties.setProperty("hazelcast.wait.seconds.before.join", "0");
        properties.setProperty("hazelcast.logging.type", "jdk");
        hazelcastConfig.setProperties(properties);

        //Network
        NetworkConfig networkConfig = new NetworkConfig();
        networkConfig.setPort(networkPort);
        networkConfig.setPortAutoIncrement(networkPortAutoincrement);

        //Interfaces
        InterfacesConfig interfacesConfig = new InterfacesConfig();
        interfacesConfig.setEnabled(true);
        interfacesConfig.setInterfaces(interfaces);
        networkConfig.setInterfaces(interfacesConfig);

        //Join
        JoinConfig joinConfig = new JoinConfig();
        MulticastConfig multicastConfig = new MulticastConfig();
        multicastConfig.setEnabled(false);
        joinConfig.setMulticastConfig(multicastConfig);
        TcpIpConfig tcpIpConfig = new TcpIpConfig();
        tcpIpConfig.setEnabled(true);
        List<String> members = Arrays.asList(hzNetworkMembers.split(","));
        tcpIpConfig.setMembers(members);
        joinConfig.setTcpIpConfig(tcpIpConfig);
        networkConfig.setJoin(joinConfig);

        //Finish Network
        hazelcastConfig.setNetworkConfig(networkConfig);
        clusterManager = new HazelcastClusterManager(hazelcastConfig);


    VertxOptions options = new VertxOptions().setClusterManager(clusterManager);
    options.setClusterHost(interfaces.get(0));
    options.setMaxWorkerExecuteTime(VertxOptions.DEFAULT_MAX_WORKER_EXECUTE_TIME * workerVerticleMaxExecutionTime);
    options.setBlockedThreadCheckInterval(1000 * 60 * 60);

    Vertx.clusteredVertx(options, res -> {
        if (res.succeeded()) {
            vertx = res.result();
        } else {
            throw new RuntimeException("Unable to launch Vert.x");
        }
    });

*********替代解决方案**********

实际上,我们将分布式缓存实施从 hazelcast 更改为 Redis (Amazon ElastiCache)。

我们无法依赖 hazelcast 有 3 个原因。

1) 因为它在服务器重新启动期间不一致
2) 我们使用嵌入式 hazelcast,当 hazelcast 数据不一致时我们最终重新启动了我们的应用程序我们希望我们的应用程序独立于其他服务
3) 内存分配(hazelcast 数据)现在独立于应用程序服务器

【问题讨论】:

  • 我已经为我们最终做的事情添加了替代解决方案
  • 我认为我在下面的回答解决了您的问题 1,2 和 3。但是您必须等待拉取请求何时解决(或自己构建 vertx-hazelcast 结节)。很高兴听到它在人们的现场案例中效果如何。
  • Vert.x 已经发布了 3.2.1 以及我之前在回答中提到的拉取请求,现在您可以使用我在下面提到的 Hazelcast 智能客户端。

标签: hazelcast vert.x


【解决方案1】:

Vertx 3.2.0 现在支持为其构建一个集群的预配置 Hazelcast 实例。因此,您可以完全控制 Hazelcast 配置,包括您希望数据存储的方式和位置。但是您还需要来自 Vert.x 3.2.1 release 的错误修复才能真正使用它。

https://github.com/vert-x3/vertx-hazelcast/blob/master/src/main/asciidoc/index.adoc#using-an-existing-hazelcast-cluster查看更新的文档

注意:当您创建自己的集群时,您需要进行 Vertx 所需的额外 Hazelcast 设置。这些在上面的文档中都有说明。

Vert.x 3.2.1 release 修复了阻止使用客户端连接的问题。请注意,如果您使用 Hazelcast 客户端执行分布式锁,则默认超时为 60 秒,如果网络连接以服务器节点不明显的方式停止(所有其他 JVM 退出应立即清除)一把锁)。

您可以使用以下方法降低此金额:

// This is checked every 10 seconds, so any value < 10 will be treated the same
System.setProperty("hazelcast.client.max.no.heartbeat.seconds", "9");  

另外请注意,对于 Hazelcast 客户端,您可能希望对某些地图使用近缓存,并查看其他高级配置选项以调整客户端的性能,这将与完整数据节点的行为不同。

从 3.2.1 版开始,您可以运行其他完整的 Hazelcast 节点,这些节点使用 Vertx 所需的地图设置正确配置。然后在启动 Vertx 时创建自定义 Hazelcast 客户端(取自一个新的单元测试用例):

ClientConfig clientConfig = new ClientConfig().setGroupConfig(new GroupConfig("dev", "dev-pass"));
HazelcastInstance clientNode1 = HazelcastClient.newHazelcastClient(clientConfig);

HazelcastClusterManager mgr1 = new HazelcastClusterManager(clientNode1);
VertxOptions options1 = new VertxOptions().setClusterManager(mgr1).setClustered(true).setClusterHost("127.0.0.1");

Vertx.clusteredVertx(options1, ...)

显然您的客户端配置和需求会有所不同。有关客户端配置,请参阅 Hazelcast 文档:http://docs.hazelcast.org/docs/3.5/manual/html-single/index.html

【讨论】:

    最近更新 更多