Wal2 मोड को सक्षम/अक्षम करना
- SQLite का "Wal2" मोड "wal (Write-Ahead Logging)" मोड से बहुत मिलता-जुलता है।
- डेटाबेस को wal2 मोड में बदलने के लिए
PRAGMA journal_mode = wal2; कमांड का उपयोग करें।
- "wal" मोड से सीधे "wal2" मोड में बदला नहीं जा सकता; पहले इसे rollback मोड में बदलना होगा।
- wal मोड डेटाबेस को wal2 मोड में बदलने के लिए
PRAGMA journal_mode = delete; के बाद PRAGMA journal_mode = wal2; कमांड का उपयोग करें।
- wal2 मोड डेटाबेस को केवल उसी branch पर compile किए गए SQLite version से ही access किया जा सकता है।
- SQLite के किसी दूसरे version का उपयोग करने पर SQLITE_NOTADB त्रुटि होती है।
- wal2 मोड डेटाबेस को rollback मोड में बदलकर सभी SQLite versions से access योग्य बनाने के लिए
PRAGMA journal_mode = delete; कमांड का उपयोग करें।
Wal2 मोड के फायदे
- मौजूदा wal मोड में, जब writer डेटाबेस में डेटा लिखता है, तो वह डेटाबेस फ़ाइल को सीधे संशोधित नहीं करता, बल्कि "-wal" फ़ाइल में नया डेटा जोड़ता है।
- read operations मूल डेटाबेस फ़ाइल और "-wal" फ़ाइल, दोनों से डेटा पढ़ते हैं।
- किसी समय "-wal" फ़ाइल से डेटाबेस फ़ाइल में डेटा कॉपी किया जाता है; इसे "checkpoint" कहा जाता है।
- checkpoint को
PRAGMA wal_checkpoint या sqlite3_wal_checkpoint_v2() के माध्यम से explicit रूप से चलाया जा सकता है, या PRAGMA wal_autocheckpoint सेट करके इसे automatic रूप से चलाया जा सकता है (default setting)।
- checkpointer writer को block नहीं करता, और writer भी checkpointer को block नहीं करता।
- लेकिन checkpoint के दौरान यदि writer डेटाबेस में लिखता है, तो नया डेटा wal फ़ाइल के अंत में जुड़ता रहता है, जिससे wal फ़ाइल लगातार बड़ी हो सकती है।
- wal2 मोड में, भले ही checkpointer को बिना व्यवधान पूरा होने का मौका न मिले, wal फ़ाइल के अनंत तक बढ़ते जाने की समस्या नहीं होती।
- wal2 मोड में एक के बजाय दो wal फ़ाइलें ("-wal" और "-wal2") उपयोग की जाती हैं।
- जब डेटा लिखा जाता है, तो writer पहली wal फ़ाइल में नया डेटा जोड़ना शुरू करता है।
- जब पहली wal फ़ाइल पर्याप्त बड़ी हो जाती है, तो writer दूसरी wal फ़ाइल में डेटा जोड़ना शुरू करता है।
- इसके बाद पहली wal फ़ाइल checkpoint के लिए उपलब्ध हो जाती है, और जब दूसरी wal फ़ाइल पर्याप्त बड़ी हो जाती है तथा पहली फ़ाइल checkpoint हो जाती है, तो फिर से पहली फ़ाइल पर स्विच किया जाता है।
एप्लिकेशन प्रोग्रामिंग
- उपयोगकर्ता के दृष्टिकोण से wal और wal2 मोड के बीच मुख्य अंतर checkpoint से संबंधित है।
- wal मोड में checkpoint किसी भी समय प्रयास किया जा सकता है, लेकिन wal2 मोड में checkpoint तभी संभव है जब writer "दूसरी" wal फ़ाइल पर स्विच कर चुका हो।
- wal मोड में transaction commit होने के बाद wal-hook (callback) को wal फ़ाइल में कुल pages की संख्या को argument के रूप में देकर बुलाया जाता है।
- wal2 मोड में wal-hook को दोनों wal फ़ाइलों में कुल uncheckpointed pages की संख्या को argument के रूप में देकर बुलाया जाता है, या यदि "दूसरी" wal फ़ाइल खाली हो या पहले से checkpoint हो चुकी हो, तो argument के रूप में 0 दिया जाता है।
- clients को wal2 मोड डेटाबेस के लिए wal मोड जैसी ही checkpoint strategy उपयोग करने की सिफारिश की जाती है।
- wal-hook को transaction के disk पर commit होने और डेटाबेस lock के release होने के बाद बुलाया जाता है, लेकिन यह
sqlite3_step() कॉल के भीतर होता है।
- BEGIN CONCURRENT सिस्टम में, wal-hook के अंदर checkpoint चलाने के बजाय, application mutex release होने के बाद इस काम को टालने वाले thread का उपयोग किया जा सकता है।
GN⁺ की राय
- SQLite का wal2 मोड डेटाबेस की concurrency और efficiency को बेहतर बनाने वाला एक नया journaling तरीका प्रदान करता है।
- wal फ़ाइल के अनंत वृद्धि की समस्या को हल करके सिस्टम की stability और performance को बेहतर बनाना महत्वपूर्ण है।
- wal2 मोड के आने के बाद developers को डेटाबेस checkpoint strategy पर फिर से विचार करना होगा और बेहतर concurrency के लिए उपयुक्त checkpoint logic लागू करने की ज़रूरत होगी।
1 टिप्पणियां
Hacker News टिप्पणियाँ
Bedrock
WAL2 मोड जैसी एक तकनीक, left-right primitive, का लिंक दिया गया है.
walफ़ाइल को delete कर देंगे। क्योंकिwal2पर switch होने के बाद वे सोच सकते हैं किwalबची हुई फ़ाइल है.Microsoft SQL Server एक समान architecture का उपयोग करता है, लेकिन अलग log files की जगह physical (disk पर मौजूद) log file के भीतर Virtual Log Files (VLF) allocate करता है। VLF एक ring buffer में allocate किए जाते हैं, और उनकी संख्या हज़ारों तक हो सकती है.
इससे पता चलता है कि यह फीचर अभी तक release नहीं हुआ है.
मुझे हमेशा इस बात की चिंता रही है कि WAL डेटा integrity बनाए रखने और crash से recovery में मदद करने के लिए होता है। लेकिन फ़ाइल खुद batch में लिखी जाती है (disk पर reliably commit की जाती है), और डेटाबेस में हर बदलाव के बाद नहीं, बल्कि performance पाने के लिए ऐसा किया जाता है। क्या इससे इसका उद्देश्य कमज़ोर नहीं पड़ता? सामान्य रूप से, सिर्फ डेटाबेस तक सीमित नहीं, मुझे इसका जवाब नहीं मिला.
सोच रहा हूँ कि इसका Litestream जैसे नए distributed SQLite systems पर क्या असर पड़ेगा.
तो क्या यह मूल रूप से डेटाबेस के लिए double buffering है? बात समझ में आती है.
WAL2 मोड को HC-tree backend research के benchmark में शामिल किया गया था.