Ticketing
Documentação

Snapshot

Um nó atrasado demais para alcançar via o log (por exemplo, logo após um reinício) recebe todo o estado atual via o RPC FullSnapshot. Dentro de snapshot_bytes está a seguinte estrutura, serializada com postcard.

CampoConteúdo
last_appliedA última posição de log que este snapshot reflete
last_membershipInformações de membership (composição de nós)
token_seqO contador de emissão de tokens de fencing — replicado, então a
monotonicidade do token se mantém mesmo após uma
troca de líder
locksUma lista de (key, token, remain_ms) — todo lock detido e seu lease restante
  • remain_ms é o lease restante, em milissegundos, no momento em que o snapshot foi tirado. O nó que o instala restaura o horário de expiração como now + remain_ms em seu próprio relógio — nenhum timestamp absoluto é enviado, então a diferença de relógio entre os nós não tem efeito.
  • Milissegundos são usados apenas aqui, por precisão (a unidade voltada ao cliente é segundos).
  • O log do Raft está em memória (volátil). Um nó reiniciado inicia com estado vazio e depois se atualiza via a replicação de log de um par ou este snapshot — o estado confirmado é preservado enquanto uma maioria permanecer viva.

Fluxo

Líder
Nó atrasado
logo após reiniciar — inicia com estado vazio
AppendEntries
atrasado demais para alcançar via o log
FullSnapshot — estado inteiro em um quadro
instala: restaura cada lock como now + remain_ms
volta a entradas de log AppendEntries simples
RPC de consenso (Raft)

Terminologia

  • Snapshot — uma cópia completa do estado em um ponto específico no tempo. Ele permite que um nó atrasado instale o snapshot e siga apenas as entradas de log posteriores a ele, em vez de reproduzir tudo desde o início.
  • Membership — a lista de nós que compõem o cluster e suas informações de papel.