Die neue Version des verteilten Datenbanksystems rqlite 6.0 wurde vorgestellt, das SQLite als Speichermotor nutzt und die Einrichtung eines Clusters synchronisierter Speicherlösungen ermöglicht. Zu den besonderen Merkmalen von rqlite zählen die einfache Installation, Bereitstellung und Wartung eines verteilten, fehlertoleranten Speichers, der etwas ähnliches wie etcd und Consul ist, jedoch ein relationales Datenmodell anstelle eines Schlüssel-Wert-Formats verwendet. Der Code des Projekts ist in der Programmiersprache Go geschrieben und wird unter der MIT-Lizenz veröffentlicht.
Um alle Knoten in einem synchronisierten Zustand zu halten, wird der Konsensalgorithmus Raft verwendet. Rqlite nutzt die originale SQLite-Bibliothek sowie den Standard-Treiber go-sqlite3, über die eine Schicht implementiert wird, die die Anfragen der Clients verarbeitet, die Replikation auf andere Knoten durchführt und den Konsens bei der Wahl des führenden Knotens verfolgt.
Änderungen in der Datenbank können nur von dem Knoten vorgenommen werden, der als führend ausgewählt ist. Schreiberverbindungen können jedoch an andere Knoten im Cluster geleitet werden, die die Adresse des Führenden zurückgeben, um den Antrag zu wiederholen (in der nächsten Version wird versprochen, dass eine automatische Weiterleitung an den Führenden hinzugefügt wird). Der Schwerpunkt liegt auf der Ausfallsicherheit, weshalb die Datenbank nur bei Leseoperationen skaliert wird, während Schreiboperationen einen Engpass darstellen. Es ist möglich, ein rqlite-Cluster aus einem einzigen Knoten zu starten, und diese Lösung kann verwendet werden, um den Zugriff auf SQLite über HTTP zu organisieren, ohne Ausfallsicherheit zu bieten.
Die SQLite-Daten werden in jedem Knoten nicht in einer Datei, sondern im Speicher gespeichert. Auf der Ebene des Raft-Protokolls wird ein Protokoll aller SQLite-Befehle geführt, die die Datenbank verändern. Dieses Protokoll wird bei der Replikation (Replikation auf der Ebene der Anfragewiedergabe auf anderen Knoten), beim Start eines neuen Knotens oder bei der Wiederherstellung nach einem Verbindungsverlust verwendet. Zur Reduzierung der Protokollgröße erfolgt eine automatische Komprimierung, die nach einer festgelegten Anzahl von Änderungen gestartet wird und zu einer Sicherung des Snapshots auf der Festplatte führt, auf dessen Grundlage ein neues Protokoll erstellt wird (der Zustand der Datenbank im Speicher entspricht dem Snapshot plus dem angesammelten Änderungsprotokoll).
Eigenschaften von rqlite:
- Einfache Bereitstellung von Clustern, ohne dass eine separate Installation von SQLite erforderlich ist.
- Möglichkeit, schnell ein repliziertes SQL-Speicher zu erhalten.
- Bereit für den Einsatz in Produktionsprojekten (Production-grade).
- Verfügbarkeit einer HTTP(S)-API, die es ermöglicht, Daten im Batch-Modus zu aktualisieren und den führenden Knoten des Clusters zu bestimmen. Es wird außerdem eine Kommandozeilen-Schnittstelle bereitgestellt sowie die Möglichkeit, verschiedene für SQLite entwickelte Client-Bibliotheken zu verwenden.
- Verfügbarkeit eines Dienstes zur Identifizierung anderer Knoten, der es ermöglicht, Cluster dynamisch zu erstellen.
- Unterstützung der Verschlüsselung des Datenaustauschs zwischen Knoten.
- Möglichkeit zur Anpassung des Prüfungsniveaus für Aktualität und Konsistenz der Daten beim Lesen.
- Optionale Möglichkeit, Knoten im Nur-Lese-Modus zu verbinden, die nicht am Konsensprozess teilnehmen und zur Skalierung des Clusters bei Lesevorgängen verwendet werden.
- Unterstützung einer benutzerdefinierten Form von Transaktionen auf Basis der Zusammenführung von Befehlen in einer Anfrage (Transaktionen auf Basis von BEGIN, COMMIT, ROLLBACK, SAVEPOINT und RELEASE werden nicht unterstützt).
- Unterstützung für die Erstellung von Hot-Backups.
In der neuen Version wurden erhebliche architektonische Änderungen vorgenommen, um die Zuverlässigkeit des Clusters durch eine verbesserte Weiterleitung von Lese- und Schreibanfragen an die richtigen Knoten zu steigern. Die rqlite-Knoten können jetzt mehrere logische Verbindungen zwischen sich multiplexen, indem sie TCP-Verbindungen nutzen, die über das Raft-Protokoll zwischen den Knoten hergestellt werden. Sollte eine Anfrage die Befugnisse des führenden Knotens erfordern, aber an einen sekundären Knoten gesendet werden, kann der sekundäre Knoten die Adresse des Führenden ermitteln und dem Client mitteilen, ohne eine Konsensberechnung gemäß dem Raft-Protokoll durchzuführen.
Diese Änderung hat es zudem ermöglicht, einen separaten Komponenten zur Synchronisation von Metadaten abzulehnen und die separate Verarbeitung des Raft-Zustands und der Metadaten zu eliminieren. Sekundäre Knoten senden Anfragen an den Führenden Knoten nun nur bei Bedarf, wenn die Adresse des Führenden ermittelt werden muss. Im API wurde die Möglichkeit hinzugefügt, Informationen über den Zustand anderer Knoten im Cluster abzurufen. Die Kommandozeilenoberfläche enthält jetzt den Befehl „.sysdump“.
Quelle: opennet.ru
