Ticketing
Dokumentation

Replizierte Befehle

Jede Zustandsänderung einer Sperre wird als einer der folgenden Befehle repliziert, als Log-Eintrag in AppendEntries getragen und von jedem Knoten nach einem Mehrheits-Commit in derselben Reihenfolge angewendet.

Befehle (vom Leader vorgeschlagen)

BefehlFelderBedeutung
Grantkey, lease_msEinen Schlüssel erwerben. Das Token ist nicht im Befehl enthalten — die Zustandsmaschine jedes Knotens vergibt es zum Anwendungszeitpunkt deterministisch, sodass jeder Knoten dasselbe Token berechnet
ReleasekeyEinen Schlüssel freigeben
Expirekey, tokenVom Leader gesteuerter Lease-Ablauf. Wird nur entfernt, wenn token übereinstimmt — ein verspäteter oder doppelter Ablauf kann eine Sperre nicht löschen, die zwischenzeitlich frisch vergeben wurde (idempotent)

Angewendete Ergebnisse (Zustandsmaschine → Leader)

ErgebnisBedeutung
Granted { token }Erwerb erfolgreich — das ausgestellte Fencing-Token
GrantRejectedEin Grant traf für einen bereits gehaltenen Schlüssel ein (defensiv — passiert im Normalablauf nie)
ReleasedFreigegeben
NotFoundDer freizugebende Schlüssel existierte nicht
Expired { existed }Ablauf verarbeitet — existed gibt an, ob tatsächlich entfernt wurde
NoopNichts geschah

Jeder Knoten verfolgt die verbleibende Zeit einer Lease mit seiner eigenen lokalen Uhr, aber die tatsächliche Entfernung geschieht immer nur über einen committeten Expire-Befehl — deshalb kann Uhrendrift zwischen Knoten den Sperrenzustand niemals auseinanderreißen. Trennt sich ein Client, bevor er seine Antwort erhält, schlägt der Leader direkt nach der Vergabe selbst ein Release vor, um die Geistersperre sofort zu bereinigen.

Ablauf — Replikation eines Expire

Leader
Follower 1
Follower 2
erkennt Lease-Ablauf per lokaler Uhr
AppendEntries · Expire (key, token)
AppendEntries · Expire (key, token)
OK
Mehrheits-Commit → jeder Knoten wendet in derselben Reihenfolge an
Token-Unstimmigkeit → ignoriert — schützt eine frisch vergebene Sperre
Konsens-RPC (Raft)

Selbst der Ablauf ist nur ein weiterer Befehl, der den Vorschlag → Mehrheits-Commit des Leaders durchläuft. Dank der token-Prüfung kann ein verspätet angewendetes Expire die neue Sperre nicht löschen, selbst wenn derselbe Schlüssel neu vergeben wurde, während ein Commit verzögert war.

Begriffe

  • Zustandsmaschine (state machine) — der Teil, der committete Befehle der Reihe nach anwendet, um den aktuellen Zustand (hier die Sperrtabelle) zu erzeugen. Da jeder Knoten dieselben Befehle in derselben Reihenfolge anwendet, konvergieren sie immer zum selben Zustand.
  • Commit — der "endgültige" Status, den ein Zustand erreicht, sobald eine Mehrheit der Knoten ihn verzeichnet hat. Nur committete Befehle werden auf die Zustandsmaschine angewendet.
  • Idempotent — eine Eigenschaft, bei der das versehentliche zweimalige Anwenden desselben Befehls das Ergebnis nicht verändert.