2016-11-18 113 views
0

我试图找出为什么当我放下一个节点时丢失了数据。我有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,它有时间回传给其他节点。那么,要我在这里失踪:]

的感谢!

回答

0

什么是数据的复制级别?如果你希望你的数据在启动和运行,尽管节点丢失,你需要备份。 示例。

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

默认备份是一个。这意味着每个实体只存储一次,因此只存在于一个节点中。所以如果前面提到的节点失败,你会丢失所有的数据。希望这有助于:)

+0

“我确认数据在两个节点之间正确分布并存储并备份到其他节点上。”所以我的数据在其他节点上备份。 – kamiseq

+0

我可能应该补充一点,我正在使用基于SPI的自己的服务。 – kamiseq

+0

无论如何,我可以看到数据正在集群中的节点之间复制 – kamiseq

0

所以好像数据不会丢失,但我只是关闭节点之一后,得到了很多的客户端连接丢失的错误 - 和业务逻辑处理这些异常是不正确的。 这是公平的,因为关机不会将任何事情传回客户端。

其他错误导致了分区丢失事件我在其它节点上了。我仍然不明白这个机制,我希望在HZ的文档中有更多的解释。

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