Получить доступ

Как в кластере выбирают лидера и что такое split brain?

SeniorРепликация
Ещё спрашивают так:
  • Как работает Raft в общих чертах?
  • Зачем кворум из нечётного числа узлов?
  • Что такое fencing token?
Коротко

Лидером может стать только узел, за которого проголосовало большинство. Два большинства всегда пересекаются, поэтому в одном «сроке» (term) не бывает двух лидеров — это защищает от split brain.

  • Raft: лидер шлёт heartbeat; нет heartbeat — узел становится кандидатом, повышает term и просит голоса
  • Запись подтверждена, когда её сохранило большинство; новый лидер обязан иметь все подтверждённые записи
  • 3 узла переживают отказ 1, 5 — отказ 2; чётное число не добавляет устойчивости

А ещё Старый лидер может «очнуться» после паузы — защита fencing-токеном (номером срока) на стороне хранилища

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Split brain — два узла одновременно считают себя лидером и принимают записи. Возникает при разделении сети или долгой паузе (GC, зависание VM): остальные решили, что лидер умер, и выбрали нового, а старый очнулся и продолжает писать. Итог — расходящиеся данные.

Большинство как защита. Если для любого решения нужно согласие более половины узлов, два решения не могут быть приняты разными группами — любые два большинства пересекаются хотя бы в одном узле. Отсюда размер кластера: из 3 узлов должны работать 2 (переживает 1 отказ), из 5 — 3 (2 отказа). 4 узла переживают тоже только 1 отказ — чётное число не помогает, а голосований больше.

Raft в общих чертах:

  • время делится на сроки (terms) с номерами; в каждом сроке не более одного лидера;
  • лидер рассылает heartbeat; узел, не получивший его за случайный таймаут, становится кандидатом, увеличивает term и просит голоса;
  • узел голосует один раз за срок и только за кандидата, чей журнал не короче своего — так лидером не станет узел без подтверждённых записей;
  • лидер добавляет записи в журнал и реплицирует; запись подтверждена, когда её сохранило большинство. Только тогда её применяют и отвечают клиенту;
  • узел, увидевший больший term, сразу становится последователем — старый лидер, вернувшись, теряет полномочия.

Где используется: etcd (и значит Kubernetes), Consul, ZooKeeper (ZAB — похожий протокол), KRaft в Kafka, CockroachDB и YugabyteDB (Raft на каждый диапазон данных), Patroni через etcd.

Fencing. Даже с консенсусом старый лидер или держатель распределённой блокировки может не знать, что его сместили (пауза GC на 30 секунд, а аренда истекла). Защита — fencing token: при каждом назначении выдаётся монотонно растущий номер (term, версия блокировки), и хранилище отклоняет запросы с номером меньше уже виденного. Без этого распределённая блокировка на Redis с TTL небезопасна для корректности.

Цена консенсуса: каждая запись — оборот до большинства (поэтому узлы в разных зонах, а не континентах), лидер — узкое место записи, при потере большинства система перестаёт принимать записи (выбор C в CAP).

Пример

5 узлов, лидер N1 в term 7. Сеть разделилась: {N1, N2} | {N3, N4, N5}.
N3 не получает heartbeat → кандидат, term 8 → голоса N4, N5 → лидер (3 из 5).
N1 продолжает считать себя лидером term 7, но запись не наберёт большинство (2 из 5) — не подтвердится.
Сеть восстановилась: N1 видит term 8 → становится последователем, неподтверждённое отбрасывает.

Что хотят услышать

  • Что такое split brain и откуда берётся.
  • Большинство и пересечение кворумов; почему нечётное число узлов.
  • Основные шаги Raft: сроки, выборы, подтверждение большинством.
  • Fencing token — для senior.

Частые ошибки

  • Считать, что двух узлов достаточно для отказоустойчивого выбора лидера.
  • Полагаться на TTL-блокировку как на гарантию единственного исполнителя.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем