Hazelcast可以作为客户端连接到现有的Hazelcast集群,而不是作为集群的成员加入以实现vertx集群

时间:2015-10-20 15:41:55

标签: hazelcast vert.x

我们目前正在使用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)。

我们有三个原因依赖于淡褐色                                                                                                         
1)由于服务器重启期间的不一致2)我们使用嵌入式hazelcast,当不正常的hazelcast数据我们希望我们的应用程序独立于其他服务时,我们最终重新启动我们的应用程序
3)内存分配(hazelcast数据)现在独立于应用服务器

1 个答案:

答案 0 :(得分:0)

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客户端进行分布式锁定,则如果网络连接以对服务器节点不明显的方式停止(默认情况下所有其他JVM出口应该),则锁定的默认超时为60秒立即清除锁。)

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

>>> c=a[:]
>>> c
[1, 5, 3]
>>> a[1]=10
>>> a
[1, 10, 3]
>>> c
[1, 5, 3]

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

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

// 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文档:http://docs.hazelcast.org/docs/3.5/manual/html-single/index.html