2013-07-19 9 views
15

में अरबों छोटे दस्तावेज़ों की तेज़ी से खोज के लिए रणनीतियां मुझे कई अरब छोटे डेटा संरचनाओं (लगभग 200 बाइट्स प्रत्येक) को स्टोर करने की आवश्यकता है। अब तक, प्रत्येक तत्व को एक अलग दस्तावेज़ के रूप में संग्रहीत करना अच्छी तरह से काम कर रहा है, मोंगो प्रति सेकंड लगभग 10,000 परिणाम प्रदान करता है। मैं 20-बाइट हैश का उपयोग प्रत्येक दस्तावेज़ के लिए _id और _id फ़ील्ड पर एक एकल इंडेक्स के रूप में कर रहा हूं। परीक्षण में, यह 5,000,000 दस्तावेजों के साथ डेटा सेट के लिए काम कर रहा है।MongoDB

ऑपरेशन में, हम प्रति सेकेंड लगभग 10,000 अनुरोध करेंगे, मौजूदा दस्तावेज़ों को प्रति सेकंड 1,000 बार अपडेट करेंगे, और नए दस्तावेज़ों को प्रति सेकंड या उससे कम 100 बार डालेंगे।

हम बड़े डेटा सेट कैसे प्रबंधित कर सकते हैं, जब हम रैम में एक संपूर्ण इंडेक्स स्टोर नहीं कर सकते हैं? अगर हम प्रत्येक दस्तावेज़ में कई तत्वों को जोड़ते हैं तो मोंगो डीबी बेहतर प्रदर्शन करेगा - सूचकांक के माध्यम से तेज खोज के लिए, लेकिन प्रत्येक क्वेरी में अधिक डेटा लौटाया जा रहा है?

SO पर अन्य प्रश्नों के विपरीत, मुझे केवल दिलचस्पी नहीं है कि हम मोंगो में कितना डेटा डाल सकते हैं। यह स्पष्ट रूप से उस डेटा की मात्रा का प्रबंधन कर सकता है जिसे हम देख रहे हैं। मेरी चिंता यह है कि हम विशाल संग्रह पर find संचालन की गति को अधिकतम कैसे कर सकते हैं, बाधित रैम दिया गया है।

हमारी खोजों को क्लस्टर किया जाएगा; लगभग 50,000 तत्व प्रश्नों के बारे में 50% संतुष्ट होंगे, लेकिन शेष 50% यादृच्छिक रूप से सभी डेटा में वितरित किए जाएंगे। क्या हम रैम में सबसे अधिक इस्तेमाल किए गए डेटा की एक छोटी अनुक्रमणिका रखने के लिए उन 50% को अपने संग्रह में ले जाकर प्रदर्शन लाभ की उम्मीद कर सकते हैं?

20-बाइट्स से 8-बाइट्स तक _id फ़ील्ड के आकार को कम करने से MnogoDB की अनुक्रमण गति पर महत्वपूर्ण प्रभाव पड़ता है?

+0

जैसा कि ऐसा लगता है कि आपके पास रैम की तुलना में कहीं अधिक दस्तावेज होंगे, मैं जितना संभव हो सके दस्तावेजों को कम कर सकता हूं ताकि रैम में फिट होने वाले डेटा की मात्रा में वृद्धि हो सके। सुनिश्चित करें कि फ़ील्ड नाम उदाहरण के लिए केवल एक या दो वर्ण हैं। क्या आप sharding पर योजना बना रहे हैं? उसी सर्वर पर डेटा को एक अलग संग्रह में स्थानांतरित करने से राम उपयोग नहीं बदलेगा - क्योंकि यह ओएस किसी भी तरह से प्रबंधित है। – WiredPrairie

+0

डेटा बढ़ने के साथ ही हम sharding होगा। – Neil

+0

रैम में इस छोटे संग्रह के लिए इंडेक्स को रखने के लिए और इसे स्वैप होने से रोकने की कोशिश करने के लिए, सबसे अधिक उपयोग किए गए रिकॉर्ड को एक अलग संग्रह में रखना एक विचार है। मुझे लगता है कि यह मूर्खतापूर्ण हो सकता है, लेकिन मुझे यकीन नहीं है कि क्यों या क्यों नहीं। – Neil

उत्तर

17

कुछ रणनीतियों दिमाग में आते हैं:

