Derzeit im Test: Der GitHub-Code wird nach Abschluss veröffentlicht.

Raft-Parameter

ElementWert
Herzschlag-Intervall500 ms (cluster_heartbeat_ms)
Ausfall-Erkennungszeit2000 ms (cluster_election_timeout_ms) — bleibt der Herzschlag so lange aus, gilt der Leader als ausgefallen
Tatsächliches Wahlfenster1750–2000 ms — pro Knoten zufällig gestreut, um gleichzeitige Kandidaturen (Split Vote) zu vermeiden. Der Höchstwert ist genau die konfigurierte Ausfall-Erkennungszeit
Client-Stillstand bei Leaderausfallgemessen Ausfall-Erkennungszeit + 0,3–0,5 s (mit den Standardwerten also ca. 2,3–2,5 s) — Erkennung plus eine Umleitung
Knotenzahl3 oder 5 (beim Konfigurationsladen erzwungen — alles andere verweigert den Start)
Knoten-IDseine (cluster_self) Position in der cluster_peers-Liste — deshalb muss die Listenreihenfolge auf jedem Knoten identisch sein
Bootstrap500 ms nach dem Start initialisiert sich jeder Knoten mit derselben Mitgliedschaft — wird ignoriert, wenn er einem bereits initialisierten Cluster beitritt
Log-SpeicherungIn-Memory (flüchtig) — ein neu gestarteter Knoten erholt sich per Replikation/Snapshot
Lease-Ablauf-Erkennungder Leader prüft alle 100 ms und committet Expire per Konsens
Granularität des wait-Timeoutsdas Wartezeit-Timeout (T) wird ebenfalls im selben 100-ms-Takt entschieden — es kann bis zu 100 ms verspätet eintreffen
Leader-Wechsel-Mitteilungwechselt der Leader, geht sofort ein L an alle verbundenen Clients

Herzschlag und Ausfall-Erkennungszeit wählen

Beide Werte werden in der Konfiguration über cluster_heartbeat_ms und cluster_election_timeout_ms eingestellt. Die Ausfall-Erkennungszeit (T) ist zugleich die Zeit, die der Dienst bei einem Leaderausfall stillsteht; ist sie umgekehrt zu kurz, wird ein lebender Leader fälschlich für tot gehalten und es kommt zu unnötigen Wahlen.

Herzschlag / TErkennungsfensterSchlimmste gemessene Verzögerung bei Leader-KillEmpfohlene Umgebung
100 ms / 600 ms450–600 msca. 0,9 sgleiches Rack / gleiche AZ, sehr stabile Latenz
100 ms / 1000 ms750–1000 msca. 1,2 sgleiche AZ
250 ms / 2500 ms1875–2500 msca. 2,8 sMulti-AZ
500 ms / 2000 ms1750–2000 msca. 2,4 sStandard — ausgewogen für Multi-AZ
500 ms / 5000 ms3750–5000 msca. 5,3 sregionsübergreifend, stark schwankende Latenz
  • Die Verarbeitungslatenz im Normalbetrieb ist von diesen Werten unabhängig (gemessen: kein Unterschied im p50) — sie bestimmen ausschließlich die Erholungszeit im Fehlerfall.
  • Fällt ein Follower aus, bleibt das bei jedem Wert für Clients ohne Auswirkung. Nur der Ausfall des Leaders erzeugt die obige Verzögerung.
  • Einschränkung: cluster_election_timeout_ms muss mindestens 600 ms betragen und mindestens das Vierfache des Herzschlags sein. (Gemessen wurde, dass eine einzelne Scheduling-Verzögerung unter Last zwei Herzschläge komplett verschluckt.)

Warum 3 oder 5 Knoten

Ein Commit benötigt eine Mehrheit. Eine Konfiguration mit gerader Knotenzahl erhöht nur die Kosten, ohne die Fehlertoleranz zu verbessern, daher lehnt der Server sie ab.

KnotenzahlMehrheitTolerierte gleichzeitige Ausfälle
220 — ein einzelner Ausfall stoppt den Cluster. Nicht besser als der Single-Modus
321
431 — dasselbe wie bei 3 Knoten, nur teurer
532

Zusammenfassung des Fehlerverhaltens

SituationVerhalten
Client-Anfrage an einen Nicht-Leader-KnotenM (Leader-Adresse), oder E no_leader, falls der Leader unbekannt ist
Leaderausfallneuer Leader innerhalb von 500–1000 ms gewählt. Anfragen in diesem Fenster erhalten E no_leader → der Client versucht es erneut
Während des Leaderwechselsanstehende Acquire-Anfragen werden mit M/E no_leader bereinigt, und der Client versucht es beim neuen Leader erneut
Knotenneustartbootet mit leerem Zustand → holt über die Log-Replikation/den Snapshot eines Peers auf
Mehrheit verlorenCommits werden unmöglich → Schreibvorgänge stoppen (Sicherheit zuerst), wird automatisch fortgesetzt, sobald die Mehrheit wiederhergestellt ist

Begriffe

  • Quorum — mehr als die Hälfte aller Knoten (2 von 3, oder 3 von 5). Da jede Entscheidung die Zustimmung des Quorums erfordert, können zwei partitionierte Gruppen niemals gleichzeitig widersprüchliche Entscheidungen committen.
  • Wahl-Timeout (election timeout) — wie lange ein Follower ohne Herzschlag wartet, bevor er schließt, dass der Leader gestorben ist, und eine Wahl startet. Pro Knoten randomisiert, um gleichzeitige Kandidaturen zu reduzieren.