Litestream VFS
(fly.io)- Litestream VFS एक plugin-शैली का extension है जो SQLite database को object storage (जैसे S3) से सीधे पढ़ने और query करने देता है
- पूरा database डाउनलोड किए बिना remote backup file से तुरंत query और Point-in-Time Recovery (PITR) करना संभव
- अंदरूनी तौर पर LTX format का उपयोग करके बदले हुए page sets को कुशलता से प्रबंधित करता है, और duplicate pages को छोड़ने वाली compaction से recovery speed बेहतर होती है
- SQLite के VFS interface का उपयोग करके केवल read operations को intercept करता है, जबकि write processing मौजूदा Litestream process संभालता है
- सेकंड-स्तरीय backup और index updates के जरिए लगभग real-time replica प्रदान करता है, जिससे cloud environment में तेज query execution संभव होता है
Litestream VFS का अवलोकन
- Litestream VFS SQLite को object storage URL को सीधे data source के रूप में उपयोग करने देता है
- SQLite shell में
.load litestream.soऔर.open file:///my.db?vfs=litestreamकमांड से इसे सक्रिय किया जा सकता है - इसके बाद S3 में संग्रहित backup files के आधार पर query चलाई जा सकती है
- SQLite shell में
- पूरे database को डाउनलोड किए बिना remote backup से सीधे query चलाना संभव है
- उदाहरण में
SELECT * FROM sandwich_ratingsquery के जरिए S3 में संग्रहित कुछ data को तुरंत देखा जाता है
- उदाहरण में
Point-in-Time Recovery (PITR) सुविधा
PRAGMA litestream_time = '5 minutes ago';कमांड से किसी specific time point पर data state को देखना संभव है- relative time (
5 minutes ago) या absolute time (2000-01-01T00:00:00Z) दिया जा सकता है
- relative time (
- इससे SQL स्तर पर तुरंत Point-in-Time Recovery (PITR) किया जा सकता है
- उदाहरण में गलत
UPDATEचलाने के बाद, 5 मिनट पहले की स्थिति में लौटकर सही data की पुष्टि की जाती है
- उदाहरण में गलत
LTX format और data compaction
- Litestream v0.5 ने LTX (Litestream Transaction eXchange) format को एकीकृत किया
- पहले के version पूरे SQLite pages भेजते थे, लेकिन LTX केवल ordered page sets भेजता है
- LTX की मुख्य विशेषता “compaction” है, जो recovery के समय हर page का सबसे नया version चुनती है
- उदाहरण:
1 2 3 5 3 5 4 5 5में सबसे दाईं ओर वाले 5, 4, 3, 2, 1 का ही उपयोग किया जाता है
- उदाहरण:
- LTX न केवल पूरे database पर, बल्कि LTX files के sets के बीच भी compaction कर सकता है, जिससे PITR recovery संभव होती है
- LTX file के trailer में हर page का offset index शामिल होता है, इसलिए
- पूरी file डाउनलोड किए बिना S3 Range request से केवल ज़रूरी pages पढ़े जा सकते हैं
VFS implementation का तरीका
- Litestream VFS, SQLite के VFS (Virtual File System) interface का उपयोग करके implement किया गया है
- VFS, SQLite की OS access layer को abstract करने वाली plugin structure है
- Litestream VFS केवल read operation संभालता है, जबकि write मौजूदा Litestream process संभालता है
- जब SQLite page पढ़ता है, VFS requested byte offset की जगह page index आधारित mapping करता है
- index से filename, actual offset, और page size निकालकर S3 API के Range header से वही block डाउनलोड किया जाता है
- LRU cache लागू किया गया है ताकि बार-बार उपयोग होने वाले “hot pages” memory में बने रहें और S3 calls कम हों
Real-time replication और performance
- Litestream हर सेकंड L0 level backup करता है
- VFS समय-समय पर S3 path को poll करके index को incrementally update करता है
- नतीजतन near-realtime replica बनता है
- पूरे database को stream किए बिना भी इसे तुरंत उपयोग किया जा सकता है
- इस architecture की वजह से तेज़ startup speed और कम recovery time मिलता है
उपयोग और महत्व
- Litestream database की हर state का backup second-level resolution पर बनाए रखता है
DELETEयाUPDATEकी गलती होने पर, इच्छित समय बिंदु पर तुरंत restore किया जा सकता है
- object storage से सीधे query करने वाली यह संरचना ephemeral server environment में भी तेज़ी से काम करती है
- जटिल mechanism के बिना, SQLite की मूल क्षमताओं का उपयोग करके सरल लेकिन शक्तिशाली backup·recovery system प्रदान करती है
- Fly.io की internal API में भी उपयोग हो रहा है, और production environment में भी स्थिर रूप से चलाया जा सकता है
1 टिप्पणियां
Hacker News की राय
जब भी पता चलता है कि मेरे बनाए कोड से किसी और को मदद मिल रही है, सच में बहुत खुशी होती है
psanford/sqlite3vfs
SQLite हमेशा की तरह काम करता है, और Litestream उसके ऊपर पारदर्शी तरीके से काम करता है
यानी सिर्फ SQL और SQLite pragma से point-in-time recovery (PITR) लागू किया जा सकता है।
प्रोडक्शन dataset को सीधे छुए बिना भी पुराने डेटा को तेज़ी से क्वेरी किया जा सकता है
environment variable से S3 bucket सेट करें, और SQLite में
.load litestream.soके बादPRAGMA litestream_time = '5 minutes ago';से पिछले समय का डेटा तुरंत क्वेरी किया जा सकता हैbrew install sqlite3के बाद.load litestream sqlite3_litestreamvfs_initकी तरह init function का नाम सीधे देना पड़ता हैबस
"LITESTREAM_REPLICA_URL"और AWS key environment variables सेट करने होते हैंtemp.loadExtension("/path/to/litestream.dylib", "sqlite3_litestreamvfs_init")से extension लोड करने के बादfile:my.db?vfs=litestreamसे खोलें और तुरंत इस्तेमाल कर सकते हैं.dylibफ़ाइल का path कैसे ढूँढामेरा use case यह है कि वेबसाइट पर सीधे S3 में स्टोर की गई read-only SQLite DB इस्तेमाल की जाए
DB को cron job वगैरह से अपडेट किया जाता है, और वेबसाइट सिर्फ Litestream VFS के ज़रिए नया डेटा पढ़ती है
क्या इस तरह इस्तेमाल करना ठीक रहेगा, और क्या इसके लिए कोई Python integration module भी है?
अभी मेरी Flask app Google Spreadsheet से डेटा लेकर उसे SQLite में बदलती है और रोज़ अपडेट करती है
मेरे app code का संदर्भ
यह अतिरिक्त Python code के बिना SQLite CLI में भी वैसे ही काम करता है
यह सिर्फ S3 को external dependency के रूप में इस्तेमाल करता है और SQLite के साथ भी अच्छा बैठता है
ZeroFS SQLite performance संदर्भ
ncruces/go-sqlite3 उदाहरण code
इसे environment variables के बिना program code से नियंत्रित किया जा सकता है, और कई DB को एक साथ संभाला जा सकता है
लेकिन
PRAGMA litestream_timeconnection स्तर पर लागू होता है, इसलिए connection pool इस्तेमाल करते समय सावधानी चाहिए.load litestream.soदेखकर मुझे तुरंत ncruces/go-sqlite3 याद आ गयाक्या इसे wasm environment में चलाना मुश्किल था?
DuckDB का “DuckLake” extension हर transaction पर snapshot बनाकर “time travel” फीचर देता है
यह Litestream VFS के PITR जैसा है
OLTP में इसे recovery feature कहा जाता है, जबकि OLAP में इसे “Time Travel” कहा जाता है
DuckLake external catalog DB(PostgreSQL/MySQL/SQLite) का इस्तेमाल करके multi-process access को समन्वित करता है
दूसरी तरफ Litestream, S3 की immutable LTX files के ज़रिए कई readers को एक साथ access करने देता है
दोनों दुनिया आखिरकार “shared storage + metadata + compaction” संरचना की ओर सिमटती दिख रही हैं
अच्छा होगा अगर ऐसे प्रोजेक्ट्स के बीच cross-collaboration और बढ़े
v0.5.3 release notes
उदाहरण के लिए, अगर sqlite-vec या vss जैसे vector search extensions इस्तेमाल कर रहे हों,
तो क्या Litestream से S3 पर real-time backup करते हुए Litestream VFS से remote query करना संभव है?
लगता है खुद टेस्ट करके ही पता चलेगा