Я пытаюсь понять, почему я теряю данные, когда отключаю один узел. У меня есть кластер разработки с 2 узлами, на которых запущено приложение hazelcast 3.6. Приложение HZ настроено на 271 раздел, и я записываю 271 уникальный ключ в кластер через удаленный клиент. Я проверил, что данные правильно распределяются между двумя узлами и сохраняются и сохраняются на другом узле.
через некоторое время я перестаю писать в кластер, я только читаю из него, затем я выключаю один из узлов этого кластера. перед этим я вызываю на экземпляре метод выключения, а затем проверяю, безопасен ли кластер.
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);
}
к сожалению, другой узел регистрирует потерянный раздел, и я теряю данные.
здесь - это вопрос, который я задавал группа Google, но никто не ответил на это, поэтому я до сих пор не знаю, это общая проблема с 3.6, или я делаю что-то глупое.
Я также нашел отчеты об ошибках для сценариев. когда узлы были отключены мгновенно, но в моем случае я пытаюсь изящное завершение работы узла, и у него есть время, чтобы связаться с другим узлом. Так что мне здесь не хватает:]
Благодарность!