SQLite Streaming Replication: Litestream và libSQL Cho Production

SQLite Streaming Replication là gì?

SQLite streaming replication là kỹ thuật sao chép dữ liệu SQLite liên tục từ source đến destination trong thời gian thực. Khác với backup định kỳ, replication đảm bảo mọi thay đổi đều được đồng bộ gần như tức thì, giúp giải quyết bài toán fault tolerance cho SQLite — database file-based vốn chỉ hỗ trợ single-node gốc.

Trong bài viết này, chúng ta sẽ tìm hiểu hai công cụ hàng đầu hiện nay: Litestream (disaster recovery) và libSQL (open-source fork từ Turso).

Server rack data center với đèn LED thể hiện hạ tầng lưu trữ database
Hạ tầng server rack cho database SQLite replication

Vấn đề của SQLite trong production

SQLite vô cùng tiện lợi cho development và các ứng dụng nhỏ. Tuy nhiên, khi triển khai production, có ba vấn đề chính:

  • Không có replication gốc — SQLite chỉ ghi vào file cục bộ, không tự sao chép sang server khác
  • Backup rủi ro — File copy trong lúc ghi sẽ gây corruption nếu không dùng VACUUM INTO hoặc sqlite3_backup
  • Khả năng phục hồi hạn chế — Nếu server chết, bạn chỉ có backup cuối cùng (RPO không tốt)

Đó là lý do Litestream ra đời — giải pháp streaming replication nhẹ nhàng cho SQLite.

Litestream: Streaming Replication cho SQLite

Litestream là công cụ disaster recovery chạy background, liên tục sao chép thay đổi SQLite sang S3, SFTP, hoặc file local. Tác giả Ben Johnson đã thiết kế Litestream để:

  • Chỉ giao tiếp qua SQLite API — Không đọc raw file, đảm bảo không gây corruption
  • Incremental replication — Chỉ sao chép WAL pages thay đổi, không backup toàn bộ mỗi lần
  • Checkpoint-safe — Dùng table nội bộ _litestream_lock để đồng bộ với WAL checkpoint

Cách Litestream hoạt động

Khi bắt đầu replicate, Litestream tạo table _litestream_lock trong database nguồn. Table này được sử dụng để:

  1. Mutex acquisition trên SQLite write lock
  2. Đồng bộ checkpoint (tránh duplicate pages)
  3. Lưu vị trí WAL offset cuối cùng đã replicate

Mọi thay đổi trong WAL file đều được Litestream bắt và push lên destination theo batch, thường với độ trễ dưới 1 giây.

Lập trình viên làm việc trên laptop với terminal chạy database
Developer làm việc với SQLite trên terminal

Cài đặt và cấu hình

# Cài đặt Litestream
curl -sL https://github.com/benbjohnson/litestream/releases/latest/download/litestream-linux-amd64.tar.gz 
  | tar xvz && sudo mv litestream /usr/local/bin/

# Cấu hình replicaton đến S3
cat > /etc/litestream.yml <<EOF
dbs:
  - path: /var/lib/app/data.sqlite3
    replicas:
      - type: s3
        bucket: my-backup-bucket
        path: litestream/db
        endpoint: https://s3.amazonaws.com
        access-key-id: $AWS_ACCESS_KEY_ID
        secret-access-key: $AWS_SECRET_ACCESS_KEY
        sync-interval: 5s
EOF

# Chạy Litestream
litestream replicate /var/lib/app/data.sqlite3

Khôi phục backup

# Khôi phục database từ S3
litestream restore -o /var/lib/app/data.sqlite3 s3://my-backup-bucket/litestream/db

# Khôi phục đến thời điểm cụ thể
litestream restore -timestamp "2026-09-01T10:00:00Z" 
  -o /var/lib/app/data.sqlite3 s3://my-backup-bucket/litestream/db

Tính năng point-in-time recovery đặc biệt hữu ích khi cần roll back dữ liệu sau sự cố.

Tại sao SQLite vẫn dùng trong production?

Dù có những giới hạn kể trên, SQLite vẫn được lựa chọn làm database chính trong nhiều hệ thống production lớn như:

  • Adobe dùng SQLite trong cú pháp tài liệu của Photoshop
  • WhatsApp lưu trữ tin nhắn trên thiết bị mobile
  • Apple nhúng SQLite trong Core Data trên iOS/macOS
  • Firefox dùng SQLite cho bookmarks, cookies, history

