Litestream VFS
(fly.io)- Litestream VFS, SQLite veritabanlarını nesne depolamadan (S3 vb.) doğrudan okuyup sorgulamayı mümkün kılan eklenti biçiminde bir genişletmedir
- Tüm veritabanını indirmeden uzak yedek dosyaları üzerinde anında sorgu ve zamana noktasal geri yükleme (Point-in-Time Recovery, PITR) yapılabilir
- Dahili olarak LTX formatını kullanarak değişen sayfa kümelerini verimli biçimde yönetir ve tekrarlanan sayfaları atlayan sıkıştırma (compaction) ile geri yükleme hızını artırır
- SQLite’ın VFS arayüzünü kullanarak yalnızca okuma davranışını yakalar; yazma işlemleri ise mevcut Litestream süreci tarafından yürütülür
- Saniye düzeyinde yedekleme ve indeks güncellemeleri sayesinde neredeyse gerçek zamanlı bir replika sunar ve bulut ortamlarında hızlı sorgu çalıştırmayı destekler
Litestream VFS’ye genel bakış
- Litestream VFS, SQLite’ın nesne depolama URL’sini doğrudan veri kaynağı olarak kullanabilmesini sağlayan bir özelliktir
- SQLite shell’de
.load litestream.sove.open file:///my.db?vfs=litestreamkomutlarıyla etkinleştirilebilir - Sonrasında S3’te saklanan yedek dosyaları temel alınarak sorgular çalıştırılabilir
- SQLite shell’de
- Tüm veritabanını indirmeden uzak yedekten doğrudan sorgu çalıştırmak mümkündür
- Örnekte
SELECT * FROM sandwich_ratingssorgusuyla S3’te depolanan verinin bir kısmı anında görüntülenir
- Örnekte
Zamana noktasal geri yükleme (PITR) özelliği
PRAGMA litestream_time = '5 minutes ago';komutuyla belirli bir zamandaki veri durumunu görüntülemek mümkündür- Göreli zaman (
5 minutes ago) veya mutlak zaman (2000-01-01T00:00:00Z) belirtilebilir
- Göreli zaman (
- Böylece anında zamana noktasal geri yükleme (Point-in-Time Recovery) SQL düzeyinde gerçekleştirilebilir
- Örnekte hatalı bir
UPDATEçalıştırıldıktan sonra 5 dakika önceki duruma dönülerek doğru veriler doğrulanır
- Örnekte hatalı bir
LTX formatı ve veri sıkıştırma
- Litestream v0.5, LTX (Litestream Transaction eXchange) formatını entegre eder
- Önceki sürümlerde SQLite sayfalarının tamamı aktarılırken, LTX yalnızca sıralı sayfa kümelerini aktarır
- LTX’in temelinde “compaction” özelliği vardır; bu özellik geri yükleme sırasında yalnızca her sayfanın en güncel sürümünü seçer
- Örnek:
1 2 3 5 3 5 4 5 5içinden yalnızca en sağdaki 5, 4, 3, 2, 1 kullanılır
- Örnek:
- LTX yalnızca tüm veritabanında değil, LTX dosya kümeleri arasında da sıkıştırma yapabilir; bu sayede PITR geri yükleme mümkün olur
- LTX dosyalarının trailer bölümünde her sayfanın ofset indeksi bulunur, bu sayede
- Tüm dosyayı indirmeden S3 Range istekleri ile yalnızca gerekli sayfalar okunabilir
VFS’nin uygulanma biçimi
- Litestream VFS, SQLite’ın VFS (Virtual File System) arayüzü kullanılarak uygulanır
- VFS, SQLite’ın işletim sistemi erişim katmanını soyutlayan eklenti yapısıdır
- Litestream VFS yalnızca okuma (Read) işlemlerini ele alır; yazma (Write) işlemleri mevcut Litestream süreci tarafından yürütülür
- SQLite bir sayfayı okuduğunda, VFS istenen bayt ofseti yerine sayfa indeksi tabanlı eşleme yapar
- İndeksten dosya adı, gerçek ofset ve sayfa boyutu bulunur; ardından S3 API’sinin Range başlığı ile ilgili blok indirilir
- LRU cache uygulanarak sık erişilen “hot page”ler bellekte tutulur ve S3 çağrılarının sayısı en aza indirilir
Gerçek zamanlı replikasyon ve performans
- Litestream saniyede bir kez L0 düzeyi yedekleme gerçekleştirir
- VFS, S3 yolunu periyodik olarak yoklayarak indeksi kademeli olarak günceller
- Sonuç olarak neredeyse gerçek zamanlı bir replika (near-realtime replica) oluşturulur
- Tüm veritabanını stream etmek gerekmeden hemen kullanılabilir
- Bu yapı sayesinde hızlı başlangıç süresi ve kısa geri yükleme süresi elde edilir
Kullanım alanları ve önemi
- Litestream, veritabanının tüm durumlarını saniye düzeyinde çözünürlükle yedek olarak saklar
DELETEveyaUPDATEhatalarında istenen zamana anında geri dönülebilir
- Nesne depolamadan doğrudan sorgulama yapabilen bu yapı, ephemeral sunucu ortamlarında da hızlı çalışır
- Karmaşık mekanizmalara ihtiyaç duymadan SQLite’ın temel özelliklerinden yararlanarak basit ama güçlü bir yedekleme ve geri yükleme sistemi sunar
- Fly.io’nun dahili API’sinde de kullanılıyor ve üretim ortamında da kararlı şekilde işletilebiliyor
1 yorum
Hacker News yorumları
Yazdığım kodun başkalarına yardımcı olduğunu fark ettiğim her seferde gerçekten çok mutlu oluyorum
psanford/sqlite3vfs
SQLite her zamanki gibi çalışıyor, Litestream ise onun üstünde şeffaf biçimde çalışıyor
Yani yalnızca SQL ve SQLite pragma'larıyla belirli bir zamana anında geri yükleme (PITR) sağlanabiliyor.
Üretim veri setine doğrudan dokunmadan geçmiş verileri hızlıca sorgulayabiliyorsunuz
Ortam değişkeniyle S3 bucket'ını belirleyip, SQLite'ta
.load litestream.sosonrasındaPRAGMA litestream_time = '5 minutes ago';ile geçmişteki bir andaki veriyi anında sorgulayabiliyorsunuzbrew install sqlite3sonrasında.load litestream sqlite3_litestreamvfs_initşeklinde init fonksiyon adını doğrudan belirtmek gerekiyorbun:sqliteile de başarıyla çalıştırdımSadece
"LITESTREAM_REPLICA_URL"ve AWS anahtar ortam değişkenlerini ayarlamak yeterliUzantıyı
temp.loadExtension("/path/to/litestream.dylib", "sqlite3_litestreamvfs_init")ile yükledikten sonrafile:my.db?vfs=litestreamolarak açarsanız hemen kullanılabiliyor.dylibdosya yolunu nasıl bulduğunu merak ettimBenim kullanım senaryom, S3'te tutulan salt okunur bir SQLite DB'yi web sitesinde doğrudan kullanmak
DB, cron işi vb. ile güncelleniyor ve web sitesi en güncel veriyi sadece Litestream VFS üzerinden okuyor
Böyle bir kullanımın uygun olup olmadığını ve Python için entegre bir modül olup olmadığını merak ediyorum
Şu anda Flask uygulaması veriyi Google Spreadsheet'den alıp SQLite'a dönüştürüyor ve her gün güncelliyor
Uygulamamın koduna bakın
Ek bir Python kodu olmadan SQLite CLI'da da aynen çalışıyor
Dış bağımlılık olarak yalnızca S3 kullanıyor ve SQLite ile de iyi uyum sağlıyor
ZeroFS SQLite performansı için bakın
ncruces/go-sqlite3 örnek kodu
Ortam değişkenleri olmadan program koduyla kontrol edilebiliyor ve birden fazla DB aynı anda yönetilebiliyor
Ancak
PRAGMA litestream_time, bağlantı düzeyinde uygulandığı için connection pool kullanırken dikkat etmek gerekiyor.load litestream.soifadesini görünce aklıma hemen ncruces/go-sqlite3 geldiBunu wasm ortamında da çalıştırmak zor oldu mu diye merak ettim
DuckDB'nin “DuckLake” uzantısı, her transaction için snapshot oluşturarak “time travel” özelliği sunuyor
Bu, Litestream VFS'nin PITR özelliğine benziyor
OLTP tarafında buna kurtarma özelliği deniyor, OLAP tarafında ise “Time Travel” deniyor
DuckLake, dış katalog DB'si (PostgreSQL/MySQL/SQLite) kullanarak çoklu süreç erişimini koordine ediyor
Buna karşılık Litestream, S3 üzerindeki değişmez LTX dosyaları sayesinde birden fazla okuyucunun aynı anda erişmesine izin veriyor
Her iki dünya da “paylaşımlı depolama + metadata + compaction” yapısına yakınsıyor
Böyle projeler arasında daha fazla çapraz iş birliği olmasını isterim
v0.5.3 sürüm notları
Örneğin sqlite-vec ya da vss gibi vektör arama uzantıları kullanırken,
Litestream ile S3'e gerçek zamanlı yedek alıp Litestream VFS ile uzaktan sorgulama yapılabiliyor mu bilmek istiyorum
Galiba doğrudan test etmekten başka yol yok