1) 'हॉट' दस्तावेज़ों के लिए एक अलग संग्रह/डेटाबेस का उपयोग करें।

यदि आप जानते हैं कि हॉट सेट में कौन से दस्तावेज़ हैं, तो हाँ, उन्हें एक अलग संग्रह में ले जाने से मदद मिलेगी। यह सुनिश्चित करेगा कि गर्म दस्तावेज एक ही विस्तार/पृष्ठों पर सह-निवासी हैं। यह उन दस्तावेजों के लिए सूचकांक भी पूरी तरह स्मृति में होने की संभावना बना देगा। यह छोटा होने और (पूरी तरह से) होने के कारण होता है।

यदि गर्म दस्तावेज अन्य दस्तावेजों के साथ यादृच्छिक रूप से मिश्रित होते हैं तो आपको बी-ट्री इंडेक्स के अधिकतर पत्ते तत्वों में गलती होनी होगी जब दस्तावेज़ को लोड करते समय किसी दस्तावेज़ को हाल ही में लोड या एक्सेस किया गया हो ब्लॉक छोटा है।

2) अनुक्रमित मान को छोटा करें।

सूचकांक एक ही बी-ट्री ब्लॉक में फिट होने वाले अधिक मूल्यों को महत्व देता है। (नोट: कुंजी को इंडेक्स में शामिल नहीं किया गया है।) एक बाल्टी में अधिक प्रविष्टियों का मतलब सूचकांक के लिए कम बाल्टी और कम कुल मेमोरी है। यह उच्च संभावना/लंबे जीवनकाल में अनुवाद करता है कि ब्लॉक स्मृति में रहेंगे। आपके उदाहरण में 20-> 8 वर्ण कमी 50% से अधिक बचत है। यदि आप उन 8 बाइट्स को लंबे समय तक परिवर्तित कर सकते हैं तो थोड़ी अधिक बचत होती है क्योंकि लंबे समय तक लम्बाई उपसर्ग (4 बाइट्स) और पिछली नल (5 बाइट कुल) नहीं होती है।

3) प्रमुख नामों को छोटा करें।

फ़ील्ड जितना छोटा होगा प्रत्येक दस्तावेज़ में कम स्थान होता है। यह पठनीयता कम करने का दुर्भाग्यपूर्ण दुष्प्रभाव है।

4) शार्ड

यह वास्तव में एक ही तरीका है चेहरे में प्रदर्शन को बनाए रखने के लिए एक संपूर्ण संग्रह है कि स्मृति और अंतिम डिस्क बैंडविड्थ समाप्त होने भर में पढ़ता की है। यदि आप शार्ड करते हैं तो भी आप 'गर्म' संग्रह को दाढ़ी देना चाहेंगे।

5) Adjust the read-ahead on disk to a small value.

के बाद से 'गैर-हॉट' पढ़ता याद है कि दस्तावेज़ और संभव के रूप में उसके चारों ओर दस्तावेजों के रूप में कुछ में डिस्क हम वास्तव में केवल पढ़ने के लिए करना चाहते हैं/गलती से एक यादृच्छिक दस्तावेज़ लोड कर रहे हैं। एक बार जब उपयोगकर्ता फ़ाइल के एक हिस्से से पढ़ता है तो अधिकांश सिस्टम डेटा के बड़े ब्लॉक को आजमाएंगे और पढ़ेंगे। यह वही है जो हम चाहते हैं के विपरीत है।

आप अपने सिस्टम एक बहुत लेकिन mongod प्रक्रिया सिस्टम उपलब्ध स्मृति आप की संभावना ओएस बेकार डाटा पढ़ने के प्रभाव को देख रहे हैं दृष्टिकोण नहीं करता है के लिए निवासी स्मृति दोषयुक्त देखें।

6) चाबी के लिए मूल्यों में वृद्धि होगा- उपयोग करने के लिए प्रयास करें।

यह एक अनुकूलन (ObjectId आधारित अनुक्रमित के लिए) है कि जब सूचकांक ब्लॉक विभाजन यह 90/10 के बजाय 50/50 पर ऐसा करेंगे ट्रिगर किया जाएगा। नतीजा यह है कि आपके सूचकांक में अधिकांश ब्लॉक क्षमता के निकट होंगे और आपको उनमें से कम की आवश्यकता होगी।

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

रोब।