【问题标题】:Hazelcast: Merge two hazelcast instancesHazelcast:合并两个 hazelcast 实例
【发布时间】:2016-03-02 07:41:47
【问题描述】:

假设我们有两个 hazelcast 实例:

HazelcastInstance firstInstance = Hazelcast.newHazelcastInstance(new Config());
HazelcastInstance secondInstance = Hazelcast.newHazelcastInstance(new Config());
// Add entries to firstInstance
// Add entries to secondInstance

现在我正在尝试删除 firstInstanceadd everything from secondInstance to firstInstance 中的所有内容。

有没有办法做到这一点?

【问题讨论】:

    标签: java hazelcast


    【解决方案1】:

    首先,根据代码中显示的两个实例的初始化,它们都是属于同一集群组的集群成员,并且在默认配置下,它们都将包含所有共享数据。换句话说,您不需要“转移”信息。

    如果上述情况属实,那么当您完成从第一个实例中删除时,您将不会拥有任何数据副本(除了它们各自的来源)。

    但是,如果使用将实例绑定到不同集群组的配置来初始化实例(请记住,问题中的代码没有这样做),那么只需使用 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

    【讨论】:

    • 您好欧内斯特,感谢您的详细解释。我正在从 spring 配置初始化第一个实例,另一个使用 newHazelcastInstance()。这个想法是获取更新的数据并将其保存在 secondInstace 中,而 firstInstance 正在被其他服务使用。更新第二个实例后,我想从第一个实例中删除所有数据并从第二个实例加载它。
    • 但是我从您的评论中了解到,这两个实例都是绑定的,并且任何实例上的任何数据添加/删除操作都将镜像到另一个实例上。如果是这种情况,那么我该如何实现这种情况(假设这两个实例都来自同一个集群组)?
    • @Rahul:如果两个成员都属于同一个集群组并且已经发现彼此,那么 hazelcast 的复制(除非您已经自定义)将导致节点保存所有数据的副本,在您的代码中没有任何手动副本。如果基于弹簧的成员死亡,那么第二个节点仍将拥有数据。但是,如果您“删除”地图条目,则数据将从集群中删除(之后两个成员都不会拥有它)。关键是两个成员属于同一个集群,共享复制的数据,这种情况下不需要复制。
    • 如果您的意图是只让这些成员中的一个保留数据,那么您可以考虑在客户端模式下启动基于 spring 的节点(当然,您必须启动该成员首先从你的java代码开始)。如果没有,那么您不需要手动传输数据。您可以在此处阅读有关 hazelcast 集群的更多信息:docs.hazelcast.org/docs/3.6/manual/html-single/…
    猜你喜欢
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多