2011-03-15 12 views
7

का एक बहुत बड़ा डेटाबेस बनाने के लिए युक्तियाँ प्रश्न: उच्च रिडंडेंसी के साथ मजबूत हैश पर अनुक्रमित एक बहुत बड़े (बहु टेराबाइट्स) डेटाबेस से निपटने के लिए आपको क्या समाधान या सुझाव देना होगा?हैश

किसी प्रकार का उलटा भंडारण?

क्या पोस्टग्रेस के साथ कुछ किया जा सकता है?

यदि आवश्यक हो तो मैं अपना खुद का भंडारण रोल करने के लिए तैयार हूं।

(संकेत: खुला स्रोत, कोई जावा होना चाहिए,, लिनक्स पर चलाना चाहिए डिस्क-आधारित होने चाहिए, C/C++/अजगर पसंदीदा): मैं एक बहुत बनाने की जरूरत

विवरण बड़े डेटाबेस जहां प्रत्येक रिकॉर्ड है:

  • कुछ मनमाने ढंग से मेटा डेटा (कुछ पाठ क्षेत्रों) कुछ प्राथमिक कुंजी
  • एक हैश सहित (128 बिट हैश, मजबूत MD5 की तरह)

अभिलेखों की मात्रा वह है जो मैं काफी बड़ी योग्यता प्राप्त करूंगा: कई 10 से 100 अरबों)। पंक्तियों में हैंश की एक महत्वपूर्ण अनावश्यकता है (रिकॉर्ड के 40% से अधिक हैश ने कम से कम एक और रिकॉर्ड के साथ साझा किया है, कुछ हैश 100K रिकॉर्ड में मौजूद हैं)

प्राथमिक उपयोग हैश द्वारा खोजना है, फिर पुनर्प्राप्त करें मेटाडाटा। द्वितीयक उपयोग प्राथमिक कुंजी द्वारा देखने के लिए है, फिर मेटाडेटा पुनर्प्राप्त करें।

यह एक विश्लेषिकी-प्रकार डेटाबेस है, इसलिए समग्र भार मध्यम है, ज्यादातर पढ़ते हैं, कुछ लिखते हैं, ज्यादातर बैच किए गए लिखते हैं।

वर्तमान दृष्टिकोण पोस्टग्रेज़ का उपयोग प्राथमिक कुंजी पर इंडेक्स और हैश कॉलम पर एक इंडेक्स के साथ करना है। तालिका को हैश पर इंडेक्स के साथ बैच में लोड किया गया है।

सभी अनुक्रमणिका बीटीआर हैं। हैश कॉलम पर सूचकांक विशाल हो रहा है, तालिका के मुकाबले बड़ा या बड़ा है। 120 जीबी टेबल पर इंडेक्स को फिर से बनाने में लगभग एक दिन लगते हैं। हालांकि क्वेरी प्रदर्शन काफी अच्छे हैं।

समस्या यह है कि लक्षित डेटाबेस के लिए अनुमानित आकार 400 जीबी के छोटे डेटा सेट के साथ परीक्षण के आधार पर 4TB से अधिक होगा, जो कुल लक्ष्य के लगभग 10% का प्रतिनिधित्व करता है। पोस्टग्रेज़ में लोड होने के बाद, 50% स्टोरेज दुर्भाग्य से हैश कॉलम पर SQL इंडेक्स द्वारा उपयोग किया जा रहा है।

यह रास्ता बहुत बड़ा है। और मुझे लगता है कि हैश में अनावश्यकता कम भंडारण का अवसर है।

ध्यान दें कि यह समस्या का वर्णन करते समय, इनमें से कुछ तालिकाएं बनाई जानी चाहिए।

+0

इन दिनों 128 बिट हैश वास्तव में क्रिप्टो ग्रेड नहीं है। क्या आपने इंडेक्स का उपयोग नहीं करने की कोशिश की है, लेकिन हैश के पहले 8 बिट्स पर आधारित विभाजन? –

+0

@ टायलर 128 बिट्स एमडी 5 या कटा हुआ SHA1 मेरे लिए सभ्य क्रिप्टो है। कम से कम इसका मुख्य श्रेणी का अच्छा उपयोग होता है।मैंने इंडेक्स का उपयोग नहीं करने की कोशिश की और लुकअप प्रदर्शन भयानक है। क्या आप कुंजी विभाजन पर विस्तार कर सकते हैं? –

+0

तो इंडेक्स का उपयोग करें और डिस्क स्पेस हिट करें। गति या स्थान के लिए अनुकूलित करें, एक चुनें। –

उत्तर

5

आप केवल आईडी और हैश के साथ एक टेबल बना सकते हैं, और इंडेक्स, मेटाडाटा और हैश आईडी के साथ आपका अन्य डेटा बना सकते हैं। ऐसा करने से, आप तालिका में 100k बार तक एक ही हैश लिखने से रोक सकते हैं।

+0

दिलचस्प, सरल है। यह वास्तव में समझ में आता है! –

+1

अब हैश इंडेक्स के लिए btrees की तुलना में कुछ बेहतर इंडेक्स हैं? –

+0

मैंने इस दृष्टिकोण के साथ खेला, साथ ही पोस्टग्रेज़ में एक उलटा स्टोरेज बनाना (उर्फ कुंजी/वैल्यू टेबल जिसमें पॉइंटर्स के साथ अपडेट पर विस्तारित टुपल्स की एक सरणी है, वास्तव में एक पोस्टिंग सूची है) ... ये दिलचस्प आकार में कमी प्रदान कर रहे हैं, हां सृजन/अद्यतन समय वास्तव में धीमा हो रहा है: अब मैं वास्तव में एक असली और विशेष रूप से उलटा भंडारण कंटेनर जैसे ज़ेटेयर, स्फिंक्स या xapian की तरफ इशारा कर रहा हूं। –