我试图找出为什么当我放下一个节点时丢失了数据。我有2个运行hazelcast 3.6应用程序的节点的开发集群。 HZ应用程序被配置为拥有271个分区,并且我通过远程客户端编写了271个唯一的密钥来集群。我验证了数据在两个节点之间正确分布并存储并备份到其他节点上。hazelcast 3.6正确关闭节点
一段时间,我停止写入集群,我只从它读之后,然后我关闭从这个集群中的节点之一。在此之前我调用实例的关闭方法,然后检查集群是否安全。
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,它有时间回传给其他节点。那么,要我在这里失踪:]
的感谢!
“我确认数据在两个节点之间正确分布并存储并备份到其他节点上。”所以我的数据在其他节点上备份。 – kamiseq
我可能应该补充一点,我正在使用基于SPI的自己的服务。 – kamiseq
无论如何,我可以看到数据正在集群中的节点之间复制 – kamiseq