Защита от Split Brain#
Введение#
Поддержка распределенных систем (кластеров) и баз данных в согласованном состоянии требует решения ряда фундаментальных проблем. Одной из этих проблем является Split Brain — сетевая сегментация, которая приводит к разделению кластера на изолированные группы узлов. DataGrid является распределенной базой данных, поэтому из-за временных проблем с сетью кластер может разделиться. При этом некоторые узлы или их группы будут изолированы от базовой топологии.
По умолчанию каждая изолированная группа узлов считает себя единственной и не знает о существовании других групп. Если своевременно не устранить Split Brain, он приведет к несогласованности данных.
Чтобы уменьшить возможный ущерб, в DataGrid есть Topology Validator API (интерфейс Java). Он позволяет контролировать, что топология кластера корректна для выполнения операций с кешами. Topology Validator вызывается каждый раз, когда узел подключается к кластеру или покидает его.
Для проверки любых комбинаций параметров узлов в кластере используется метод TopologyValidator#validate(Collection <ClusterNode>). Например, можно проверить количество узлов в кластере и остановить все транзакции, если несколько узлов вышли из топологии. Таким же образом можно предотвратить появление независимых групп, которые обновляются изолированно от других.
Внимание
DataGrid предоставляет только интерфейс Topology Validator. Реализацию нужно написать самостоятельно.
Предотвращение Split Brain#
Валидация данных#
Реализация метода validate(Collection <имя узла>) может обеспечить проверку топологии и запретить потенциально опасные операции, чтобы предотвратить возникновение Split Brain:
Если метод возвращает значение
true, топология считается корректной. Можно продолжать операции.Если метод возвращает значение
false, вводится запрет на операции обновления и генерируются исключения:CacheExceptionдля всех предпринятых операций обновления (put,removeи так далее);IgniteExceptionдля всех попыток сделать commit транзакции.
Если Topology Validator не настроен, любая топология кластера считается корректной. Если некорректная топология становится корректной, например узел переподключается к кластеру или его метрики нормализуются, все операции разрешается возобновить.
Пример конфигурации Topology Validator#
Пример конфигурации Topology Validator, которая позволяет обновлять кеш для группы, где доступны только большинство узлов базовой топологии:
/** */
private static class MajorityTopologyValidator implements TopologyValidator {
/** */
@CacheNameResource
private transient String cacheName;
/** */
@IgniteInstanceResource
private transient Ignite ignite;
/** */
@LoggerResource
private transient IgniteLogger log;
/** {@inheritDoc} */
@Override public boolean validate(Collection<ClusterNode> nodes) {
boolean valid = nodes.stream().filter(n -> !n.isClient()).count() >= ignite.cluster().currentBaselineTopology().size() / 2 + 1;
if (!valid)
log.warning("Possible split-brain for the cache " + cacheName + " has been detected, moving the cache to invalid state");
return valid;
}
}
Также можно настроить Topology Validator таким образом, чтобы он использовал внешний сервис, например ZooKeeper, для проверки топологии и принятия решения об отделении и деактивации группы узлов.
Чтобы восстановить корректную топологию кластера, после устранения Split Brain перезапустите неактивные группы узлов.