2010-04-08 7 views
27

MongoDB के प्रदर्शन हम MongoDB एक समस्या हमारे पास हल करने के लिए एक कोशिश देने का फैसला किया बारे में इतने सारे अच्छी बातें सुनने के बाद। मैंने कई mysql डेटाबेस में हमारे सभी रिकॉर्डों को मोंगोडब में एक संग्रह में ले जाकर शुरू किया। यह 29 लाख दस्तावेजों के साथ एक संग्रह में हुई (उनमें से हर एक कम से कम 20 क्षेत्रों है) जिसमें HD अंतरिक्ष के करीब 100 जीबी लेता है। हमने उन्हें सभी को एक संग्रह में रखने का फैसला किया क्योंकि सभी दस्तावेजों में एक ही संरचना है और हम उन सभी दस्तावेजों पर प्रश्न पूछना और एकत्र करना चाहते हैं।एकत्रीकरण पर MongoDB के प्रदर्शन प्रश्नों

मैं अन्यथा तक कि एक साधारण गिनती() उम्र ले जाएगा मेरी क्वेरी से मेल करने के लिए कुछ अनुक्रमित बनाया। हालांकि, अलग() और समूह() जैसे प्रश्न अभी भी बहुत लंबा रास्ता लेते हैं।

उदाहरण:

// creation of a compound index  
db.collection.ensureIndex({'metadata.system':1, 'metadata.company':1}) 

// query to get all the combinations companies and systems 
db.collection.group({key: { 'metadata.system':true, 'metadata.company':true }, reduce: function(obj,prev) {}, initial: {} }); 

मैं mongod लॉग पर एक नज़र लिया और इस तरह की लाइनों की एक बहुत है (जबकि इसके बाद के संस्करण क्वेरी को क्रियान्वित करने):

Thu Apr 8 14:40:05 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {} bytes:1048890 nreturned:417 154ms 
Thu Apr 8 14:40:08 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {} bytes:1050205 nreturned:414 430ms 
Thu Apr 8 14:40:18 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {} bytes:1049748 nreturned:201 130ms 
Thu Apr 8 14:40:27 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {} bytes:1051925 nreturned:221 118ms 
Thu Apr 8 14:40:30 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {} bytes:1053096 nreturned:250 164ms 
... 
Thu Apr 8 15:04:18 query database.$cmd ntoreturn:1 command reslen:4130 1475894ms 

इस क्वेरी 1475894ms ले लिया जो जो अपेक्षा करता है उससे अधिक लंबा रास्ता है (परिणाम सूची में लगभग 60 प्रविष्टियां हैं)। सबसे पहले, क्या यह मेरे संग्रह में बड़ी संख्या में दस्तावेजों को देखते हुए उम्मीद है? क्या आम तौर पर एकत्रीकरण प्रश्न मोंगोडब में इतनी धीमी होने की उम्मीद है? मैं प्रदर्शन में सुधार कैसे कर सकता हूं इस पर कोई विचार?

मैं एक सिंगल मशीन में दोहरी कोर और 10 जीबी मेमोरी वाला मोंगोड चला रहा हूं।

धन्यवाद।

+1

वैसे यह प्रश्न बहुत पुराना है और जब भी आप मोंगोडीबी एकत्रीकरण ढांचे की खोज करते हैं तो खोज इंजन पर आता है। मारियो आपने अपने मोंगोडीबी संस्करण का जिक्र नहीं किया, क्योंकि उन्होंने 2.4 में एएफ को बहुत सुधार किया और मैं इसे एक क्रैपी एम 1 पर कर रहा हूं। ECM के साथ संग्रह पर 3.7 जी मेमोरी के साथ ईसी 2 और यह जितना तेज़ होता है उतना तेज़ होता है। क्या आपने नए संस्करण की कोशिश की है या आप एक अलग दृष्टिकोण के साथ गए हैं? निश्चित रूप से एएफ बनाम मैपरेडस के लिए कई मानक हैं लेकिन 10 जीन http://blog.mongodb.org/post/62900213496/qaing-new-code-with-mms-map-reduce-vs से नवीनतम पर एक नज़र डालें -ग्रेलेशन टीएनएक्स – Maziyar

+0

आपकी टिप्पणी के लिए धन्यवाद। यह 2010 में वापस था, मुझे विश्वास है कि हम मोंगोडीबी 1.4.0 जैसे कुछ इस्तेमाल कर रहे थे। यह थोड़ी देर हो गया है, मुझे यकीन है कि मोंगोडब में बहुत सी चीजें बदल गई हैं लेकिन मैं उस परियोजना के बाद से उस परियोजना में काम नहीं कर रहा हूं :) –

