在创建 HazelcastInstance 后添加新的 Hazelcast 成员
Add new Hazelcast member after HazelcastInstance has been created
我正在尝试向我新创建的 HazelcastInstance 添加一个新成员(在它初始化之后),但是我找不到 API 来这样做。我不想使用多播,所以我禁用了它,代码如下:
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(或范围)。
我不确定这是否是解决此问题的正确方法,因此非常感谢您的帮助。
谢谢!
您需要定义网络配置,并且您应该知道集群将在其间通信的 IP 地址列表。
否则,您可以通过 运行 在单个 machine/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 的本地主机中启动两个实例。
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 中再次 运行 相同的配置。两者都将加入并形成一个集群。
另一种选择是编写自己的 DiscoveryStrategy:http://docs.hazelcast.org/docs/3.6/manual/html-single/index.html#discovery-spi
无论如何,在所有情况下,Hazelcast 只会在特定的时间间隔内请求新成员。没有办法 "add new members" 并且通常不需要因为新成员加入现有集群,因此新成员需要了解旧成员而不是相反。
题目说:
instance.getConfig().getNetworkConfig().getJoin().getTcpIpConfig().addMember("192.168.1.5")
不起作用。但是,根据我的经验(使用 3.7.1 版),它确实有效。不是立即,而是在大约一分钟内将新成员添加到集群中,我猜延迟是 interval
@nocatrius 提到的。
值得一提的是成员在不同的主机上,否则配置与问题中的一样。
向他人借用
要在同一界面上本地测试成员和客户端,我必须
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")
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实例名,在[=18=中设置了服务器自身的IP和接口后,后面添加节点,即加入集群,需要的是:
HazelcastInstance hazelcastInstance = Hazelcast.getHazelcastInstanceByName('hazelcast-hibernate-instance');
hazelcastInstance.getConfig().getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(true).addMember('x.x.x.x')
我正在尝试向我新创建的 HazelcastInstance 添加一个新成员(在它初始化之后),但是我找不到 API 来这样做。我不想使用多播,所以我禁用了它,代码如下:
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(或范围)。
我不确定这是否是解决此问题的正确方法,因此非常感谢您的帮助。
谢谢!
您需要定义网络配置,并且您应该知道集群将在其间通信的 IP 地址列表。
否则,您可以通过 运行 在单个 machine/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 的本地主机中启动两个实例。
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 中再次 运行 相同的配置。两者都将加入并形成一个集群。
另一种选择是编写自己的 DiscoveryStrategy:http://docs.hazelcast.org/docs/3.6/manual/html-single/index.html#discovery-spi
无论如何,在所有情况下,Hazelcast 只会在特定的时间间隔内请求新成员。没有办法 "add new members" 并且通常不需要因为新成员加入现有集群,因此新成员需要了解旧成员而不是相反。
题目说:
instance.getConfig().getNetworkConfig().getJoin().getTcpIpConfig().addMember("192.168.1.5")
不起作用。但是,根据我的经验(使用 3.7.1 版),它确实有效。不是立即,而是在大约一分钟内将新成员添加到集群中,我猜延迟是 interval
@nocatrius 提到的。
值得一提的是成员在不同的主机上,否则配置与问题中的一样。
向他人借用
关于上面提到的属性,对新成员的定期检查,在3.9版本中实际上是5分钟。我发现这个控制它:
System.setProperty("hazelcast.merge.first.run.delay.seconds", "5")
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实例名,在[=18=中设置了服务器自身的IP和接口后,后面添加节点,即加入集群,需要的是:
HazelcastInstance hazelcastInstance = Hazelcast.getHazelcastInstanceByName('hazelcast-hibernate-instance');
hazelcastInstance.getConfig().getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(true).addMember('x.x.x.x')