2015-10-20 53 views
0

我们目前使用vertx和hazelcast作为其群集实现。为了按照文档工作,hazelcast嵌入到我们的应用程序中,意味着它将作为集群的成员加入。我们希望我们的应用程序独立于Hazelcast。原因在于,当Hazelcast缓存变得不一致时,我们会关闭所有服务器并重新启动。相反,我们希望将Hazelcast保留在自己的服务器上,并将vertx作为客户端连接,以便我们重新启动与我们的应用程序服务器无关的hazelcast。 Zookeeper集群实现完全符合我们的需求,但我们不希望为此目的维护另一个集群,因为我们也将Hazelcast用于其他缓存目的,这些目的是在我们的应用程序内部。目前我们正在做一些这样的事情来使vertx工作。Hazelcast可以作为客户端连接到现有的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的(亚马逊ElastiCache)。

我们之所以选择依靠榛树有三个原因。

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

+0

我已添加备用解决方案以发布我们最终做的 – Mallikarjun

+0

我认为我的答案在下面解决了您的问题1,2和3.但您必须等待测试拉取请求解决(或做你自己的'vertx-hazelcast'结节)。很高兴听到它在人们活动案例中的效果如何。 –

+0

Vert.x已经发布了3.2.1,并在我的回答中提到了拉取请求,现在您可以使用Hazelcast Smart Clients,如下所述。 –

回答

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客户端执行分布式锁定,则如果网络连接以服务器节点不明显的方式停止,则默认超时时间为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开始,您可以使用Vertx所需的地图设置正确配置其他完整的Hazelcast节点。并开始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

相关问题