+0

उत्तर के लिए धन्यवाद मारियो। मैंने अभी मोंगोडीबी (लगभग एक वर्ष) का उपयोग शुरू किया और बस यह देखने के लिए सोच रहा था कि आपकी परियोजना के साथ क्या हुआ। वैसे भी शुभकामनाएँ :) – Maziyar

उत्तर

22

विचार यह है कि आप कई मशीनों पर वितरित एक शापित डेटाबेस पर MapReduce का उपयोग करके एकत्रीकरण क्वेरी के प्रदर्शन में सुधार करते हैं।

मैंने उसी मशीन पर ओरेकल में समूह-दर-चयन कथन के साथ मोंगो के मैप्रेडस के प्रदर्शन की कुछ तुलना की। मुझे पता चला कि मोंगो लगभग 25 गुना धीमा था। इसका मतलब है कि मुझे मोंगो के साथ समान प्रदर्शन प्राप्त करने के लिए कम से कम 25 मशीनों पर डेटा को दाढ़ी करना है क्योंकि ओरेकल एक मशीन पर पहुंचाता है। मैंने लगभग 14 मिलियन दस्तावेज़/पंक्तियों के साथ एक संग्रह/तालिका का उपयोग किया।

mongoexport.exe के माध्यम से मोंगो से डेटा निर्यात करना और ओरेकल में बाहरी तालिका के रूप में निर्यात किए गए डेटा का उपयोग करना और ओरेकल में समूह-समूह करना मोंगो के अपने MapReduce का उपयोग करने से बहुत तेज था।

+0

यह जानना वास्तव में उपयोगी होगा कि मोंगोडीबी का कौन सा संस्करण है। – nilskp

+0

मुझे विश्वास है कि यह संस्करण 1.4.0 की तरह कुछ था। यह 2010 में वापस था। –

4

संगठना (नक्शा कम या अन्यथा) मोंगो में बहुत धीमा है क्योंकि यह जावास्क्रिप्ट वीएम द्वारा किया जाता है, न कि डेटाबेस इंजन। यह समय श्रृंखला डेटा के लिए इस (बहुत अच्छा, आईएमओ) डीबी की सीमा है।

+1

v2.2 से, समेकन पाइपलाइन [मूल संचालन] (http://docs.mongodb.org/manual/core/aggregation-introduction/#aggregation-pipelines) का उपयोग करता है। – Tamlyn

8

युगल बातें।

1) आपकी समूह क्वेरी डेटा डेटा संसाधित कर रही है। जबकि आपका परिणाम सेट छोटा है, ऐसा लगता है कि यह छोटा परिणाम उत्पन्न करने के लिए आपके संग्रह में मौजूद सभी डेटा का टेबल स्केल कर रहा है। यह शायद धीमेपन का मूल कारण है। इसे तेज करने के लिए, हो सकता है कि आप iostat के माध्यम से अपने सर्वर के डिस्क प्रदर्शन को देखना चाहें, जबकि क्वेरी चल रही है क्योंकि यह संभवतः बाधा है।

2) जैसा कि अन्य उत्तरों में बताया गया है, समूह कमांड जावास्क्रिप्ट दुभाषिया का उपयोग करता है, जो प्रदर्शन को सीमित करने जा रहा है। आप 2.1 में बीटा के रूप में जारी किए गए नए समेकन ढांचे का उपयोग करने का प्रयास कर सकते हैं (नोट: यह 24 फरवरी 2012 तक एक अस्थिर रिलीज है)। एक अच्छी शुरुआत के लिए http://blog.mongodb.org/post/16015854270/operations-in-the-new-aggregation-framework देखें।यह डेटा वॉल्यूम समस्या को (1) में नहीं हटाएगा, लेकिन इसे सी ++ में लागू किया गया है और यदि जावास्क्रिप्ट का समय बाधा है, तो यह बहुत तेज़ होना चाहिए।

3) एक और दृष्टिकोण आपके समूह के परिणामों के साथ दूसरा संग्रह उत्पन्न करने के लिए वृद्धिशील मानचित्र-कम का उपयोग करना होगा। विचार यह है कि आप एक बार अपने परिणामों को एक साथ बढ़ाने के लिए एक नक्शा-कम नौकरी चलाएंगे, और फिर समय-समय पर एक और नक्शा चलाएं-कम नौकरी जो मौजूदा संग्रह में नए डेटा को फिर से कम कर देता है। फिर आप हर बार समूह कमांड चलाने के बजाय अपने ऐप से इस दूसरे संग्रह से पूछ सकते हैं।