我尝试弄清楚当我关闭一个节点时为什么会丢失数据。我有两个运行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并且有时间与其他节点进行通信。所以我在这里错过了什么:]
谢谢!
答案 0 :(得分:0)
您的数据的复制级别是多少?如果您希望在丢失节点的情况下启动并运行数据,则需要备份。 实施例。
<hazelcast>
<map name="default">
<backup-count>1</backup-count>
</map>
</hazelcast>
默认备份是一个。这意味着每个实体只存储一次,因此只存在于一个节点中。因此,如果上述节点失败,您将丢失其所有数据。希望这会有所帮助:)
答案 1 :(得分:0)
所以看起来数据没有丢失,但是在关闭其中一个节点后,我在客户端遇到了很多连接丢失的错误 - 处理此类异常的业务逻辑是不正确的。 这是公平的,因为关机不会将任何内容传达回客户端。
另一个假引线是我在另一个节点上获得的分区丢失事件。我仍然不理解这种机制,我希望在HZ的文档中有更多的解释。
@Reveka感谢您的耐心等待! :