2017-09-12 79 views
0

我有一个应用程序,它同时在的数据中心上部署了一个拉伸的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解析。

有没有人知道解决组配置问题的解决方法?或者,也许,实现相同行为的替代方案?

回答

0

这是不可能的。无法为备份组设计自己的备份方式。作为一种解决方法,您可以设计4个组,但在这种情况下,不能保证每个数据中心都有一个备份,至少不需要使用3个备份。

无论如何,我们不建议将Hazelcast集群分布到多个数据中心,除非特殊情况下的DC以类似于LAN网络和冗余设置的方式进行互连。

相关问题