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.
| Campo | Conteúdo |
|---|---|
last_applied | A última posição de log que este snapshot reflete |
last_membership | Informações de membership (composição de nós) |
token_seq | O 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 | |
locks | Uma 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 comonow + remain_msem 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.