我正在尝试向我新创建的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(或者应该稍后添加的新成员的范围。
我不确定这是否是正确的方法,所以任何帮助都表示赞赏。
谢谢!
答案 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中再次运行相同的配置。两者都将加入并形成一个集群。