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

Снапшот

Узлу, слишком сильно отставшему по логу (например, сразу после перезапуска), передаётся всё текущее состояние через 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) — список узлов, составляющих кластер, и информация об их ролях.