2013-02-04 14 views
6

हम काम पर MongoDB 2.2.0 का उपयोग कर रहे हैं। डीबी में लगभग 51 जीबी डेटा (फिलहाल) है और मैं उस उपयोगकर्ता डेटा पर कुछ एनालिटिक्स करना चाहता हूं जिसे हमने अभी तक एकत्र किया है। समस्या यह है कि यह लाइव मशीन है और हम इस समय एक और दास बर्दाश्त नहीं कर सकते हैं। मुझे पता है कि मोंगोडीबी के पास एक रीड लॉक है जो विशेष रूप से जटिल प्रश्नों के साथ होने वाले किसी भी लेखन को प्रभावित कर सकता है। क्या मेरी (विशेष) क्वेरी को सबसे कम प्राथमिकता के साथ इलाज करने के लिए मोंगोडीबी को बताने का कोई तरीका है?लॉक के बिना mongodb से पढ़ें

+0

लेखन पढ़ सकते हैं लेकिन पढ़ना बहुत तेज़ है और इसकी गतिशीलता ऐसी है कि लिखने के लिए एक लिखने के प्रभाव के 1/1,000,000 मौके हैं। जेएस ताले और बुरे लेखन कार्यों के उपयोग की तरह अधिक प्रश्नों में समस्याएं आती हैं। मोंगो डीबी को प्राथमिकताओं के बारे में बताने के लिए, मुझे विश्वास नहीं है कि अभी तक एक विधि है – Sammaye

उत्तर

6

मोंगोडीबी में पढ़ता है और लिखता है एक-दूसरे को प्रभावित करता है। ताले को साझा किया जाता है, लेकिन लॉक को लॉक लिखने वाले लॉक को अधिग्रहण से पढ़ते हैं और निश्चित रूप से कोई अन्य पढ़ या लिखना नहीं होता है जबकि एक लिखना लॉक होता है। मोंगो डीबी ऑपरेशंस समय-समय पर उपज को अन्य धागे को भूखे होने से ताले के लिए इंतजार करते हैं। आप here के विवरण के बारे में अधिक पढ़ सकते हैं।

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

एक सुझाव जो मैं कर सकता हूं, पूरे डेटा सेट को स्कैन करने के बजाय विश्लेषिकी को चलाने के तरीके को समझने के दौरान (यानी सभी ऐतिहासिक डेटा पर एकत्रीकरण क्वेरी कर रहा है) कम समय स्लाइस पर छोटे समेकन प्रश्नों को चलाने का प्रयास करें। यह दो चीजें पूरा करेगा:

  1. पढ़ता है कि नौकरियां कम रहेंगी और इसलिए जल्दी खत्म हो जाएंगी, इससे आपको यह आकलन करने का मौका मिलेगा कि आपके "लाइव" प्रदर्शन पर प्रश्नों का क्या असर पड़ता है।
  2. आप सभी पुराने डेटा को एक साथ रैम में नहीं खींचेंगे - समय के साथ इन विश्लेषणात्मक प्रश्नों को दूर करके आप वर्तमान लिखने के प्रदर्शन पर असर को कम कर देंगे। यदि आप एक अल्पकालिक एडब्ल्यूएस उदाहरण है, जिसमें बहुत शक्तिशाली नहीं हो सकता है, लेकिन की एक प्रति के खिलाफ एक लंबी विश्लेषणात्मक क्वेरी चलाने के लिए उपलब्ध होगा हो रही पर विचार हो सकता -
यह क्या आप किसी अन्य सर्वर करने के बारे में खर्च नहीं उठा सकते है पर निर्भर करता है

आपका डेटा सेट बस इसे अपने डेटा की एक प्रति बनाते समय सावधान रहें - उत्पादन प्रणाली का पूर्ण सिंक बंद करने पर भारी भार आएगा (हालिया बैकअप/फ़ाइल स्नैपशॉट का उपयोग करने के लिए अधिक प्रभावी तरीका होगा)।

