Raft
Standard.Raft ist der Konsensalgorithmus Raft als reine Zustandsmaschine. Netz, Festplatte und Uhr gehören nicht zum Modul, sondern dem Aufrufer. Der Aufbau folgt der Raft-Bibliothek von etcd, geschrieben wurde es nach der Dissertation von Diego Ongaro. Quelltext der Sprache: github.com/heikozim/hilde.
- Leader-Wahl, Replikation, Änderungen der Mitgliedschaft und Snapshots.
- Die Invarianten der Raft-Spezifikation sind Verträge und werden in den Tests nach jedem Ereignis geprüft: höchstens ein Leader je Term; stimmen zwei Logs in einem Eintrag überein, dann auch in allen davor; jeder Leader hat alle festgeschriebenen Einträge; keine zwei Maschinen haben Unterschiedliches angewendet.
- Deterministische Tests mit Netzpartitionen: Weil die Zustandsmaschine nichts außerhalb besitzt, läuft jeder Test bei jedem Lauf gleich ab.
- Standard.RaftTcp überträgt die Nachrichten über TCP, jede mit vorangestellter Länge.
- Standard.SqliteReplica repliziert eine SQLite-Datenbank über Raft, nach dem Vorbild von rqlite: nur gebundene Parameter, und Funktionen mit nicht vorhersagbarem Ergebnis werden abgelehnt. Ausführlich unter Datenbanken.