12 điểm bởi GN⁺ 2025-12-13 | 1 bình luận | Chia sẻ qua WhatsApp
  • Litestream VFS là một tiện ích mở rộng dạng plugin cho phép đọc và truy vấn trực tiếp cơ sở dữ liệu SQLite từ object storage (như S3)
  • Có thể truy vấn ngay từ file sao lưu từ xa và thực hiện khôi phục theo thời điểm (Point-in-Time Recovery, PITR) mà không cần tải xuống toàn bộ cơ sở dữ liệu
  • Bên trong, nó sử dụng định dạng LTX để quản lý hiệu quả tập các trang đã thay đổi, đồng thời cải thiện tốc độ khôi phục bằng compaction bỏ qua các trang trùng lặp
  • Tận dụng giao diện VFS của SQLite để chỉ chặn thao tác đọc, còn việc ghi do tiến trình Litestream hiện có đảm nhiệm
  • Cung cấp bản sao gần như thời gian thực thông qua sao lưu theo giây và cập nhật chỉ mục, hỗ trợ truy vấn nhanh trong môi trường đám mây

Tổng quan về Litestream VFS

  • Litestream VFS là tính năng cho phép SQLite dùng trực tiếp URL object storage làm nguồn dữ liệu
    • Có thể kích hoạt trong SQLite shell bằng các lệnh .load litestream.so.open file:///my.db?vfs=litestream
    • Sau đó có thể chạy truy vấn dựa trên các file sao lưu được lưu trên S3
  • Có thể truy vấn trực tiếp từ bản sao lưu từ xa mà không cần tải xuống toàn bộ cơ sở dữ liệu
    • Trong ví dụ, truy vấn SELECT * FROM sandwich_ratings được dùng để xem ngay một phần dữ liệu lưu trên S3

Tính năng khôi phục theo thời điểm (PITR)

  • Có thể xem trạng thái dữ liệu tại một thời điểm cụ thể bằng lệnh PRAGMA litestream_time = '5 minutes ago';
    • Có thể chỉ định thời gian tương đối (5 minutes ago) hoặc thời gian tuyệt đối (2000-01-01T00:00:00Z)
  • Nhờ đó có thể thực hiện khôi phục theo thời điểm (Point-in-Time Recovery) tức thì ở cấp độ SQL
    • Trong ví dụ, sau khi chạy nhầm lệnh UPDATE, hệ thống quay lại trạng thái 5 phút trước để kiểm tra dữ liệu đúng

Định dạng LTX và nén dữ liệu

  • Litestream v0.5 đã tích hợp định dạng LTX (Litestream Transaction eXchange)
    • Các phiên bản trước truyền toàn bộ các trang SQLite, còn LTX chỉ truyền tập trang có thứ tự
  • Cốt lõi của LTX là tính năng “compaction”, chọn ra chỉ các phiên bản trang mới nhất khi khôi phục
    • Ví dụ: từ 1 2 3 5 3 5 4 5 5, chỉ dùng các giá trị 5, 4, 3, 2, 1 ở vị trí ngoài cùng bên phải
  • LTX có thể nén không chỉ toàn bộ cơ sở dữ liệu mà còn giữa các tập file LTX, từ đó cho phép khôi phục PITR
  • Trailer của file LTX chứa chỉ mục offset của từng trang, vì vậy
    • có thể đọc chỉ các trang cần thiết bằng S3 Range request mà không cần tải toàn bộ file

Cách triển khai VFS

  • Litestream VFS được triển khai thông qua giao diện VFS (Virtual File System) của SQLite
    • VFS là cấu trúc plugin trừu tượng hóa lớp truy cập hệ điều hành của SQLite
  • Litestream VFS chỉ xử lý thao tác đọc (Read), còn ghi (Write) do tiến trình Litestream hiện có đảm nhiệm
  • Khi SQLite đọc một trang, VFS sẽ ánh xạ theo chỉ mục trang thay vì theo byte offset được yêu cầu
    • Từ chỉ mục, nó tìm tên file, offset thực tế và kích thước trang, rồi dùng header Range của API S3 để chỉ tải khối tương ứng
  • Triển khai LRU cache để giữ các “hot page” thường được truy cập trong bộ nhớ, giảm thiểu số lần gọi S3

