open atlas
↑ К треку
Распределённые системы DIST · 02 · 01

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

Три роли нод Raft, монотонный счётчик term и правило кворума, делающее невозможным одновременное существование двух лидеров.

DIST Junior ◷ 10 min
Уровень
ОсновыJuniorMiddleSenior
Уже знаешь этот юнит? Пройди быструю проверку за минуту →

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

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

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

Три роли

Понимание трёх ролей — это то, что позволяет читать status page Raft или post-mortem и сразу понимать, какой инвариант устоял, а какой сломался.

Каждая 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 единственными общими часами, позволяющими всегда ответить на вопрос «кто сейчас главный?» — без какого-либо соглашения по настенным часам. Убери любую из задач — получишь либо зомби-лидера, либо необнаруживаемое расхождение лога.

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-ы. Теперь, когда встретишь в etcd «leader changed» или «no leader elected» — ты знаешь, какой из трёх инвариантов был нарушен и почему.

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 6 завершено
Связанные уроки
встречается в204

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.