awesome-everything EN
↑ Обратно к восхождению

Распределённые системы

Роли Raft, term и почему majority-кворум предотвращает split brain

Суть Три роли нод Raft, монотонный счётчик term и правило кворума, делающее невозможным одновременное существование двух лидеров.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на junior-высоте — поверхность
◷ 10 min

Твой Kubernetes-кластер подкреплён 5-нодовым etcd. Одна нода теряет питание посреди рабочего дня. Ты запускаешь kubectl get pods — и он работает без ошибок и задержек. Как консенсус сохраняется с упавшей нодой?

Задача: одна машина из многих

Сложнейшая проблема распределённых систем — это согласие. Если пять нод независимо принимают записи, у тебя получится пять противоречивых историй. Задача Raft — заставить эти пять нод вести себя как одна: одинаковый порядок изменений, одинаковое состояние, никаких потерянных записей. Для этого в каждый момент времени выбирается ровно один лидер, и все изменения направляются через него.

Три роли

Каждая Raft-нода находится ровно в одном из трёх состояний:

  • Follower — состояние по умолчанию. Принимает и хранит log entry от лидера. Клиентские записи напрямую не принимает.
  • Candidate — follower, переставший слышать лидера и теперь баллотирующийся на лидерство. Временное состояние до разрешения выборов.
  • Leader — нода, которой клиенты отправляют записи. Управляет репликацией на всех follower-ах. В здоровом кластере существует максимум один лидер на term.

Нода стартует как follower. Становится candidate, когда срабатывает election timeout. Становится лидером, если выигрывает голосование большинства.

Term: монотонные логические часы

Raft отслеживает время не настенными часами, а term-ами — монотонно возрастающими целыми числами. Каждый term начинается с выборов. Если лидер побеждает, он ведёт весь term. Если лидер не определился (split vote), term заканчивается и начинается новый.

Term выполняет две задачи:

  1. Дедупликация. При получении сообщения ноды сравнивают term отправителя со своим. Больший term всегда побеждает — получатель обновляет свой term и понижается до follower при необходимости. Это мгновенно разрешает путаницу со stale-лидерами.
  2. Упорядочение. Каждый log entry тегируется term-ом, в котором он был записан. Этот тег используется позже для обнаружения расхождений лога.
TermЧто произошло
1Нода A выбрана лидером. Вела 30 с.
2A кратко потеряла сеть. B выиграла выборы.
3B упала. C выиграла выборы.
4C всё ещё лидер — новые выборы не нужны.

Term-ы никогда не повторяются. Если ты видишь term 7, каждое сообщение из term 6 — stale.

Majority-кворум: барьер против split brain

Raft требует большинства (больше половины кластера) для двух операций: выборов и коммитов. В 5-нодовом кластере большинство — 3.

Почему именно большинство? Ключевое свойство — пересечение: любые два большинства одного множества имеют хотя бы один общий элемент. В 5-нодовом кластере, если одна тройка коммитит entry, а другая тройка выбирает нового лидера, эти два множества не могут не пересекаться — у них есть общая нода. Через эту общую ноду новый лидер гарантированно видел закоммиченное entry.

Если бы Raft использовал простое plurality (2 из 5) вместо большинства, две отдельные группы по 2 могли бы каждая считать себя авторитетной — split brain. Большинство это предотвращает.

Tolerance отказов: кластер из N нод переносит floor((N-1)/2) одновременных отказов. 5 нод → 2 отказа. 3 ноды → 1 отказ. Поэтому Raft-кластеры по 3, 5 или 7 нод — нечётные числа максимизируют tolerance для данного размера.

Викторина

5-нодовый Raft-кластер разделён: DC A имеет лидера и 2 follower-а (3 ноды), DC B — 2 follower-а. Связь между DC обрывается. Что происходит?

Викторина

Почему Raft требует большинство (3 из 5), а не просто 2 из 5, для выборов и коммитов?

Расставь шаги по порядку

Поставь шаги выбора лидера в правильном порядке:

  1. 1 Follower-ы перестают получать heartbeat дольше election timeout
  2. 2 Follower переходит в candidate, увеличивает свой term и голосует за себя
  3. 3 Candidate шлёт RequestVote RPC всем остальным нодам
  4. 4 Каждая нода отдаёт голос максимум один раз за term, первому подходящему candidate
  5. 5 Candidate собирает большинство голосов и становится лидером нового term
  6. 6 Новый лидер начинает слать heartbeat-ы, утверждая свою власть
Закончи аналогию

Заполни пропуск: Raft использует совет из N членов, где только один в каждый момент держит _______ и предлагает новые законы.

Вспомните перед уходом
  1. 01
    Почему 5-нодовый Raft-кластер переживает 2 одновременных отказа, но не 3?
  2. 02
    Что такое term в Raft и почему он заменяет настенные часы?
  3. 03
    Нода была offline 10 минут. Возвращается с term 4, кластер на term 9. Что происходит при её первом сообщении?
Итог

Raft назначает каждой ноде одну из трёх ролей — follower, candidate или leader — и ровно один лидер существует на term. Term — монотонные логические часы, разрешающие путаницу со stale-лидерами: больший term всегда побеждает. И выборы, и коммиты требуют majority-кворума, который гарантирует: любые два кворума имеют общую ноду, делая невозможным одновременный коммит двух лидеров конкурирующих записей. 5-нодовый кластер переносит 2 одновременных отказа; 3 отказа оставляют 2 выживших ниже порога большинства и останавливают прогресс до восстановления. Следующий урок о том, как лидер реплицирует записи на follower-ы.

Связанные уроки
встречается в178
Продолжить восхождение ↑Как Raft реплицирует log entry и решает, что его безопасно коммитить
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.