hazelcast 3.6正确关闭节点

时间:2016-11-18 10:28:41

标签: hazelcast

我尝试弄清楚当我关闭一个节点时为什么会丢失数据。我有两个运行hazelcast 3.6应用程序的节点的开发集群。 HZ app配置为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);
}

遗憾的是,其他节点正在记录分区丢失,我丢失了数据。

here是我在谷歌小组上提出的一个问题,但没有人回复此问题,所以我仍然不知道这是3.6的一般问题,还是我做了一些愚蠢的事情。

我还发现bug报告有关节点立即终止的情况,但在我的情况下,我尝试shutdown node gracefully并且有时间与其他节点进行通信。所以我在这里错过了什么:]

谢谢!

2 个答案:

答案 0 :(得分:0)

您的数据的复制级别是多少?如果您希望在丢失节点的情况下启动并运行数据,则需要备份。 实施例。

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

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

答案 1 :(得分:0)

所以看起来数据没有丢失,但是在关闭其中一个节点后,我在客户端遇到了很多连接丢失的错误 - 处理此类异常的业务逻辑是不正确的。 这是公平的,因为关机不会将任何内容传达回客户端。

另一个假引线是我在另一个节点上获得的分区丢失事件。我仍然不理解这种机制,我希望在HZ的文档中有更多的解释。

@Reveka感谢您的耐心等待! :