Hazelcast:合并两个Hazelcast实例

6
假设我们有两个Hazelcast实例:
HazelcastInstance firstInstance = Hazelcast.newHazelcastInstance(new Config());
HazelcastInstance secondInstance = Hazelcast.newHazelcastInstance(new Config());
// Add entries to firstInstance
// Add entries to secondInstance

现在我想要删除firstInstance中的所有内容,然后将secondInstance中的所有内容添加到firstInstance中。

有没有办法实现这个目标?

1个回答

6
首先,根据您代码中显示的两个实例的初始化,它们都是属于同一群集组的集群成员,并且根据默认配置,它们都将包含所有共享数据。换句话说,您不需要“传输”信息。
如果以上是真的,那么当您从第一个实例中删除后,除了它们各自的源之外,您将没有任何数据副本。
然而,如果这些实例使用将它们绑定到不同群集组的配置进行初始化(请记住,您在问题中的代码并没有这样做),则可以使用Java Map/Collections API(Hazelcast共享数据结构类型实现)来轻松地“复制”。
secondInstance.getMap("myMap").putAll(firstInstance.getMap("myMap"));
firstInstance.getMap("myMap").clear(); //please confirm this.

分布式列表可以以类似的方式处理。另外,请注意此类“大量复制”的操作,因为会导致成员出现内存溢出错误(当然,这取决于数据的大小)。更多相关信息可以在此处阅读:http://docs.hazelcast.org/docs/3.6/manual/html-single/index.html#preventing-out-of-memory-exceptions

嗨Ernest,感谢您的详细解释。 我正在使用Spring配置初始化firstInstance,而使用newHazelcastInstance()初始化另一个实例。这样做的想法是在其他服务正在使用firstInstance时获取更新的数据并将其保存在secondInstance中。一旦secondInstance被更新,我想从firstInstance中删除所有数据并从secondInstance中加载它。 - RDM
但是我从您的评论中理解到的是,这两个实例是绑定在一起的,任何一个实例上的数据添加/删除操作都会在另一个实例上进行镜像。如果是这种情况,那么我该如何实现这种情况(假设这两个实例将来自同一群集组)? - RDM
1
@Rahul:如果两个成员都属于同一集群组并已发现彼此,则hazelcast的复制(除非您进行了自定义)将导致节点持有所有数据的副本,而无需在代码中手动复制。如果基于Spring的成员死亡,则第二个节点仍将拥有数据。但是,如果您“删除”映射条目,则数据将从集群中删除(之后两个成员都不会再拥有它)。关键点是两个成员属于同一集群并共享复制的数据,在这种情况下,您不需要复制。 - ernest_k
1
如果你的意图是只让这些成员中的一个保留数据,那么你可以考虑在客户端模式下启动基于Spring的节点(当然,你需要首先从你的Java代码启动该成员)。如果不是,则不需要手动传输数据。您可以在此处阅读有关Hazelcast群集的更多信息:http://docs.hazelcast.org/docs/3.6/manual/html-single/index.html#hazelcast-clusters - ernest_k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接