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)
| Befehl | Felder | Bedeutung |
|---|---|---|
Grant | key, lease_ms | Einen 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 |
Release | key | Einen Schlüssel freigeben |
Expire | key, token | Vom 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)
| Ergebnis | Bedeutung |
|---|---|
Granted { token } | Erwerb erfolgreich — das ausgestellte Fencing-Token |
GrantRejected | Ein Grant traf für einen bereits gehaltenen Schlüssel ein (defensiv — passiert im Normalablauf nie) |
Released | Freigegeben |
NotFound | Der freizugebende Schlüssel existierte nicht |
Expired { existed } | Ablauf verarbeitet — existed gibt an, ob tatsächlich entfernt wurde |
Noop | Nichts 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
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.