在创建HazelcastInstance之后添加新的Hazelcast成员

时间:2016-06-24 09:26:12

标签: hazelcast

我正在尝试向我新创建的HazelcastInstance添加一个新成员(在它初始化之后)但我找不到这样做的API。我不想使用Multicast,所以我禁用了它,这是代码:

Config config = new Config();
config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false);
HazelcastInstance instance = Hazelcast.newHazelcastInstance(config);

我尝试在初始化后将成员添加到配置中,但它似乎没有做任何事情:

instance.getConfig().getNetworkConfig().getJoin().getTcpIpConfig().addMember("192.168.1.5");

如果我在调用Hazelcast.newHazelcastInstance(config)方法之前调用它,上面的代码可以工作,但这对我来说不是一个解决方案,因为我想要一个正在运行的实例而我不知道IP(或者应该稍后添加的新成员的范围。

我不确定这是否是正确的方法,所以任何帮助都表示赞赏。

谢谢!

5 个答案:

答案 0 :(得分:4)

另一种选择是编写自己的DiscoveryStrategy:http://docs.hazelcast.org/docs/3.6/manual/html-single/index.html#discovery-spi

无论如何,在所有情况下,Hazelcast只会在一定时间间隔内请求新成员。没有办法'#34;添加新成员"并且通常不需要新成员加入现有集群,因此新成员需要了解旧成员,而不是相反。

答案 1 :(得分:1)

问题是:

instance.getConfig().getNetworkConfig().getJoin().getTcpIpConfig().addMember("192.168.1.5")

不起作用。但是,根据我的经验(使用版本3.7.1),它确实有效。不是立即,但在一分钟左右的时间内新成员被添加到集群中,我想滞后是interval @nocatrius提及。

值得一提的是成员在不同的主机上,否则配置就像在问题中一样。

答案 2 :(得分:1)

借用另一个answer 为了在同一个接口上本地测试成员和客户端,我不得不这样做 1.指导HZ     System.setProperty(" hazelcast.socket.server.bind.any"," false");     System.setProperty(" hazelcast.socket.bind.any"," false"); 2.添加所需的界面     config.getNetworkConfig()。getInterfaces()。setEnabled(true).addInterface(memberNodeDefinition.getParameters()。get(" 192.168.1.0"));

关于上述属性,定期检查新成员,在3.9版本中实际上是5分钟。我发现这可以控制它:

System.setProperty("hazelcast.merge.first.run.delay.seconds", "5")

答案 3 :(得分:0)

henryw374和Vortex的答案也对我有用。我可以报告说,不需要设置属性hazelcast.socket.server.bind.any和hazelcast.socket.bind.any。如上所述,hazelcast.merge.first.run.delay.seconds hazelcast.merge.next.run.delay.seconds也是可配置的。就我而言,将Hazelcast集成为Hibernate的2级缓存需要在知道群集配置之前使用Hibernate初始化Hazelcast。在hibernate.cfg.xml中设置Hazelcast实例名称,并在hazelcast.xml中设置服务器自己的IP和接口后,以后添加节点(即加入集群)所需的全部操作是:

HazelcastInstance hazelcastInstance = Hazelcast.getHazelcastInstanceByName('hazelcast-hibernate-instance');
hazelcastInstance.getConfig().getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(true).addMember('x.x.x.x')

答案 4 :(得分:-1)

您需要定义网络配置,并且您应该知道群集将与之通信的IP地址列表。
否则,您可以通过在单个计算机/ localhost本身中运行多个Hazelcast实例来启动集群 请注意,如果您希望多个实例加入并形成群集,则所有实例应共享相同的配置,否则它们将形成自己的群集。最好的办法是在hazelcast.xml中定义配置。如果您想要以编程方式,那么您可以按照下面的示例。

    Config config = new Config();
    NetworkConfig network = config.getNetworkConfig();
    network.getJoin().getMulticastConfig().setEnabled(false);
    network.getJoin().getTcpIpConfig().setEnabled(true);
    network.setPortAutoIncrement(true);
    network.setPort(33001);
    network.getJoin().getTcpIpConfig().addMember("127.0.0.1");

    HazelcastInstance hz1 = Hazelcast.newHazelcastInstance(config);
    HazelcastInstance hz2 = Hazelcast.newHazelcastInstance(config);

上面的代码将在同一JVM中的localhost中启动两个实例。

Jun 24, 2016 4:35:42 PM com.hazelcast.cluster.ClusterService
INFO: [127.0.0.1]:33001 [dev] [3.5] 
Members [2] {
    Member [127.0.0.1]:33001 this
    Member [127.0.0.1]:33002
}
Jun 24, 2016 4:35:44 PM com.hazelcast.core.LifecycleService
INFO: [127.0.0.1]:33002 [dev] [3.5] Address[127.0.0.1]:33002 is STARTED

另一种方法是删除hz2行并在其自己的JVM中再次运行相同的配置。两者都将加入并形成一个集群。