使用 Hazelcast 确保数据中心之间的复制

Ensure replication between data centres with Hazelcast

我有一个包含 stretched Hazelcast 集群 的应用程序同时部署在 2 个数据中心 上。这 2 个数据中心通常都功能齐全,但有时,其中一个会完全脱离网络进行 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.*

然而,在更改集群组件时触发任何事件的这组配置中,集群中的随机节点开始每隔一秒记录一次 "No member group is available to assign partition ownership" (如此处:https://github.com/hazelcast/hazelcast/issues/5666)。更重要的是,检查 JMX 中 PartitionService 公开的状态表明,尽管集群状态显然是成功的,但实际上没有分区被填充。

因此,我继续用相应的 IP 替换主机名并且配置有效。分区创建成功,没有节点出现问题。

这里的问题是这些盒子是作为 A/B 部署过程的一部分创建的,并从 244 个 IP 范围内自动获取它们的 IP。添加所有这 244 个 IP 似乎有点多,即使它是由 Chef 以编程方式而不是手动完成的,因为它会带来所有网络噪音。使用基于 telnet 的客户端检查每个部署中哪些机器正在侦听 hazelcast 端口似乎也有点问题,因为 IP 将与另一个部署不同,我们会让自己陷入部分节点的情况集群中的成员会有一定的成员列表,而另一部分会同时有不同的成员列表。

在我看来,使用主机名是最好的解决方案,因为我们将依赖 DNS 解析,并且不需要在配置时全神贯注于 IP 解析。

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

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

总的来说,我们不建议将 Hazelcast 集群分布在多个数据中心上,除非非常特殊的情况,即 DC 以类似于 LAN 网络的方式互连并且设置了冗余。