Sao chép thời gian thực và hiệu năng

  • Litestream thực hiện sao lưu cấp L0 mỗi giây một lần
    • VFS định kỳ polling đường dẫn S3 để cập nhật chỉ mục theo từng bước
    • Kết quả là tạo ra bản sao gần như thời gian thực (near-realtime replica)
  • Có thể sử dụng ngay mà không cần stream toàn bộ cơ sở dữ liệu
  • Nhờ kiến trúc này, hệ thống đạt được tốc độ khởi động nhanhthời gian khôi phục ngắn

Ứng dụng và ý nghĩa

  • Litestream lưu giữ bản sao lưu của mọi trạng thái cơ sở dữ liệu với độ phân giải theo giây
    • Khi lỡ DELETE hoặc UPDATE, có thể khôi phục ngay về thời điểm mong muốn
  • Cấu trúc truy vấn trực tiếp từ object storage giúp hệ thống hoạt động nhanh ngay cả trong môi trường máy chủ ephemeral
  • Tận dụng các tính năng gốc của SQLite mà không cần cơ chế phức tạp, mang lại hệ thống sao lưu và khôi phục đơn giản nhưng mạnh mẽ
  • Đã được sử dụng trong API nội bộ của Fly.io và có thể vận hành ổn định trong môi trường production

