Снапшот
Узлу, слишком сильно отставшему по логу (например, сразу после перезапуска), передаётся всё текущее состояние через RPC FullSnapshot. Внутри snapshot_bytes — следующая структура, сериализованная в postcard.
| Поле | Содержимое |
|---|---|
last_applied | последняя позиция лога, отражённая в этом снапшоте |
last_membership | информация о членстве (составе узлов) |
token_seq | номер выдачи fencing-токена — реплицируется, поэтому монотонность токена сохраняется и при смене лидера |
locks | список (key, token, remain_ms) — все удерживаемые блокировки и оставшееся время lease каждой |
remain_ms— это оставшееся время lease (в миллисекундах) на момент создания снапшота. Устанавливающий узел восстанавливает момент истечения какnow + remain_msпо своим собственным часам — абсолютное время не передаётся, поэтому разница часов между узлами не влияет на результат.- Ради точности только здесь используются миллисекунды (единица для клиента — секунды).
- Лог Raft хранится в памяти (энергозависимо). Перезапущенный узел стартует с пустым состоянием и догоняет через репликацию лога от пиров или через этот снапшот; пока сохраняется большинство, зафиксированное состояние не теряется.
Поток
Leader
Отставший узел
сразу после перезапуска — старт с пустым состоянием
AppendEntries
отставание слишком велико для догона по логу
FullSnapshot — всё состояние одним кадром
установка: каждая блокировка восстанавливается как now + remain_ms
далее — снова только лог через AppendEntries
RPC консенсуса (Raft)
Термины
- Снапшот (snapshot) — цельная копия всего состояния на определённый момент. Позволяет отставшему узлу не воспроизводить накопленный лог с самого начала, а установить снапшот и далее следовать только за логом после него.
- Членство (membership) — список узлов, составляющих кластер, и информация об их ролях.