Ticketing
Documentación

Snapshot

A un nodo demasiado rezagado para ponerse al día vía el log (p. ej. justo tras un reinicio) se le envía todo el estado actual mediante el RPC FullSnapshot. Dentro de snapshot_bytes está la siguiente estructura, serializada con postcard.

CampoContenido
last_appliedLa última posición del log que refleja este snapshot
last_membershipInformación de membresía (composición de nodos)
token_seqEl contador de emisión del token de fencing — replicado, así que la monotonía del token se mantiene incluso tras un cambio de líder
locksUna lista de (key, token, remain_ms) — todos los bloqueos vigentes y su lease restante
  • remain_ms es el lease restante, en milisegundos, en el momento en que se tomó el snapshot. El nodo que lo instala restaura la hora de expiración como now + remain_ms según su propio reloj — nunca se envía una marca de tiempo absoluta, así que la deriva de reloj entre nodos no tiene ningún efecto.
  • Los milisegundos se usan solo aquí, por precisión (la unidad de cara al cliente son los segundos).
  • El log de Raft está en memoria (volátil). Un nodo reiniciado arranca con estado vacío y luego se pone al día mediante la replicación del log de un par o este snapshot — el estado confirmado se conserva mientras siga viva una mayoría.

Flujo

Líder
Nodo rezagado
justo tras reiniciar — arranca con estado vacío
AppendEntries
demasiado rezagado para ponerse al día vía el log
FullSnapshot — todo el estado en una trama
instala: restaura cada bloqueo como now + remain_ms
vuelve a entradas de log AppendEntries normales
RPC de consenso (Raft)

Terminología

  • Snapshot — una copia completa del estado en un momento concreto. Permite que un nodo rezagado instale el snapshot y siga solo las entradas de log posteriores, en lugar de reproducir todo desde cero.
  • Membresía (membership) — la lista de nodos que forman el clúster y su información de rol.