- 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 và .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 nhanh và thờ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
Bình luận trên Hacker News
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
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
Chỉ cần chỉ định bucket S3 bằng biến môi trường, rồi trong SQLite chạy
.load litestream.sosau đódùng
PRAGMA litestream_time = '5 minutes ago';là có thể truy vấn ngay dữ liệu ở thời điểm trước đóbrew install sqlite3cần chỉ định trực tiếp tên hàm init như
.load litestream sqlite3_litestreamvfs_initChỉ cần thiết lập
"LITESTREAM_REPLICA_URL"và các biến môi trường cho khóa AWSSau khi tải extension bằng
temp.loadExtension("/path/to/litestream.dylib", "sqlite3_litestreamvfs_init")thì mở bằng
file:my.db?vfs=litestreamlà dùng được ngay.dylibnhư thế nàoTrườ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
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
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
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.load litestream.solà tôi nghĩ ngay đến ncruces/go-sqlite3Không biết việc làm cho nó chạy trong môi trường wasm có khó không
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
Ghi chú phát hành v0.5.3
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
Có lẽ chỉ còn cách tự kiểm thử thôi