+0

आपके उत्तर के लिए धन्यवाद। मुझे लगता है कि टुकड़ा हिस्सा एक अच्छा विचार है। मैं उसे एक शॉट दूंगा। हमारे पास _id फ़ील्ड पर इंडेक्स हैं, उस पर आधारित टुकड़ा करने का सबसे अच्छा तरीका क्या है? मैं एक '.js' फ़ाइल लिखने की सोच रहा हूं जो स्लाइसिंग के लिए पैरामीटर स्वीकार करेगा और उसके बाद शेल स्क्रिप्ट या किसी चीज़ के माध्यम से ट्रिगर करेगा। अगर मैं गलत हूं तो मुझे सही करें, लेकिन मुझे लगता है कि मैन्गो में जावास्क्रिप्ट फ़ाइल चलाने का अनुमान है स्क्रिप्ट की पूरी अवधि के लिए लॉक बना देगा, इसलिए शैल स्क्रिप्ट जो जावास्क्रिप्ट को कॉल करती है। इस तरह से मैं एक शेल स्क्रिप्ट चला सकता हूं जो 100 बार मोंगो को कॉल करता है, प्रत्येक बार डेटा का 0% प्रोसेसिंग –

+0

जावास्क्रिप्ट फ़ाइल चलाने से कोई लॉक नहीं बनता है (यह केवल उस शैल को आमंत्रित करता है जो ताले नहीं लेता है)। मुझे लगता है कि जेएस फ़ाइल में वह वास्तविक क्वेरी होगी जिसमें आप चलाना चाहते हैं (श्रेणियों के लिए पैरामीटरकृत?) _ बाइट फ़ील्ड चार बाइट्स ऑब्जेक्ट आईडी मूल्य के निर्माण के डेटाटाइम का प्रतिनिधित्व करते हैं, इसलिए कोई अनुक्रमिक विभाजन काम करेगा। –

2

ऐसे ऑपरेशन प्रतिकृति सेट के दासों के लिए सबसे अच्छे हैं। एक बात के लिए, पढ़ने के लिए ताले को कई बार पढ़ने की अनुमति देने के लिए साझा किया जा सकता है, लेकिन ताले लिखने से ब्लॉक को अवरुद्ध कर दिया जाएगा। और, जब आप प्रश्नों को प्राथमिकता नहीं दे सकते हैं, तो mongodb लंबे समय तक पढ़ने/लिखने के प्रश्न उत्पन्न करता है। Their concurrency docs

यदि आप कोई अन्य सर्वर बर्दाश्त नहीं कर सकते हैं, तो आप एक ही मशीन पर दास सेट कर सकते हैं, बशर्ते आपके पास कुछ अतिरिक्त रैम/डिस्क हेडरूम हो, और आप दास हल्के/कभी-कभी उपयोग करते हैं। हालांकि आपको सावधान रहना चाहिए, आपकी डिस्क I/O महत्वपूर्ण रूप से बढ़ेगी।

+0

जबकि आपका अधिकांश अवलोकन सही है, ताले * डी * ब्लॉक लिखते हैं - एक रीड लॉक मौजूद होने पर एक लिखने का लॉक अधिग्रहित नहीं किया जा सकता है (अन्यथा पढ़ा नहीं जा सका सुसंगत होने की गारंटी दीजिए!) –

+0

@AyayaKamsky वह कहता है "पढ़े ताले लिखना ब्लॉक नहीं करते हैं" लेकिन वे नहीं करते हैं? मेरा मतलब है कि आप कैसे पढ़ सकते हैं, जैसा आपने कहा था, पढ़ने की स्थिरता। मुझे यकीन है कि अगर मुझे इस जवाब में मुझे निर्देशित करना बहुत अच्छा था – Sammaye

+0

@AyayaKamsky, मैं सही खड़ा हूं। – Adil

संबंधित मुद्दे