अपना खुद का डेटाबेस बनाकर देखें
(nan.fyi)- की-वैल्यू डेटाबेस के मूल सिद्धांत और निर्माण प्रक्रिया को समझाया गया है
- स्थायी भंडारण और खोज के लिए फाइल सिस्टम-आधारित तरीके से शुरुआत की जाती है
- डेटा जोड़ने, बदलने और हटाने के ऑपरेशन में अप्रभावी समस्याएँ आती हैं
- Append-Only फाइल, इंडेक्स, क्रमबद्धता (sorting), सेगमेंट कॉम्पैक्शन जैसे चरणों से यह धीरे-धीरे अधिक कुशल संरचना बनता है
- अंततः यह LSM ट्री जैसी आधुनिक संरचना से जुड़ता है और वास्तविक बड़े सिस्टमों में इस्तेमाल होता है
परिचय: डेटाबेस स्वयं बनाने की शुरुआत
अगर मान लें कि डेटाबेस जैसी कोई अवधारणा मौजूद नहीं है, तो चरण-दर-चरण देखें कि अपना खुद का डेटाबेस कैसे बनाया जाए।
यहाँ हम सबसे सरल की-वैल्यू डेटाबेस को सीधे लागू करने की प्रक्रिया पर नज़र डालते हैं।
मूल विचार: फाइल का उपयोग करके स्थायी भंडारण
- डेटाबेस का उद्देश्य डेटा को दीर्घकाल तक सुरक्षित रखना और बाद में कुशल खोज करना है।
- सबसे आम तरीका यह है कि प्रत्येक key-value जोड़े को फाइल सिस्टम के ज़रिए फाइल में लिख दिया जाए।
- डेटा डालते समय, उदाहरण के लिए
$ db set 1 "Lorem ipsum"फ़ॉर्मेट में फाइल में नया रिकॉर्ड जोड़ा जाता है। - खोज करते समय फाइल के अंदर मौजूद सभी key-value जोड़ों को क्रम से स्कैन करके वांछित key खोजी जाती है।
- अपडेट के लिए उस key के स्थान पर सीधे नया मान लिखने और डिलीट करने पर उस रिकॉर्ड को फाइल से हटाने की कोशिश की जाती है।
समस्या: In-Place अपडेट की अक्षमता
- फाइल में सीधे बदलाव या हटाने का तरीका बहुत अक्षम है।
- फाइल केवल एक निरंतर byte stream होती है, इसलिए बीच का डेटा बदलने पर उसके बाद की सारी सामग्री को खिसकाना पड़ता है।
- उदाहरण के लिए यदि किसी रिकॉर्ड को नया मान दिया जाए और लंबाई बदल जाए, तो उसके बाद के सभी डेटा को स्थानांतरित करना पड़ता है।
- जैसे-जैसे डेटा बढ़ता है, गति और दक्षता पर बड़ा असर पड़ता है।
सुधार 1: Append-Only फाइल संरचना
- अपडेट और डिलीट के समय पुराने डेटा को हटाए बिना, हर बार सिर्फ नया रिकॉर्ड फाइल के अंत में जोड़ना अपनाया जाता है।
- जब डेटा बदलता है, नया रिकॉर्ड जोड़कर खोज एल्गोरिद्म को ऐसा बदलते हैं कि key का अंतिम (latest) संस्करण पढ़ा जाए।
- डिलीट के लिए विशेष
tombstoneमान (जैसे null) से मार्क किया जाता है। - फायदा: पुराने डेटा को शिफ्ट किए बिना तेज़ी से लिखना संभव।
- नुकसान: दोहराए गए रिकॉर्ड और delete markers की वजह से फाइल धीरे-धीरे भारी होती जाती है।
- खोज अभी भी धीमी हो सकती है क्योंकि कई बार पूरी फाइल स्कैन करनी पड़ती है।
सुधार 2: फाइल आकार प्रबंधन और कंपैक्शन (Compaction)
- फाइल के अनंत रूप से बढ़ने की समस्या हल करने के लिए, जब आकार सीमा से ऊपर जाए तो नया फाइल/सेगमेंट शुरू किया जाता है।
- पुराने सेगमेंट से अनावश्यक डेटा (duplicate/डिलीट हुए रिकॉर्ड) हटाकर फाइल का आकार घटाया जाता है (compaction)।
- कॉम्पैक्शन में केवल वास्तव में आवश्यक डेटा ही रखा जाता है; पुराने, अप्रासंगिक एंट्री हटाई जाती हैं।
- कई सेगमेंट फाइलों को संभालकर आवश्यकता होने पर इन्हें merge करने की दिशा में विकास होता है।
सुधार 3: इंडेक्स (Index) के साथ तेज़ खोज
- हर key के लिए फाइल में उसकी स्थिति (offset) रखने वाला इन-मे्मोरी (hash table) इंडेक्स बनाया जाता है ताकि खोज तेज हो।
- खोज के समय पहले इंडेक्स देख कर सीधे फाइल के सही स्थान से डेटा पढ़ा जाता है।
- ट्रेड-ऑफ: खोज तेज हो जाती है, लेकिन इंडेक्स मेमोरी में रहता है इसलिए key की संख्या बहुत बढ़ने पर मेमोरी सीमा आ सकती है।
- इंडेक्स मैनेजमेंट के कारण write performance कुछ हद तक कम हो सकती है।
सुधार 4: सॉर्टेड स्ट्रिंग टेबल (Sorted String Table) और Sparse Index
- key के आधार पर हमेशा क्रमबद्ध (sorted) भंडारण करने पर रेंज क्वेरी (range query) बहुत कुशल हो जाती है।
- क्रमबद्ध डेटा का उपयोग करके इंडेक्स को हर key के लिए नहीं, सिर्फ कुछ key के लिए (sparse index) रखा जा सकता है।
- इंडेक्स की घनता बदलकर मेमोरी खपत और खोज दक्षता के बीच trade-off संभाला जा सकता है।
कार्यान्वयन तरीका: इन-मे्मोरी + ऑन-डिस्क संयोजन और स्थायित्व
- नया डेटा पहले sorted in-memory सूची में रखा जाता है और साथ में backup के लिए append-only फाइल में भी लिखते हैं।
- जब इन-मे्मोरी सूची बड़ी हो जाए तो उसे ऑन-डिस्क फाइल (SST) के रूप में sorted करके स्टोर करते हुए इंडेक्स अपडेट करते हैं।
- खोज के समय पहले मेमोरी देखी जाती है, न मिलने पर इंडेक्स की मदद से डिस्क से खोज की जाती है।
- ऑन-डिस्क फाइलों को immutable रखा जाता है; अपडेट/डिलीट भी नए डेटा जोड़कर ही हैंडल किए जाते हैं।
- अनावश्यक duplicates और हटाए गए डेटा को समय-समय पर compaction करके फाइल आकार नियंत्रित किया जाता है।
LSM ट्री (Log-Structured Merge Tree) का आगमन
- ऊपर के ये विकास वास्तव में LSM ट्री के नाम से व्यापक रूप से जाने जाते हैं।
- इन-मे्मोरी (memtable) और ऑन-डिस्क (sorted string table, SST) का संयोजन इसे तेज़ और बड़े स्केल पर उपयुक्त बनाता है।
- LevelDB, Amazon DynamoDB जैसे बड़े की-वैल्यू सिस्टम में यह मुख्य डेटा संरचना के रूप में उपयोग होता है।
- इसमें कुछ सीमाएँ और B-Tree आधारित रिलेशनल डेटाबेस से अंतर मौजूद हैं, फिर भी बड़े ट्रैफिक और स्केल के लिए यह मजबूत प्रदर्शन देता है।
निष्कर्ष
- सरल फाइल-आधारित मॉडल से शुरू होकर append-only, इंडेक्स, सॉर्टिंग, सेगमेंट- कम्पैक्शन और इन-मे्मोरी + ऑन-डिस्क संयोजन से बेहतर डेटाबेस डिज़ाइन की ओर विकास होता है।
- यह दृष्टिकोण विकसित करते हुए डेटाबेस के अंदरूनी काम करने के तरीके और संरचनात्मक निर्णयों को व्यावहारिक रूप से समझा जा सकता है।
- LSM ट्री संरचना आज के बड़े डेटा सिस्टमों में मानक भूमिका निभाती है।
- आगे जाकर रिलेशनल डेटाबेस की B-Tree जैसी अन्य संरचनाओं की खोज के लिए भी जगह बनी रहती है।
1 टिप्पणियां
Hacker News टिप्पणियाँ