Виды RPC
tag во фрейме определяет вид RPC. Все payload — это типы openraft, сериализованные в postcard.
| tag | Название | Payload запроса | Payload ответа | Роль |
|---|---|---|---|---|
1 | Vote | VoteRequest | VoteResponse | выборы лидера — кандидат запрашивает голос у другого узла |
2 | AppendEntries | AppendEntriesRequest | AppendEntriesResponse | репликация лога + heartbeat — лидер передаёт команды репликации followers |
3 | FullSnapshot | кортеж (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 считают, что лидер умер, и начинают выборы.