Litestream VFS
(fly.io)- Litestream VFS ist eine pluginartige Erweiterung, mit der sich SQLite-Datenbanken direkt aus Objektspeichern (z. B. S3) lesen und abfragen lassen
- Ermöglicht sofortige Abfragen aus Remote-Backup-Dateien sowie Point-in-Time Recovery (PITR), ohne die gesamte Datenbank herunterzuladen
- Verwendet intern das LTX-Format, um Mengen geänderter Seiten effizient zu verwalten, und verbessert die Wiederherstellungsgeschwindigkeit durch Compaction, bei der doppelte Seiten übersprungen werden
- Nutzt die VFS-Schnittstelle von SQLite, um nur Lesevorgänge abzufangen; Schreibvorgänge übernimmt der bestehende Litestream-Prozess
- Bietet durch Backups im Sekundentakt und Indexaktualisierungen eine nahezu Echtzeit-Replik, die schnelle Abfragen in Cloud-Umgebungen unterstützt
Überblick über Litestream VFS
- Litestream VFS ermöglicht es SQLite, eine Objektspeicher-URL direkt als Datenquelle zu verwenden
- Aktivierung in der SQLite-Shell mit den Befehlen
.load litestream.sound.open file:///my.db?vfs=litestream - Danach können Abfragen auf Basis der in S3 gespeicherten Backup-Dateien ausgeführt werden
- Aktivierung in der SQLite-Shell mit den Befehlen
- Direkte Abfragen aus Remote-Backups sind möglich, ohne die gesamte Datenbank herunterladen zu müssen
- Im Beispiel wird mit der Abfrage
SELECT * FROM sandwich_ratingssofort ein Teil der in S3 gespeicherten Daten eingesehen
- Im Beispiel wird mit der Abfrage
Point-in-Time Recovery (PITR)
- Mit dem Befehl
PRAGMA litestream_time = '5 minutes ago';lässt sich der Datenzustand zu einem bestimmten Zeitpunkt abfragen- Es kann eine relative Zeit (
5 minutes ago) oder eine absolute Zeit (2000-01-01T00:00:00Z) angegeben werden
- Es kann eine relative Zeit (
- Dadurch ist sofortige Point-in-Time Recovery (PITR) direkt auf SQL-Ebene möglich
- Im Beispiel wird nach einem fehlerhaften
UPDATEder Zustand von vor 5 Minuten wiederhergestellt und die korrekten Daten geprüft
- Im Beispiel wird nach einem fehlerhaften
LTX-Format und Datenkomprimierung
- Litestream v0.5 integriert das Format LTX (Litestream Transaction eXchange)
- Frühere Versionen übertrugen vollständige SQLite-Seiten, während LTX nur geordnete Mengen von Seiten überträgt
- Der Kern von LTX ist die Funktion „compaction“, bei der bei der Wiederherstellung nur die neueste Version jeder Seite ausgewählt wird
- Beispiel: Aus
1 2 3 5 3 5 4 5 5werden nur das jeweils letzte 5, 4, 3, 2 und 1 verwendet
- Beispiel: Aus
- LTX kann nicht nur die gesamte Datenbank, sondern auch Mengen von LTX-Dateien komprimieren, wodurch PITR-Wiederherstellung möglich wird
- Im Trailer der LTX-Dateien ist ein Offset-Index für jede Seite enthalten, sodass
- nur die benötigten Seiten per S3-Range-Request gelesen werden können, ohne die gesamte Datei herunterzuladen
Implementierung des VFS
- Litestream VFS wird über die VFS (Virtual File System)-Schnittstelle von SQLite implementiert
- VFS ist eine Plugin-Struktur, die die Betriebssystemzugriffsschicht von SQLite abstrahiert
- Litestream VFS verarbeitet nur Lesevorgänge (Read), während Schreibvorgänge (Write) vom bestehenden Litestream-Prozess übernommen werden
- Wenn SQLite eine Seite liest, führt das VFS statt eines Byte-Offsets eine Zuordnung auf Basis des Seitenindex durch
- Im Index werden Dateiname, tatsächlicher Offset und Seitengröße ermittelt, dann wird genau dieser Block über den Range-Header der S3-API heruntergeladen
- Ein LRU-Cache hält häufig genutzte „heiße Seiten“ im Speicher und minimiert so die Zahl der S3-Aufrufe
Echtzeit-Replikation und Performance
- Litestream führt einmal pro Sekunde ein Backup auf L0-Ebene aus
- Das VFS pollt den S3-Pfad regelmäßig und aktualisiert den Index schrittweise
- Dadurch entsteht eine nahezu Echtzeit-Replik (near-realtime replica)
- Sofort nutzbar, ohne die gesamte Datenbank streamen zu müssen
- Diese Architektur sorgt für schnellen Start und kurze Wiederherstellungszeiten
Einsatz und Bedeutung
- Litestream bewahrt alle Zustände der Datenbank mit Sekundenauflösung als Backups auf
- Bei versehentlichen
DELETE- oderUPDATE-Operationen ist eine sofortige Wiederherstellung auf den gewünschten Zeitpunkt möglich
- Bei versehentlichen
- Durch die direkte Abfrage aus dem Objektspeicher funktioniert das System auch in ephemeren Serverumgebungen schnell
- Ohne komplexe Mechanismen nutzt es die Standardfunktionen von SQLite und bietet so ein einfaches, aber leistungsstarkes Backup- und Recovery-System
- Wird auch in internen APIs von Fly.io verwendet und kann stabil in Produktionsumgebungen betrieben werden
1 Kommentare
Hacker-News-Kommentare
Jedes Mal, wenn ich merke, dass mein Code anderen hilft, freue ich mich wirklich sehr
psanford/sqlite3vfs
SQLite funktioniert wie gewohnt, und Litestream arbeitet darüber transparent
Das heißt, man kann Point-in-Time Recovery (PITR) allein mit SQL und SQLite-Pragmas umsetzen.
Man kann alte Daten schnell abfragen, ohne direkt am Produktions-Dataset herumzuspielen
Man gibt den S3-Bucket per Umgebungsvariable an und lädt in SQLite mit
.load litestream.so; danachkann man mit
PRAGMA litestream_time = '5 minutes ago';Daten aus einem früheren Zeitpunkt direkt abfragenbrew install sqlite3den Namen der Init-Funktion direkt angeben, etwa so:
.load litestream sqlite3_litestreamvfs_initMan muss nur
"LITESTREAM_REPLICA_URL"und die AWS-Key-Umgebungsvariablen setzenNach dem Laden der Erweiterung mit
temp.loadExtension("/path/to/litestream.dylib", "sqlite3_litestreamvfs_init")kann man es direkt verwenden, wenn man mit
file:my.db?vfs=litestreamöffnet.dylib-Datei gefunden hast.Mein Use Case ist, eine in S3 gespeicherte schreibgeschützte SQLite-DB direkt auf einer Website zu nutzen
Die DB wird etwa per Cron-Job aktualisiert, und die Website liest über Litestream VFS nur die neuesten Daten
Ich frage mich, ob man es auf diese Weise gut verwenden kann und ob es auch ein integriertes Python-Modul gibt
Derzeit holt meine Flask-App Daten aus Google Spreadsheet, konvertiert sie nach SQLite und aktualisiert sie täglich
Siehe meinen App-Code
Es funktioniert auch in der SQLite-CLI unverändert, ganz ohne zusätzlichen Python-Code.
Es nutzt nur S3 als externe Abhängigkeit und passt auch gut zu SQLite
Siehe ZeroFS-SQLite-Performance
ncruces/go-sqlite3 Beispielcode
Man kann es im Programmcode statt per Umgebungsvariable steuern und mehrere DBs gleichzeitig handhaben
Allerdings gilt
PRAGMA litestream_timepro Connection, daher ist bei der Nutzung eines Connection-Pools Vorsicht geboten.load litestream.sosah, musste ich sofort an ncruces/go-sqlite3 denkenIch frage mich, ob es schwierig war, das auch in einer Wasm-Umgebung zum Laufen zu bringen.
Die Erweiterung „DuckLake“ von DuckDB erstellt bei jeder Transaktion Snapshots und bietet damit „Time Travel“
Das ist ähnlich wie PITR bei Litestream VFS
Im OLTP-Bereich nennt man das Recovery-Funktion, im OLAP-Bereich „Time Travel“
DuckLake koordiniert Zugriffe mehrerer Prozesse über eine externe Katalog-DB (PostgreSQL/MySQL/SQLite)
Litestream dagegen ermöglicht gleichzeitigen Zugriff mehrerer Reader über unveränderliche LTX-Dateien in S3
Beide Welten konvergieren gerade auf eine Struktur aus „Shared Storage + Metadaten + Compaction“
Ich fände es gut, wenn es mehr Zusammenarbeit über solche Projekte hinweg gäbe
v0.5.3 Release Notes
Zum Beispiel, wenn man Vektor-Sucherweiterungen wie sqlite-vec oder vss nutzt,
ob dann Echtzeit-Backups nach S3 mit Litestream und Remote-Abfragen über Litestream VFS möglich sind
Wahrscheinlich hilft nur, es direkt auszuprobieren.