2016-11-18 30 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感謝您的耐心等待! :]