Erwirbt ein Client einen Schlüssel (A), antwortet der Server mit einem von drei möglichen Ergebnissen.
| Schlüsselzustand | Serveraktion | Antwort |
|---|---|---|
| Nicht registriert | Sofortige Registrierung (Ablauf = now + lease), Token wird ausgestellt | A + token + key |
| Registriert + Ablauf überschritten | Erneuerung (now + lease), neues Token wird ausgestellt | A + token + key |
| Registriert + gültig (belegt) | Eintrag in die Warteschlange, Antwort wird zurückgehalten | bei Freigabe/Ablauf A, bei Überschreiten von wait T |
R), wird der Lock direkt an den vordersten Wartenden übergeben — ohne erneuten Wettlauf, sofort mit neuem Token.lease ist ein Sicherheitsnetz. Stirbt der Client oder vergisst er die Freigabe, kann der Server nach Ablauf der lease-Zeit den Schlüssel automatisch zurückholen und an den nächsten Wartenden weitergeben. Unabhängig vom normalen Freigabe-Ablauf sollte lease daher immer großzügig, aber so bemessen sein, dass ein toter Client die Ressource nicht zu lange blockiert.wait ist die Obergrenze für die Wartezeit beim Erwerb. Bei 0 wird unbegrenzt gewartet, andernfalls gibt der Server auf und antwortet mit T (Timeout), wenn innerhalb dieser Zeit (Sekunden) kein Erwerb zustande kam — ohne Grant, sodass kein Lock verloren geht.Das im A-Antwort enthaltene token ist ein für diesen Grant monoton steigendes u64. Bei jedem Erwerb wird ein Wert ausgestellt, der größer ist als jedes vorherige Token. Auch bei einem Failover setzt der neu aktive Knoten bei einem Wert fort, der größer ist als das größte replizierte Token (Übernahme) — dadurch steigt das Token über den gesamten Cluster hinweg kontinuierlich.
Prüft die zu schützende Ressource (Konto, Datei, Bestellung usw.) lediglich, ob "das gerade gehaltene Token größer ist als das zuletzt gesehene", kann ein nach Ablauf der lease verspätet aufgewachter Client mit einem bereits ungültigen, niedrigeren Token abgewiesen werden. Dadurch bleibt die Sicherheit gewahrt, auch wenn der Lock-Server selbst nicht in jedem Moment perfekt konsistent ist.
Die offiziellen Clients verhalten sich einheitlich wie folgt (sprachspezifische API-Details siehe Bibliotheken).
lease zurück, aber so wird er schneller an den nächsten Wartenden weitergegeben).peers-Liste bestimmt die Beförderungspriorität (das erste Element hat höchste Priorität). Unter den lebenden Knoten wird derjenige mit der höchsten Priorität zum Aktiven, die übrigen werden zu Standbys, die dessen Zustand in Echtzeit repliziert bekommen.M zur Adresse des Aktiven verwiesen und wechseln dorthin.Ctrl+C) übergibt der Aktive die Beförderung zuerst an seinen Nachfolger (Handoff) und leitet die Clients dann um, sodass die Lücke ohne Aktiven minimal bleibt.Diese Beförderungsmethode basiert nicht auf einem Quorum (Mehrheitsvotum). Deshalb spielt es keine Rolle, ob die Anzahl der Server gerade oder ungerade ist, und solange mindestens ein Knoten lebt, bleibt der Dienst erhalten.
| Anzahl Server | Ausfallfrei | Gleichzeitige Ausfälle toleriert | Anmerkung |
|---|---|---|---|
| 1 | ✗ | — | Am schnellsten. Bei Neustart kurze Unterbrechung |
| 2 | ✓ | 1 | Minimalkonfiguration für Ausfallfreiheit. In den meisten Fällen ausreichend |
| 3 | ✓ | 2 | Redundanz bleibt auch während Wartung eines Knotens erhalten |
| 4+ | ✓ | N−1 | Nur höhere Verbreitungskosten — nicht empfohlen |
Da die prioritätsbasierte Beförderung kein Konsensverfahren ist, können im Moment einer Netzwerkpartition beide Seiten kurzzeitig gleichzeitig aktiv sein, und aufgrund der asynchronen Replikation können im Moment eines Failovers einzelne Grants verloren gehen. Das heißt: während Failover/Partition ist der gegenseitige Ausschluss nicht zu 100 % garantiert. Wird eine starke Garantie benötigt, sollte die zu schützende Ressource das zuvor beschriebene Fencing-Token prüfen — werden ältere (kleinere) Token abgelehnt, bleibt die Sicherheit auch dann gewahrt, wenn der Lock-Server nicht perfekt konsistent ist.