Litestream VFS
(fly.io)- Litestream VFS adalah ekstensi berbentuk plugin yang memungkinkan SQLite membaca dan menjalankan kueri langsung dari object storage (seperti S3)
- Memungkinkan kueri instan dari file cadangan jarak jauh dan pemulihan titik waktu (Point-in-Time Recovery, PITR) tanpa perlu mengunduh seluruh database
- Secara internal menggunakan format LTX untuk mengelola kumpulan halaman yang berubah secara efisien, serta meningkatkan kecepatan pemulihan dengan compaction yang melewati halaman duplikat
- Memanfaatkan antarmuka VFS milik SQLite untuk hanya mencegat operasi baca, sementara penulisan tetap ditangani oleh proses Litestream yang sudah ada
- Menyediakan replika yang nyaris real-time melalui backup per detik dan pembaruan indeks, sehingga mendukung eksekusi kueri cepat di lingkungan cloud
Gambaran Umum Litestream VFS
- Litestream VFS adalah fitur yang memungkinkan SQLite menggunakan URL object storage langsung sebagai sumber data
- Dapat diaktifkan di shell SQLite dengan perintah
.load litestream.sodan.open file:///my.db?vfs=litestream - Setelah itu, kueri dapat dijalankan berdasarkan file cadangan yang disimpan di S3
- Dapat diaktifkan di shell SQLite dengan perintah
- Memungkinkan menjalankan kueri langsung dari backup jarak jauh tanpa mengunduh seluruh database
- Dalam contoh, kueri
SELECT * FROM sandwich_ratingslangsung mengambil sebagian data yang tersimpan di S3
- Dalam contoh, kueri
Fitur Point-in-Time Recovery (PITR)
- Dengan perintah
PRAGMA litestream_time = '5 minutes ago';, pengguna dapat melihat status data pada titik waktu tertentu- Bisa menggunakan waktu relatif (
5 minutes ago) atau waktu absolut (2000-01-01T00:00:00Z)
- Bisa menggunakan waktu relatif (
- Ini memungkinkan Point-in-Time Recovery instan di level SQL
- Dalam contoh, setelah
UPDATEyang salah dijalankan, data dikembalikan ke kondisi 5 menit sebelumnya untuk memverifikasi keadaan normal
- Dalam contoh, setelah
Format LTX dan kompresi data
- Litestream v0.5 mengintegrasikan format LTX (Litestream Transaction eXchange)
- Versi sebelumnya mengirim seluruh halaman SQLite, tetapi LTX hanya mengirim kumpulan halaman berurutan yang diperlukan
- Inti dari LTX adalah fitur “compaction”, yang memilih hanya versi halaman terbaru saat pemulihan
- Contoh: dari
1 2 3 5 3 5 4 5 5, yang dipakai hanya 5, 4, 3, 2, 1 paling kanan
- Contoh: dari
- LTX dapat dikompaksi bukan hanya untuk seluruh database tetapi juga antar kumpulan file LTX, sehingga pemulihan PITR menjadi mungkin
- Trailer pada file LTX berisi indeks offset tiap halaman, sehingga
- halaman yang dibutuhkan saja bisa dibaca melalui permintaan S3 Range tanpa mengunduh seluruh file
Cara implementasi VFS
- Litestream VFS diimplementasikan menggunakan antarmuka VFS (Virtual File System) milik SQLite
- VFS adalah struktur plugin yang mengabstraksikan lapisan akses OS pada SQLite
- Litestream VFS hanya menangani operasi Read, sedangkan Write tetap ditangani oleh proses Litestream yang sudah ada
- Saat SQLite membaca halaman, VFS melakukan pemetaan berbasis indeks halaman alih-alih menggunakan byte offset yang diminta
- Dari indeks, sistem mencari nama file, offset aktual, dan ukuran halaman, lalu hanya mengunduh blok yang diperlukan melalui header Range pada API S3
- Menerapkan cache LRU untuk menyimpan “hot page” yang sering diakses di memori, sehingga jumlah panggilan ke S3 dapat diminimalkan
Replikasi real-time dan performa
- Litestream melakukan backup level L0 sekali per detik
- VFS secara berkala melakukan polling ke jalur S3 untuk memperbarui indeks secara bertahap
- Hasilnya adalah replika nyaris real-time (near-realtime replica)
- Dapat langsung digunakan tanpa perlu melakukan streaming seluruh database
- Berkat struktur ini, sistem memperoleh startup yang cepat dan waktu pemulihan yang singkat
Pemanfaatan dan makna
- Litestream menyimpan backup semua status database dengan resolusi per detik
- Saat terjadi kesalahan
DELETEatauUPDATE, data bisa langsung dipulihkan ke titik waktu yang diinginkan
- Saat terjadi kesalahan
- Struktur yang memungkinkan kueri langsung dari object storage membuatnya cepat bahkan di lingkungan server ephemeral
- Tanpa mekanisme yang rumit, sistem ini memanfaatkan fitur dasar SQLite untuk menyediakan skema backup dan pemulihan yang sederhana namun kuat
- Sudah digunakan dalam API internal Fly.io, dan dapat dioperasikan secara stabil di lingkungan produksi
1 komentar
Komentar Hacker News
Saya selalu sangat senang setiap kali tahu kode yang saya buat membantu orang lain
psanford/sqlite3vfs
SQLite bekerja seperti biasa, dan Litestream berjalan di atasnya secara transparan
Artinya, point-in-time recovery (PITR) bisa diwujudkan hanya dengan SQL dan pragma SQLite.
Kita bisa dengan cepat menanyakan data lama tanpa menyentuh dataset produksi secara langsung
Tentukan bucket S3 lewat variabel lingkungan, lalu di SQLite jalankan
.load litestream.so, setelah itudata dari titik waktu lampau bisa langsung ditanyakan dengan
PRAGMA litestream_time = '5 minutes ago';brew install sqlite3,Anda harus menentukan sendiri nama fungsi init seperti
.load litestream sqlite3_litestreamvfs_initCukup atur
"LITESTREAM_REPLICA_URL"dan variabel lingkungan kunci AWSSetelah memuat ekstensi dengan
temp.loadExtension("/path/to/litestream.dylib", "sqlite3_litestreamvfs_init"),buka dengan
file:my.db?vfs=litestreamdan bisa langsung dipakai.dylibKasus penggunaan saya adalah langsung memakai SQLite DB read-only yang disimpan di S3 dari website
DB diperbarui lewat pekerjaan cron dan semacamnya, dan website hanya membaca data terbaru lewat Litestream VFS
Saya penasaran apakah penggunaan seperti ini aman, dan apakah ada modul integrasi Python
Saat ini aplikasi Flask mengambil data dari Google Spreadsheet, mengubahnya ke SQLite, lalu memperbaruinya setiap hari
Lihat kode aplikasi saya
Ini juga bekerja langsung di SQLite CLI tanpa kode Python tambahan
Hanya memakai S3 sebagai dependensi eksternal dan juga cocok dengan SQLite
Lihat performa SQLite di ZeroFS
Contoh kode ncruces/go-sqlite3
Bisa dikendalikan lewat kode program tanpa variabel lingkungan, dan dapat menangani beberapa DB sekaligus
Hanya saja,
PRAGMA litestream_timeberlaku per koneksi, jadi perlu hati-hati saat memakai connection pool.load litestream.so, saya langsung teringat ncruces/go-sqlite3Saya penasaran apakah sulit membuatnya berjalan di lingkungan wasm
Ekstensi “DuckLake” milik DuckDB membuat snapshot pada setiap transaksi dan menyediakan fitur “time travel”
Ini mirip dengan PITR milik Litestream VFS
Di OLTP ini disebut fungsi pemulihan, sedangkan di OLAP disebut “Time Travel”
DuckLake mengoordinasikan akses multi-proses memakai DB katalog eksternal (PostgreSQL/MySQL/SQLite)
Sementara itu, Litestream memungkinkan banyak pembaca mengakses secara bersamaan lewat file LTX yang immutable di S3
Di kedua dunia, semuanya tampak sedang berkumpul pada struktur “shared storage + metadata + compaction”
Akan bagus jika ada lebih banyak kolaborasi lintas proyek seperti ini
Catatan rilis v0.5.3
Misalnya saat memakai ekstensi pencarian vektor seperti sqlite-vec atau vss,
saya ingin tahu apakah backup real-time ke S3 dengan Litestream dan query jarak jauh lewat Litestream VFS tetap memungkinkan
Sepertinya memang harus diuji sendiri