Режим Read Repair#
Внимание
Это экспериментальный API.
Ограничения
Проверка согласованности несовместима со следующими конфигурациями кеша:
кеши без резервных копий;
near-кеши — подробнее о них написано в подразделе «Near-кеши» раздела «Настройка кешей;
кеши, которые используют режим сквозного чтения (read-through).
Режим Read Repair — метод устранения несоответствий между основными (primary) и резервными (backup) копиями данных во время обычных операций чтения. Когда пользовательская операция считывает конкретный ключ (или ключи), DataGrid проверяет его значения во всех резервных копиях.
Режим Read Repair создан для поддержания согласованности данных. В этом режиме операции чтения становятся примерно в два раза дороже (по времени и нагрузке на CPU), так как помимо основных копий данных проверяются и резервные. Обычно этот режим не рекомендуется использовать на постоянной основе, его стоит включать при необходимости.
Чтобы включить режим Read Repair, получите экземпляр кеша, который включает чтение Read Repair:
IgniteCache<Object, Object> cache =
ignite.cache("my_cache").withReadRepair(ReadRepairStrategy.CHECK_ONLY);
Object value = cache.get(42);
Стратегии#
Если обнаружились нарушения согласованности данных, по всей топологии значения заменятся на восстановленные согласно выбранной стратегии:
Стратегия |
Описание |
|---|---|
|
Выбирается последнее записанное значение (последняя запись) — Last Write Wins. Если исправить нарушения согласованности невозможно (то есть не получается найти последнее записанное значение), может сгенерироваться исключение
|
|
Выбираются значения c основного узла |
|
Выбирается любое значение, которое нашли больше раз, чем остальные. Работает для четного количества копий, которое характерно для DataGrid, вместо абсолютного большинства. Если не получается обнаружить значения, которые нашли больше раз, чем остальные, может сгенерироваться исключение Например, есть 5 копий (4 резервные копии):
При наличии 4 копий (3 резервных копий) выбирается любое значение, которе нашлось два и более раз (если остальные значения нашлись только один раз) |
|
Несогласованные записи удалятся |
|
Выполнится только проверка |
События#
Событие нарушения согласованности регистрируется для каждого нарушения (если в настройке указано, что оно записываемое). Чтобы получать уведомления о проблемах несогласованности данных, настройте слушатели событий — подробнее о них написано в разделе «Работа с событиями».
Транзакционные кеши#
Значения будут исправлены автоматически:
для транзакций с режимом параллелизма
TransactionConcurrency.OPTIMISTICили уровнем изоляцииTransactionIsolation.READ_COMMITTED;на фазе
commit()— для транзакций с режимом параллелизмаTransactionConcurrency.PESSIMISTICи уровнем изоляции, отличным отTransactionIsolation.READ_COMMITTED.
Ограничения
Использование этого прокси не гарантирует проверку всех копий в случае, если значение уже кешировано внутри транзакции.
Если не используется режим изоляции READ_COMMITTED и есть кешированное значение (например, уже прочитали значение или выполнили запись), можно получить только кешированное значение.
Атомарные кеши#
Значения будут исправлены автоматически.
Ограничения
Из-за особенностей атомарного кеша можно получить ложноположительные результаты. Например, при попытке проверить согласованность во время загрузки кешей можно получить нарушения согласованности данных.
По умолчанию реализация трижды пытается проверить заданный ключ. Количество попыток можно изменить с помощью свойства IgniteSystemProperties.IGNITE_NEAR_GET_MAX_REMAPS.