我有一个应用程序,它同时在的数据中心上部署了一个拉伸的Hazelcast集群。这两个数据中心通常都具有完整的功能,但有时,其中一个数据中心完全脱离网络进行SDN升级。确保使用Hazelcast在数据中心之间进行复制
我打算实现的是以这样一种方式配置集群,即DC中的每个主分区至少有2备份 - 一个在另一个集群中,另一个在当前集群中。
为此,检查文档指向分区组的方向(http://docs.hazelcast.org/docs/2.3/manual/html/ch12s03.html)。企业WAN复制看起来与我们想要的完全相同,但不幸的是,此功能不适用于免费版本的Hazelcast。
我的配置如下:
NetworkConfig network = config.getNetworkConfig();
network.setPort(hzClusterConfigs.getPort());
JoinConfig join = network.getJoin();
join.getMulticastConfig().setEnabled(hzClusterConfigs.isMulticastEnabled());
join.getTcpIpConfig()
.setMembers(hzClusterConfigs.getClusterMembers())
.setEnabled(hzClusterConfigs.isTcpIpEnabled());
config.setNetworkConfig(network);
PartitionGroupConfig partitionGroupConfig = config.getPartitionGroupConfig()
.setEnabled(true).setGroupType(PartitionGroupConfig.MemberGroupType.CUSTOM)
.addMemberGroupConfig(new MemberGroupConfig().addInterface(hzClusterConfigs.getClusterDc1Interface()))
.addMemberGroupConfig(new MemberGroupConfig().addInterface(hzClusterConfigs.getClusterDc2Interface()));
config.setPartitionGroupConfig(partitionGroupConfig);
的CONFIGS使用最初为:
clusterMembers=host1,host2,host3,host4
clusterDc1Interface=10.10.1.*
clusterDc2Interface=10.10.1.*
但是,在该集合中的任何事件的configs的更改群集的组件时触发,一个群集中随机节点开始记录“没有成员组可用于分配分区所有权”隔秒(如此处:https://github.com/hazelcast/hazelcast/issues/5666)。更重要的是,检查JMX中PartitionService公开的状态显示,尽管群集状态显然成功,但实际上没有分区被填充。
因此,我开始用相应的IP替换主机名,并且配置工作。分区已成功创建,没有节点出现。
这里的问题是,这些盒子是作为A/B部署过程的一部分创建的,并且从244个IP范围自动获取IP。添加所有这244个IP似乎有点多,即使它是由厨师编程而不是手动完成的,因为它会带来所有的网络噪音。使用基于telnet的客户端检查哪些机器正在监听hazelcast端口时检查每个部署也似乎有点问题,因为IP将从部署到另一个不同,并且我们会陷入一种情况,其中一部分节点在集群中将有一个特定的成员列表,而另一部分将同时具有不同的成员列表。
在我看来,使用主机名是最好的解决方案,因为我们将依赖于DNS解析并且不需要在配置时将我们的头围绕IP解析。
有没有人知道解决组配置问题的解决方法?或者,也许,实现相同行为的替代方案?