Ticketing
Документация

Виды RPC

tag во фрейме определяет вид RPC. Все payload — это типы openraft, сериализованные в postcard.

tagНазваниеPayload запросаPayload ответаРоль
1VoteVoteRequestVoteResponseвыборы лидера — кандидат запрашивает голос у другого узла
2AppendEntriesAppendEntriesRequestAppendEntriesResponseрепликация лога + heartbeat — лидер передаёт команды репликации followers
3FullSnapshotкортеж (Vote, SnapshotMeta, snapshot_bytes)SnapshotResponseпередача полного снапшота отставшему узлу
  • Vote — если лидер умирает, узел, у которого прервался heartbeat, становится кандидатом и запрашивает голоса; узел, набравший большинство, становится новым лидером.
  • AppendEntries — лидер передаёт команды блокировок для commit как записи лога. AppendEntries без записей и есть heartbeat — отдельного сообщения heartbeat нет.
  • FullSnapshot — передаёт полное текущее состояние узлу, который слишком сильно отстал по логу (или только что присоединился). Передаётся целиком одним кадром, без потоковой передачи.

Поток — когда лидер умирает

Узел A
Узел B
Узел C
обнаружено прекращение heartbeat лидера → переход в кандидаты
Vote · запрос голоса
Vote · запрос голоса
за
большинство голосов, включая себя → новый лидер
AppendEntries (без записей = heartbeat)
AppendEntries (без записей = heartbeat)
RPC консенсуса (Raft)

С момента прихода первого heartbeat от избранного нового лидера кластер возвращается к нормальному обслуживанию — общий разрыв обычно составляет 0,5–1 секунду. Про поток AppendEntries (репликация лога) в штатном режиме смотрите Команды репликации.

Термины

  • Репликация лога (log replication) — превращение команд, определённых лидером, в упорядоченный журнал (log), который followers записывают в точности так же. Если все узлы применяют один и тот же журнал в одном и том же порядке, они приходят к одному состоянию.
  • Heartbeat — периодический сигнал «я жив». Если он прерывается, followers считают, что лидер умер, и начинают выборы.