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

Hazelcast 3.6正确关闭节点

公孙黎昕
2023-03-14

我试图找出当我取下一个节点时丢失数据的原因。我有两个节点运行hazelcast 3.6应用程序的开发集群。HZ应用程序配置为有271个分区,我通过远程客户端向集群写入271个唯一密钥。我验证了数据在两个节点之间正确分布,并在另一个节点上存储和备份。

过了一段时间,我停止了对集群的写入,我只从集群中读取数据,然后我关闭了这个集群中的一个节点。在调用实例上的shutdown方法之前,我检查集群是否安全。

Hazelcast.shutdownAll();
for (int i = 0; i < 12; i++) {
    log.info("Verifying whether it is safe to close this instance");
    boolean isSafe = getResultsForAllInstances(hzi -> hzi
            .getPartitionService()
            .forceLocalMemberToBeSafe(10, TimeUnit.SECONDS));
    if (isSafe) {
        log.info("Verifying whether cluster is safe.");
        isSafe = getResultsForAllInstances(hzi -> hzi
                .getPartitionService()
                .isClusterSafe());
        if (isSafe) {
            break;
        }
    }

    Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
}

private boolean getResultsForAllInstances(Function<HazelcastInstance, Boolean> hazelcastInstanceBooleanFunction) {
    return getAllHazelcastInstances().stream()
            .map(hazelcastInstanceBooleanFunction)
            .reduce(true, (old, next) -> old && next);
}

不幸的是,另一个节点正在记录分区丢失和我丢失的数据。

这是我在google group上问过的一个问题,但是没有人回答,所以我仍然不知道这是3.6的一个普遍问题还是我在做一些愚蠢的事情。

我还发现了节点立即终止的情况下的错误报告,但在我的情况下,我尝试优雅地关闭节点,它有时间与其他节点进行通信。所以我在这里错过了什么:]

谢谢

共有2个答案

郦翰学
2023-03-14

所以看起来数据没有丢失,但是我在关闭一个节点后在客户端有很多连接丢失的错误,处理这些异常的业务逻辑是不正确的。

另一个错误的线索是我在另一个节点上得到的分区丢失事件。我仍然不明白这个机制,我希望在HZ的留档中有更多的解释。

@雷维卡:谢谢你的耐心!:]

麹浩瀚
2023-03-14

您的数据的复制级别是多少?如果希望数据在节点丢失的情况下仍能正常运行,则需要备份。例子。

<hazelcast>
  <map name="default">
    <backup-count>1</backup-count>
  </map>
</hazelcast>

默认备份是1。这意味着每个实体只存储一次,因此只存在于一个节点中。因此,如果上述节点出现故障,您将丢失其所有数据。希望这有帮助:)

 类似资料:
  • 问题内容: 我想在Java中实现SSL代理。我基本上打开了两个套接字,并运行了两个线程,这些线程将写入他们从中读取的内容,反之亦然。每个线程如下所示: 每个线程只会关闭输入套接字,因此最终两个套接字都会关闭。 但是,如果我想使用an 怎么办?似乎那里不支持这些方法。这是我得到的例外。 我想出的是: 每当套接字结束时,我都必须捕获并忽略套接字末尾异常。 我的问题是: 如果不受支持,我怎么会从那里得到

  • 我正在处理一个需要使用jFileChooser Swing窗口的项目。当单击“取消”或“打开”时,窗口不会关闭。在查看了StackOverflow上的许多文章以及JFileChooser教程和文档之后,我不知道是什么导致了这个重复的问题。 我正在与NetBeans一起使用它的swing编辑器。我也在Eclipse中尝试了该程序作为测试,并收到了相同的结果。

  • 问题内容: 我正在使用Play编写一个部署在Tomcat中的webapp。因为该应用程序不会处理大量数据,所以我在Hibernate中使用默认的H2数据库。当我想部署新版本的应用程序时,我关闭了tomcat,擦除了旧的webapp和WAR,添加了新的WAR,然后开始备份。 直到几天前,当我添加数据库组件时,它一直有效。现在,我经常无法重新部署该应用程序。当我删除旧目录时,它将使用以下结构自动重新生

  • 我错过了什么关于正确关闭生产者和消费者的事情吗?

  • 问题内容: 我有全部传播异常的方法,然后在一个地方处理,但是我意识到了一些事情。 假设我有这样的方法 我的问题是,如果doSometing()方法引发异常,该语句将不会关闭,但我不想在那里处理异常。尝试并捕获只会抛出异常并最终关闭语句的正确方法吗? 问题答案:

  • 问题内容: 在清理一些代码时,FindBugs向我介绍了一些使用Connection,CallableStatement和ResultSet对象的JDBC代码。这是该代码的一个片段: FindBugs指出这些应该在finally块内。我开始重构我的代码来做到这一点,我开始想知道如何在finally块中处理代码。 Connection对象的CallableStatement的创建可能会引发异常,而我