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

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

Raft в реальном мире: partition, медленный диск и клиентская маршрутизация

Суть Что Raft гарантирует при partition (CP, а не AP), как клиентские записи достигают лидера, и три production-failure — медленный диск, network jitter и дрейф часов — причины большинства реальных инцидентов.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 12 min

Network partition разделяет твой 5-нодовый etcd-кластер: 3 ноды в DC A, 2 ноды в DC B. Клиенты начинают получать write-ошибки с одной стороны. Это баг? Или именно так Raft и должен работать?

Поведение при partition: minority останавливается

Когда partition изолирует minority нод (меньше большинства), они не могут коммитить или выбирать лидера. Они циклически проводят неудачные выборы, возвращая ошибки любому подключившемуся клиенту. Majority-сторона продолжает нормально.

Это CP-поведение в смысле CAP: Raft выбирает консистентность над доступностью. Minority-сторона отказывает от сервиса, не рискуя двумя одновременными лидерами с конфликтующими коммитами.

СторонаНодыМогут выбирать?Могут коммитить?Клиент видит
Majority (DC A)3 из 5ДаДаНормально
Minority (DC B)2 из 5НетНетОшибки / таймауты

После восстановления partition: stale-ноды minority видят больший term в первом сообщении от majority-стороны, переходят в follower, обновляют term и догоняют лог через AppendEntries. Никаких потерь данных, никакого раздвоения состояния.

Trace partition: лидер в minority

Более тонкий сценарий: сам лидер оказывается на minority-стороне.

Проследи
1/5

Проследи partition, где текущий лидер изолирован на minority-стороне.

1
Step 1 of 5
5-нодовый кластер A, B, C, D, E. A — лидер term 4. Partition: A и B изолированы от C, D, E.
2
Locked
На стороне C, D, E что происходит?
3
Locked
Состояние во время partition: существуют два 'лидера'?
4
Locked
Partition восстанавливается. Heartbeat A достигает C.
5
Locked
Что испытали клиенты?

Клиентская маршрутизация

Только лидер может коммитить записи. Стратегии маршрутизации клиентов:

  1. Redirect: любой follower, получивший запись, отвечает адресом текущего лидера. Клиент ретраит к тому адресу. Типичный паттерн в etcd, Consul, TiKV.
  2. Leader cache: клиенты кешируют последнего известного лидера и идут к нему напрямую; при неудаче откатываются к любой ноде.
  3. Proxy: балансировщик нагрузки отслеживает лидера через health API кластера.

Задержка redirect обычно 1–5 мс на редком промахе. В steady state записи идут напрямую к лидеру.

Консистентность чтения: линеаризуемые чтения должны идти через лидера (ReadIndex или lease — разбираются в следующем уроке). Eventually-consistent чтения могут идти к любому follower-у. Application-слой выбирает per query.

Три production-failure

1. Медленный fsync диска. Каждое закоммиченное entry требует как минимум одного fsync на лидере и одного на каждом подтверждающем follower-е. На NVMe с battery-backed cache fsync занимает 50–100 мкс. На cloud-объёмах (EBS gp3, GCP balanced PD) — 1–3 мс. Если fsync лидера начинает превышать heartbeat-интервал, follower-ы таймаутят до того, как лидер подтвердит их AppendEntries, и стартуют выборы. Новый лидер попадает на ту же disk-проблему — цикл повторяется. Фикс: dedicated NVMe для Raft WAL, никогда shared cloud-объёмы.

2. Network jitter. Краткий congestion или потеря пакетов обрывают heartbeat-ы и триггерят выборы, хотя кластер в основном здоров. Кластер испытывает 150–300 мс недоступности без длительных последствий. Pre-vote (разбирается в следующем уроке) митигирует это, требуя dry-run перед увеличением term.

3. Дрейф часов при lease read. Если часы лидера убегают вперёд follower-ов, он может растянуть своё lease-окно за фактический heartbeat round и обслуживать чтения, которые уже потеряли lease — stale-данные возвращаются как актуальные. NTP-синхронизация всех нод — требование корректности для lease read, а не просто гигиена.

Викторина

Fsync диска лидера Raft начинает занимать 2 секунды (вместо нормальных 50 мкс). Каков наблюдаемый симптом и почему?

Викторина

Raft описывается как CP, а не AP. Что это означает на практике при network partition?

Вспомните перед уходом
  1. 01
    5-нодовый Raft-кластер имеет 2 ноды в DC A и 3 в DC B. Межdc-связь падает на 5 минут. Что испытывают клиенты, подключённые к DC A?
  2. 02
    Почему 'медленный диск' у лидера хуже, чем у follower-а?
  3. 03
    Каков правильный фикс для Raft-кластера, испытывающего выборы каждые 30–60 секунд?
Итог

Raft — это CP: при partition minority-сторона отказывает в коммитах, не рискуя split brain. Majority-сторона продолжает нормально; после восстановления stale-ноды догоняют лог через проверку целостности AppendEntries. Клиенты маршрутизируют записи к лидеру через redirect или кешированный адрес лидера. Три наиболее частых production-сбоя: медленный fsync диска лидера (триггерит выборы, блокируя heartbeat), network jitter (обрывает heartbeat без причины) и дрейф часов (ломает корректность lease read). У каждого есть известный фикс: dedicated NVMe, pre-vote и NTP-синхронизация соответственно.

Связанные уроки
встречается в185
Продолжить восхождение ↑Расширения Raft: pre-vote, learner, snapshot и линеаризуемые чтения
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.