12 Punkte von GN⁺ 2025-12-13 | 1 Kommentare | Auf WhatsApp teilen
  • 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.so und .open file:///my.db?vfs=litestream
    • Danach können Abfragen auf Basis der in S3 gespeicherten Backup-Dateien ausgeführt werden
  • 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_ratings sofort ein Teil der in S3 gespeicherten Daten eingesehen

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
  • Dadurch ist sofortige Point-in-Time Recovery (PITR) direkt auf SQL-Ebene möglich
    • Im Beispiel wird nach einem fehlerhaften UPDATE der Zustand von vor 5 Minuten wiederhergestellt und die korrekten Daten geprüft

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 5 werden nur das jeweils letzte 5, 4, 3, 2 und 1 verwendet
  • 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- oder UPDATE-Operationen ist eine sofortige Wiederherstellung auf den gewünschten Zeitpunkt möglich
  • 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

 
GN⁺ 2025-12-13
Hacker-News-Kommentare
  • Oh, das nutzt das sqlite-VFS-Modul für Go, das ich gebaut habe
    Jedes Mal, wenn ich merke, dass mein Code anderen hilft, freue ich mich wirklich sehr
    psanford/sqlite3vfs
    • Hat gut funktioniert. Danke dafür.
    • Am Ende sind es genau solche Momente, die wir uns im Leben wünschen.
  • Das ist wirklich großartig. Litestream VFS verkörpert die Unix-Philosophie genau so, wie sie ist
    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
  • Das Interface-Design ist wirklich sauber
    Man gibt den S3-Bucket per Umgebungsvariable an und lädt in SQLite mit .load litestream.so; danach
    kann man mit PRAGMA litestream_time = '5 minutes ago'; Daten aus einem früheren Zeitpunkt direkt abfragen
    • Unter macOS muss man nach brew install sqlite3
      den Namen der Init-Funktion direkt angeben, etwa so: .load litestream sqlite3_litestreamvfs_init
  • Ich habe es auch mit bun:sqlite erfolgreich zum Laufen gebracht
    Man muss nur "LITESTREAM_REPLICA_URL" und die AWS-Key-Umgebungsvariablen setzen
    Nach 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
    • Ich frage mich, ob das vor allem für JavaScript-Server-Umgebungen (bun) gedacht ist.
    • Cool, dass es gut funktioniert hat. Mich würde aber interessieren, wie du den Pfad zur .dylib-Datei gefunden hast.
    • Zur Info: In diesem Beispiel funktioniert das Setzen der Umgebungsvariablen nicht mit dotenv. Man muss sie beim Start direkt setzen.
  • Wirklich eine tolle Funktion.
    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
    • Hier der Autor. Litestream VFS pollt die Backup-Daten automatisch jede Sekunde, um aktuell zu bleiben
      Es funktioniert auch in der SQLite-CLI unverändert, ganz ohne zusätzlichen Python-Code.
    • Für einen ähnlichen Einsatzzweck empfehle ich auch ZeroFS
      Es nutzt nur S3 als externe Abhängigkeit und passt auch gut zu SQLite
      Siehe ZeroFS-SQLite-Performance
  • Ich habe es auch schon im SQLite-Treiber für Go implementiert
    ncruces/go-sqlite3 Beispielcode
    Man kann es im Programmcode statt per Umgebungsvariable steuern und mehrere DBs gleichzeitig handhaben
    Allerdings gilt PRAGMA litestream_time pro Connection, daher ist bei der Nutzung eines Connection-Pools Vorsicht geboten
    • Als ich .load litestream.so sah, musste ich sofort an ncruces/go-sqlite3 denken
      Ich frage mich, ob es schwierig war, das auch in einer Wasm-Umgebung zum Laufen zu bringen.
  • Ich beschäftige mich in letzter Zeit mit DuckDB und merke die Unterschiede zu SQLite
    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
  • Als Sandwich-Liebhaber bin ich wirklich neugierig auf diese Sandwich-Bewertungsdaten.
  • Interessant ist es schon, aber ich bin etwas verwirrt, welche Software hier genau angekündigt wurde. Ist das eine neue Version von Litestream?
    • Hier der Autor. Ja, Litestream v0.5.3 wurde neu veröffentlicht, und es kam eine schreibgeschützte VFS-Option dazu
      v0.5.3 Release Notes
    • Diese Version enthält auch Verzeichnisreplikation für Multi-Tenant-DBs. Eine hervorragende Ergänzung.
  • Ich frage mich, ob das auch zusammen mit SQLite-Erweiterungen funktioniert
    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
    • Das frage ich mich auch. Vermutlich laufen die Queries lokal, und wenn die nötigen Seiten auf Page-Ebene aus S3 geholt werden, sollte es einfach funktionieren
      Wahrscheinlich hilft nur, es direkt auszuprobieren.
    • Ja, das geht (mehr gibt es dazu nicht zu sagen)