Я использую Apache Ignite 2.4.0, с официальными примерами с небольшими изменениями с моей стороны (код ниже). Я проверил следующий сценарий:
запущено 3 экземпляра https://github.com/apache/ignite/blob/master/examples/src/main/java/org/apache/ignite/examples/ExampleNodeStartup.java (на моем локальном ноутбуке)
запустил клиент и создал кеш с 1 резервной копией
public static void main(String[] args) throws IgniteException {
Ignition.setClientMode(true);
try (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) {
CacheConfiguration cfg = new CacheConfiguration();
cfg.setName(CACHE_NAME)
.setAtomicityMode(CacheAtomicityMode.ATOMIC)
.setCacheMode(CacheMode.PARTITIONED)
.setBackups(1)
.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC)
.setReadFromBackup(true);
try (IgniteCache<Integer, String> cache = ignite.getOrCreateCache(cfg)) {
putGet(cache);
}
}
}
с клиентом, я использую метод putGet для записи и чтения:
private static void putGet(IgniteCache<Integer, String> cache) throws IgniteException {
System.out.println(">>> Cache put-get example started.");
// Store keys in cache.
for (int i = 0; i < 100; i++)
cache.put(i, Integer.toString(i));
System.out.println(">>> Stored values in cache.");
int size = 0;
for (int i = 0; i < 100; i++) {
if (cache.get(i) != null)
size++;
}
System.out.println("Cache size:" + size);
}
Когда я впервые запускаю метод putGet, конечно, вывод:
>>> Cache put-get example started.
>>> Stored values in cache.
Cache size:100
[01:35:21] Ignite node stopped OK [uptime=00:00:00.744]
Затем я останавливаю один узел и снова выполняю метод putGet (на этот раз только для чтения). Результат:
>>> Cache put-get example started.
>>> Stored values in cache.
Cache size:48
[01:38:25] Ignite node stopped OK [uptime=00:00:00.406]
Разве кластер не должен восстанавливать данные, которые находились на аварийном узле, из резервной копии на двух других узлах? Каково поведение резервной копии более точно? Нужен ли режим постоянства?