>_ DevTrendsnl

Taal

Home

Talen

Secties

Frontend Backend Mobiel DevOps AI / ML GameDev Blockchain Embedded Beveiliging
Go

SQLite naar S3 back-uppen onderweg zonder data te verliezen

Ben je dol op SQLite vanwege de eenvoud? Start een verse VPS, lanceer een kleine service, leg een databasebestand ernaast, en alles werkt met directe respons. Geen extra Docker-containers met PostgreSQL, geen gebruikersbeheer of toegangsrechten configuratie. Prachtig.

Problemen ontstaan wanneer de server onverwacht crasht of de provider je schijf "per ongeluk" verwijdert. Als je eenmaal per dag een back-up maakte via cron, verloor je een dag aan gebruikers en bestellingen. Als je probeerde het databasebestand te kopiëren met een simpele cp terwijl er schrijfoperaties plaatsvonden, eindigde je met een beschadigd bestand dat SQLite niet eens kan openen.

De maker van de bekende BoltDB key-value database, Ben Johnson, stond voor dit exacte dilemma en bouwde Litestream. Het is een klein Go-tool dat het SQLite back-upprobleem één keer en voor altijd oplost.

Wat Litestream Doet en Waarom Je Het Nodig Hebt

Litestream draait als achtergrondproces op dezelfde server als je applicatie. De taak is om continu wijzigingen van je lokale SQLite database naar remote storage te streamen. Dit kan een S3-compatibele cloud zijn, Yandex Object Storage, MinIO, of gewoon een map op een andere gekoppelde schijf.

Het resultaat is een kant-en-klare disaster recovery systeem. Als je VPS in vlammen opgaat, start je een nieuw exemplaar, voer je één restore commando uit, en de database herstelt zich tot op de laatste transactie voor de crash.

Het belangrijkste kenmerk van de tool is betrouwbaarheid. Het communiceert met de database strikt via de officiële SQLite C-API, niet door blindelings raw bytes van de schijf te lezen. Dit garandeert dat schrijffases niet overlappen met compressie of journal checkpoints, en de database verandert niet in een beschadigd bestand.

Hoe Replicatie Onder de Motorkap Werkt

Om te begrijpen hoe het werkt, herinneren we ons even de WAL (Write-Ahead Logging) modus van SQLite.

Standaard schrijft SQLite wijzigingen direct naar het hoofd- .db bestand. In WAL modus gaan alle nieuwe transacties eerst naar een apart journal met de -wal extensie. Periodiek worden deze wijzigingen teruggespoeld naar het hoofd bestand. Deze aanpak versnelt schrijfoperaties en blokkeert leesoperaties niet.

Litestream gebruikt dit mechanisme:

  1. Het schakelt de database naar WAL modus.
  2. Monitort op nieuwe pagina's verschijnen in het WAL bestand.
  3. Kopieert deze wijzigingen en stuurt ze in kleine segmenten naar S3.
  4. Beheert het checkpoint proces zodat SQLite de WAL niet voortijdig wist voordat de data naar de cloud is geüpload.

De vertraging bij het verzenden van data naar S3 is slechts een paar seconden. Als de server kapotgaat, verlies je hooguit data van de laatste paar seconden.

Installatie en Gebruiksvoorbeeld

Je kunt replicatie in een paar minuten opzetten. Download gewoon de binary of gebruik een kant-en-klare Docker image.

Eerst maken we het configuratiebestand litestream.yml:

dbs:
  - path: /var/lib/my-app/production.db
    replicas:
      - url: s3://my-backup-bucket/production.db

Verbindingsparameters naar S3 zoals access keys en endpoint worden meestal via standaard omgevingsvariabelen doorgegeven: AWS_ACCESS_KEY_ID en AWS_SECRET_ACCESS_KEY.

Het proces wordt gestart met een simpel commando:

litestream replicate -config /etc/litestream.yml

Vaak wordt Litestream in dezelfde Docker container gedraaid als de hoofdapplicatie, met een lichtgewicht proces orchestrator zoals entrypoint.sh of supervisord.

Als de server gecrasht is en je de database naar een nieuwe locatie moet deployen, voer je het restore commando uit voordat je de applicatie start:

litestream restore -o /var/lib/my-app/production.db s3://my-backup-bucket/production.db

Het hulpprogramma haalt de laatste base dump uit de bucket, downloadt alle ontbrekende WAL segmenten erop, assembleert een volledig databasebestand, en plaatst het op het opgegeven pad.

Beperkingen en Valstrikken

De tool ziet er heel aantrekkelijk uit, maar Litestream heeft een duidelijke scope en zijn eigen beperkingen.

Ten eerste vereist het hulpprogramma dat WAL modus is ingeschakeld. Als je applicatie of een specifieke database driver bibliotheek hier niet mee compatibel is, werkt er niets.

Ten tweede is dit een disaster recovery tool, niet voor horizontale lees-schaling. Je kunt Litestream niet gebruiken om vijf kopieën van de service op verschillende servers te draaien die allemaal tegelijk van dezelfde gerepliceerde database lezen. Voor gedistribueerde scenario's met meerdere nodes kun je beter kijken naar LiteFS van hetzelfde team of projecten zoals rqlite.

Ten derde, als je een enorme database hebt van honderden gigabytes met constante zware schrijfoperaties, kunnen S3 verkeer en API aanvraagkosten als een onaangename verrassing komen. De tool is ontworpen voor kleine tot middelgrote workloads.

Voor Wie Dit Project Nuttig Is

Litestream elimineert de noodzaak om zware databases op te zetten waar er geen echte behoefte aan is. Het is een uitstekende keuze voor:

  • Telegram bots en REST API's in Go, Python of Node.js met een enkele applicatie-instantie.
  • Projecten op frameworks zoals PocketBase of Directus die draaien op SQLite.
  • Persoonlijke self-hosted services die draaien op goedkope VPS.
  • Microservices met lokale cache of client data-isolatie.

Als je altijd al een side project naar SQLite wilde verplaatsen maar angst voor schijfverlies je tegenhield, probeer dan Litestream toe te voegen. Installatie kost een half uur, maar je slaapt gerust.

Gerelateerde projecten