Die Entwickler von SQLite arbeiten an einem experimentellen VFS-Modul CBS (Cloud Backed SQLite), das es ermöglicht, den Inhalt einer Datenbank nicht in einer lokalen Datei, sondern in einem externen Cloud-Speicher zu speichern. Hierfür wird ein speziell für die externe Speicherung optimiertes Datenbankformat verwendet, das es ermöglicht, Daten dynamisch aus dem externen Speicher nach Bedarf zu laden, ohne die gesamte DB zuvor auf das lokale System kopieren zu müssen. Derzeit unterstützen die Cloud-Speicher Azure Blob Storage und Google Cloud Storage. Jede Anwendung, die mit herkömmlichem SQLite arbeitet, kann auf CBS migriert werden.
Das VFS-Modul kann im Hintergrund- und Aktivmodus arbeiten. Im Hintergrundmodus wird ein Hintergrundprozess ständig im System ausgeführt, der den Zugriff auf die externe DB nur im Lesemodus ermöglicht, aber einen gemeinsamen Cache unterstützt, auf den mehrere Prozesse gemeinsam zugreifen können. Im Aktivmodus sind sowohl Lese- als auch Schreibvorgänge erlaubt, jedoch wird nur der lokale Cache des aktuellen Prozesses verwendet. Zu jedem Zeitpunkt kann nur ein Client schreiben, und andere Clients sehen die geschriebenen Änderungen nicht, bis sie diese ausdrücklich aus dem Cloud-Speicher anfordern. Zur Trennung verschiedener Schreibvorgänge wird das typische SQLite-Sperrsystem auf Basis des WAL-Logs angewendet.
Entwicklern wird eine erweiterte C-API und eine Befehlszeilenschnittstelle angeboten, die Operationen wie das Erstellen und Leeren von externem Speicher, das Laden und Entladen von DB in/aust dem externen Speicher, das Erstellen von Kopien der DB im externen Speicher, das Anzeigen der Liste der DB im Cloud-Speicher und das Entfernen nicht genutzter Blöcke aus dem Cloud-Speicher ermöglichen.
Separat haben die Entwickler des Projekts libSQL (erweiterter Fork von SQLite) eine serverseitige Variante von SQLite angekündigt – sqld, die es ermöglicht, eine gemeinsam genutzte DBMS zu organisieren, auf die Clients über das PostgreSQL- oder HTTP-Protokoll zugreifen können. Beispielsweise können bestehende Client-Bibliotheken, die für DBMS PostgreSQL erstellt wurden, verwendet werden, um eine Verbindung zu sqld herzustellen, einschließlich der CLI-Schnittstelle psql. Der sqld-Server kann auch über eine API auf Basis des HTTP-Protokolls angesprochen werden, was die Integration in Webanwendungen erleichtert. Der Code von sqld ist in Rust geschrieben und wird unter der MIT-Lizenz veröffentlicht.
Zu den Anwendungsbereichen von sqld gehört die Sicherung, die Replikation auf andere Systeme und die Organisation des Zugriffs auf SQLite-Datenbanken in serverlosen Infrastrukturen, in denen kein ständiger Speicher vorhanden ist und die Verwaltung der Datenbank in einer lokalen Datei nicht möglich ist. In serverlosen Systemen kann die Datenbank, mit der sqld arbeitet, von anderen repliziert werden. Server. Um hohe Verfügbarkeit und Fehlertoleranz zu gewährleisten, wird die Integration mit mvSQLite unterstützt (eine verteilte Variante von SQLite, die über FoundationDB arbeitet). Es gibt einen aktiven Backup-Modus, der durch regelmäßige Snapshot-Speicherungen des Datenbankstatus und die Replikation von Änderungen aus dem WAL-Log in einen mit Amazon S3 kompatiblen Cloud-Speicher realisiert wird.
Für Anwendungen steht eine mit SQLite kompatible Bibliothek zur Verfügung, die über LD_PRELOAD geladen werden kann, um den Übergang von der Datenspeicherung in einer lokalen Datei zur Arbeit über sqld zu ermöglichen. Es ist möglich, Erweiterungen für SQLite zu laden. Die Client-Bibliotheken sind für TypeScript, JavaScript, Rust, Go und Python vorbereitet. Mit der an sqld gebundenen Datenbank kann gleichzeitig mit dem regulären Werkzeugen von SQLite gearbeitet werden, d.h. sqld agiert als Zusatz zur Bereitstellung des Netzwerkzugriffs auf die Datenbank, der Replikation und der Sicherung. Beispiel: # Server für die SQLite-Datenbank foo.db starten: sqld -d foo.db -p 127.0.0.1:5432 —http-listen-addr=127.0.0.1:8000 # Anfrage an die Datenbank mit PostgreSQL-Tools: psql -q postgres://127.0.0.1 # Lokale Verbindung zur Datenbank mit SQLite-Tools: sqlite3 foo.db # Anfrage über HTTP: curl -s -d "{\"statements\": [\"SELECT * from databases;\"]} " \ http://127.0.0.1:8000
Abschließend kann das von Fly.io entwickelte Projekt LiteFS erwähnt werden. LiteFS ist ein FUSE-Modul zur Organisation der Arbeit mit einer gemeinsamen SQLite-Datenbank auf mehreren Hosts. LiteFS repliziert den Status der Datenbank zwischen mehreren Systemen, indem es die Schreiboperationen in die Datei der Datenbank abfängt und diese Operationen auf andere Systeme überträgt, wobei eine Art Transaktionsmechanismus und das Speichern der Transaktionen in einer separaten Datei im LTX-Format verwendet wird. Der Code von LiteFS ist in Go geschrieben und wird unter der Apache 2.0-Lizenz veröffentlicht.
Quelle: opennet.ru