Lợi thế: zero configuration, zero maintenance, zero dependencies — chỉ cần một file duy nhất. Đây chính là lý do hơn 50 tỷ thiết bị trên thế giới sử dụng SQLite.

Rủi ro corruption khi backup sai

Nếu dùng cách copy thủ cản cp data.db backup.db trong lúc database đang ghi, bạn sẽ nhận được file lỗi thời hoặc bị corruption. Litestream tránh vấn đề này hoàn toàn bằng cách chỉ đọc WAL pages thông qua SQLite API — không bao giờ chạm đến raw file.

libSQL: Fork SQLite cho replication gốc

libSQL là open-source fork của SQLite do Turso phát triển, với hơn 17.000 GitHub stars. libSQL mở rộng SQLite với:

  • Embedded replicas — Database replicated cục bộ trong chính ứng dụng của bạn
  • Remote access — Truy cập database từ xa giống PostgreSQL/MySQL
  • ALTER TABLE nâng cao — Sửa đổi column type và constraints
  • WebAssembly UDF — Viết user-defined functions bằng Wasm
  • Randomized ROWID — Ngăn chặn timing attacks trên auto-increment

So sánh Litestream và libSQL

Tiêu chí Litestream libSQL
Phương pháp Streaming backup đến S3/file Embedded replicas + remote server
Lag replication 5-60 giây (tùy config) Near real-time qua libSQL server
Recovery model Disaster recovery (full restore) Continuous replication (live)
Storage backend S3, SFTP, Google Cloud, Azure Turso cloud hoặc self-hosted
Compatibility SQLite gốc (100%) SQLite-compatible nhưng có behavioral changes
Complexity Rất thấp (1 binary, 1 config) Cao hơn (server + replication protocol)

Litestream + libSQL: Sử dụng kết hợp

Một pattern phổ biến là kết hợp cả hai: dùng libSQL embedded replica cho low-latency reads local, đồng thời dùng Litestream replicate libSQL file đến S3 để disaster recovery. Setup:

# libSQL replica cục bộ
./sqld --http-listen 127.0.0.1:8080 
  --primary-db-url file:///var/lib/app/data.db 
  --replica-db-url file:///var/lib/app/data-replica.db

# Litestream backup replica
litestream replicate /var/lib/app/data-replica.db 
  s3://my-backup/litestream/libsql-db

Cách này đảm bảo có hai lớp bảo vệ: replica cho reads nhanh, S3 backup cho khi server vật lý hỏng hoàn toàn.

LiteFS: Replication cho ứng dụng phân tán

LiteFS (do Fly.io phát triển) là giải pháp FUSE-based replication cho SQLite trên infrastructure phân tán. LiteFS:

  • Tạo filesystem layer ghi lại mọi page-level change
  • Primary node nhận writes, replicate sang secondary nodes
  • Hỗ trợ multi-region với automatic failover

LiteFS phù hợp hơn Litestream khi bạn cần reads phân tán real-time thay vì chỉ backup.

Khi nào dùng gì?

  • Litestream: Đơn giản nhất, đủ cho 90% trường hợp. Ideal cho VPS, Raspberry Pi, hoặc bất kỳ đâu có SQLite + S3.
  • libSQL / Turso: Khi cần embedded replica low-latency hoặc remote access cho SQLite từ nhiều app server.
  • LiteFS: Khi cần replication across multiple nodes trên distributed infrastructure như Fly.io.

SQLite không còn là database chỉ dùng cho development. Với các công cụ streaming replication hiện đại, bạn có thể chạy SQLite production-grade với độ tin cậy cao.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

ZFS Snapshots: Sao Lưu Tức Thì Với Copy-on-Write Trên Linux

ZFS Snapshots là gì? ZFS Snapshot là tính năng chụp nhanh trạng thái hệ thống tập tin tại một thời điểm, cho phép quay lại bản sao dữ liệu cũ…

Xem thêm

DevContainers — Cách Đóng Gói Môi Trường Phát Triển Thành Container

DevContainers — Cách Đóng Gói Môi Trường Phát Triển Thành Container DevContainers (Dev Container Specification) là tiêu chuẩn mở cho phép bạn đóng gói toàn bộ môi trường phát triển…

Xem thêm

Tailwind CSS v4: Tốc độ 100x nhờ engine Rust Oxide, cấu hình không cần config

Tailwind CSS v4 đại tuợng thay đổi hoàn toàn cách chúng ta xây dựng giao diện web với CSS. Ra mắt vào tháng 1 năm 2025, phiên bản này chuyển…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất