我的应用程序同时包含部署在 2个数据中心上的拉伸的Hazelcast群集。这两个数据中心通常都是完全正常运行的,但有时其中一个数据中心完全脱离网络进行SDN升级。
我打算实现的是以这样的方式配置群集:来自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);
最初使用的配置是:
clusterMembers=host1,host2,host3,host4
clusterDc1Interface=10.10.1.*
clusterDc2Interface=10.10.1.*
但是,在更改群集组件时触发的任何事件中都有这组配置,群集中的随机节点开始记录&#34;没有成员组可用于分配分区所有权&#34; < / strong>每隔一秒(如下:https://github.com/hazelcast/hazelcast/issues/5666)。更重要的是,检查JMX中PartitionService公开的状态后发现,尽管集群状态显然成功,但实际上并没有填充任何分区。
因此,我继续用相应的IP替换主机名,并且配置工作正常。分区已成功创建,没有节点正在执行。
这里的问题是这些框是作为A / B部署过程的一部分创建的,并且可以从244个IP的范围内自动获取它们的IP。添加所有这244个IP似乎有点多,即使它将由Chef以编程方式完成而不是手动完成,因为它会带来所有网络噪声。使用基于telnet的客户端检查每个部署哪些机器正在监听hazelcast端口似乎也有点问题,因为IP将不同于部署到另一个部署,我们会陷入一种情况,其中一部分节点在集群中将具有某个成员列表,而另一部分将同时具有不同的成员列表。
在我看来,使用主机名是最好的解决方案,因为我们会依赖DNS解析而不需要在配置时围绕IP解决方案。
有没有人知道群组配置问题的解决方法?或者,也许是实现相同行为的替代方案?
答案 0 :(得分:0)
目前无法做到这一点。备份组无法设计为自己备份的方式。作为一种解决方法,您可以设计4个组,但在这种情况下,无法保证每个数据中心都有一个备份,至少不能使用3个备份。
总之,我们不建议将Hazelcast群集分布在多个数据中心上,除非DC以与LAN网络类似的方式互连并且设置了冗余的特定情况。