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

标签 java cluster-computing replication hazelcast

我有一个应用程序,其中包含同时部署在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.*

但是,通过在更改集群组件时触发任何事件的这组配置,集群中的随机节点开始每隔一段时间记录“没有成员组可用于分配分区所有权”第二个(如下所示: 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 网络的方式互连并设置冗余的非常特殊的情况。

关于java - 使用 Hazelcast 确保数据中心之间的复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46170935/

相关文章:

java - 为什么我从 Log4J 1.2.17 收到警告?

java - 如何使用地址打开谷歌地图?

云中的 Java 框架

c++ - 跟踪集群组状态 C++

sql-server-2005 - 使用服务器复制和客户端复制配置 SQL Server 2005

java - 不同线程的填充旋转器

java - 集群配置中的 Hibernate 搜索?

configuration - 用于 system_auth 的复制因子

Mysql多源复制配置问题

java - 从链接获取 youtube id