1 bình luận

 
GN⁺ 2025-12-13
Bình luận trên Hacker News
  • Ồ, cái này đang dùng module sqlite vfs cho Go mà tôi đã làm
    Mỗi lần biết được code mình viết có ích cho người khác là tôi lại thấy rất vui
    psanford/sqlite3vfs
    • Hoạt động rất tốt. Cảm ơn bạn vì điều đó
    • Rốt cuộc thì đây chính là những khoảnh khắc mà chúng ta mong muốn trong đời
  • Cái này thực sự rất tuyệt. Litestream VFS thể hiện đúng tinh thần Unix
    SQLite hoạt động như bình thường, còn Litestream chạy một cách trong suốt ở bên trên
    Nghĩa là có thể triển khai khôi phục theo thời điểm (PITR) chỉ bằng SQL và SQLite pragma.
    Có thể nhanh chóng truy vấn dữ liệu trong quá khứ mà không cần đụng trực tiếp vào bộ dữ liệu production
  • Thiết kế giao diện rất gọn gàng
    Chỉ cần chỉ định bucket S3 bằng biến môi trường, rồi trong SQLite chạy .load litestream.so sau đó
    dùng PRAGMA litestream_time = '5 minutes ago'; là có thể truy vấn ngay dữ liệu ở thời điểm trước đó
    • Trên macOS, sau brew install sqlite3
      cần chỉ định trực tiếp tên hàm init như .load litestream sqlite3_litestreamvfs_init
  • Tôi cũng đã chạy thành công với bun:sqlite
    Chỉ cần thiết lập "LITESTREAM_REPLICA_URL"các biến môi trường cho khóa AWS
    Sau khi tải extension bằng temp.loadExtension("/path/to/litestream.dylib", "sqlite3_litestreamvfs_init")
    thì mở bằng file:my.db?vfs=litestream là dùng được ngay
    • Không biết cái này chủ yếu được dùng trong môi trường máy chủ JavaScript (bun) phải không
    • Nghe thật tuyệt khi nó chạy tốt. Nhưng tôi tò mò là bạn đã tìm đường dẫn file .dylib như thế nào
    • Xin lưu ý, trong ví dụ này phần thiết lập biến môi trường không hoạt động với dotenv. Bắt buộc phải chỉ định trực tiếp khi chạy
  • Tính năng này thực sự rất hay.
    Trường hợp sử dụng của tôi là dùng trực tiếp SQLite DB chỉ đọc được lưu trên S3 cho website
    DB được cập nhật bằng cron job hoặc tương tự, còn website thì chỉ đọc dữ liệu mới nhất thông qua Litestream VFS
    Tôi muốn biết dùng theo cách này có ổn không, và liệu có module tích hợp cho Python không
    Hiện tại ứng dụng Flask của tôi lấy dữ liệu từ Google Spreadsheet, chuyển sang SQLite rồi cập nhật hằng ngày
    Tham khảo mã ứng dụng của tôi
    • Tôi là tác giả. Litestream VFS sẽ tự động polling dữ liệu sao lưu mỗi giây để giữ trạng thái mới nhất
      Nó cũng hoạt động nguyên vẹn ngay cả trong SQLite CLI mà không cần thêm code Python nào
    • Tôi cũng gợi ý ZeroFS cho trường hợp tương tự
      Nó chỉ dùng S3 làm phụ thuộc bên ngoài và cũng rất hợp với SQLite
      Tham khảo hiệu năng SQLite của ZeroFS
  • Tôi cũng đã triển khai nó cho driver SQLite của Go
    Mã ví dụ ncruces/go-sqlite3
    Có thể điều khiển bằng code chương trình mà không cần biến môi trường, và xử lý nhiều DB cùng lúc
    Tuy nhiên, PRAGMA litestream_time được áp dụng theo từng connection, nên cần chú ý khi dùng connection pool
    • Vừa nhìn thấy .load litestream.so là tôi nghĩ ngay đến ncruces/go-sqlite3
      Không biết việc làm cho nó chạy trong môi trường wasm có khó không
  • Gần đây tôi đang học DuckDB và cảm nhận được sự khác biệt với SQLite
    Extension “DuckLake” của DuckDB tạo snapshot cho mỗi transaction và cung cấp tính năng “du hành thời gian”
    Điều này tương tự với PITR của Litestream VFS
    Trong OLTP thì người ta gọi đó là tính năng khôi phục, còn trong OLAP thì gọi là “Time Travel”
    DuckLake điều phối truy cập đa tiến trình bằng cách dùng DB catalog bên ngoài (PostgreSQL/MySQL/SQLite)
    Trong khi đó, Litestream cho phép nhiều reader truy cập đồng thời thông qua các file LTX bất biến trên S3
    Cả hai thế giới đều đang hội tụ về cấu trúc “shared storage + metadata + compaction”
    Hy vọng sẽ có thêm nhiều hợp tác chéo giữa các dự án như thế này
  • Với tư cách là người yêu sandwich, tôi thực sự tò mò về dữ liệu chấm điểm sandwich đó
  • Khá thú vị, nhưng tôi hơi bối rối không biết chính xác phần mềm nào đã được công bố. Đây là phiên bản mới của Litestream à?
    • Tôi là tác giả. Đúng vậy, Litestream v0.5.3 vừa được phát hành, và có thêm tùy chọn VFS chỉ đọc
      Ghi chú phát hành v0.5.3
    • Bản phát hành lần này còn bao gồm hỗ trợ sao chép thư mục cho DB đa tenant nữa. Một bổ sung rất tuyệt
  • Tôi muốn biết liệu nó có hoạt động cùng các extension của sqlite không
    Ví dụ khi đang dùng các extension tìm kiếm vector như sqlite-vec hoặc vss,
    thì có thể sao lưu thời gian thực lên S3 bằng Litestream và truy vấn từ xa bằng Litestream VFS hay không
    • Tôi cũng tò mò. Có lẽ truy vấn sẽ chạy cục bộ, và nếu cấu trúc là lấy từ S3 theo đơn vị page khi cần thì chắc là sẽ hoạt động
      Có lẽ chỉ còn cách tự kiểm thử thôi
    • Được (chỉ vậy thôi)