当前位置: 首页 > 知识库问答 >
问题:

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

丌官承
2023-03-14

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

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

共有1个答案

禹兴安
2023-03-14

目前这是不可能的。备份组的设计不能使其具有自身的备份。作为一种变通方法,您可能能够设计4个组,但在这种情况下,不能保证每个数据中心都有一个备份,至少在不使用3个备份的情况下是这样。

总之,一般情况下,我们不建议在多个数据中心上分布Hazelcast群集,除非DCs以类似于LAN网络的方式互连,并设置冗余。

 类似资料:
  • 我有一个带有Mongoid数据库的Rails 4应用程序,并想引入一个沙盒环境进行测试。有一些数据(两个模型),我想从生产数据库复制到沙盒。 我会用一个rake任务来完成这个任务,这个任务被cronjob调用。然而,在这个rake任务中,我不确定如何建立到数据库的两个连接,并对不同的数据库使用相同的模型。 我也在考虑在mongodb层做这件事(就像他们在这里做的那样,如何在mongodb中将一个集

  • 我对jet和hazelcast有一些问题,但出于逻辑目的,我的问题是,我有一个类,它将带来所有数据,当我们启动客户端时,我们得到一个队列和两个映射,但另一个映射尚未调用,当我启动hazelcast jet实例并在使用接收器时处理所有数据时,我放了以下内容: 但这是错误的。。。。我知道当你调用这个实例时,它就像hazelcast的getDataStructure,喷射它的内部hazelcast,我以

  • 我目前正在尝试让hazelcast管理中心在我的mac上本地运行,我收到了一个错误通知,就是这个: 运行后: 在根文件夹中。 如果需要,我可以提供更多信息,我对Hazelcast有点陌生,我正在努力让它正常工作,这样我就可以使用它与Zeebe工作流引擎结合。任何帮助都将是巨大的,任何对hazelcast的见解也是如此,因为它对我来说是一项新技术。提前感谢!

  • 我在Spring Boot应用程序中遵循基于Hazelcast的会话复制文档。 谢谢Aravind

  • 我创建了一个Spring、Hibernate、Hazelcast集成应用程序。 Spring配置文件如下所示:- Spring扩展上下文.xml 各种黑泽尔卡斯特教程要求我在黑泽尔卡斯特中复制以下代码行.xml。 但是我没有使用最终在Hazelcast包的bin文件夹中找到的Hazelcast.xml。 相反,我将Hazelcast jars复制到eclipse中的lib文件夹中。 要运行Manc

  • 每当我尝试运行hazelcast管理集群时,都会收到以下错误org.apache.catalina.core。StandardWrapperValve调用SEVERE:Servlet。路径为[/ormancenter-3.4.2]的上下文中servlet[collector]的service()引发了异常com.hazelcast.com.eclipsesource.json。ParseExcep