2013-03-10 7 views
5

मुझे तीन मोंगोड सर्वर (16 जीबी रैम प्रत्येक, कम से कम 4 सीपीयू कोर और असली एचडीडी) और एक समर्पित आर्बिटर का एक छोटा प्रतिकृति सेट मिला है। प्रतिकृति डेटा में वर्तमान में लगभग 100,000,000 रिकॉर्ड हैं। लगभग सभी डेटा एक संग्रह में _id (ऑटो-जनरेटेड मोंगो आईडी) और date पर एक इंडेक्स के साथ एक संग्रह में है, जो मूल मोंगो दिनांक फ़ील्ड है। समय-समय पर मैं तारीख सूचकांक, कुछ इस तरह (मोंगो खोल से) का उपयोग कर इस संग्रह से पुराने रिकॉर्ड को हटा दें:मोंगोडीबी बहुत धीमी गति से हटा देता है

db.repo.remove({"date" : {"$lt" : new Date(1362096000000)}}) 

यह काम करता है, लेकिन यह बहुत, बहुत धीमे चलता है। मेरे नोड्स में से एक के पास दो अन्य की तुलना में धीमी I/O है, जिसमें केवल एक ही सैटा ड्राइव है। जब यह नोड प्राथमिक होता है, तो हटाए गए लगभग 5-10 दस्तावेज़/सेकेंड पर चलते हैं। Rs.stepDown() का उपयोग करके मैंने इस धीमी प्राथमिक को निषेध किया है और बेहतर I/O के साथ प्राथमिक प्राप्त करने के लिए एक चुनाव को मजबूर किया है। उस सर्वर पर, मुझे लगभग 100 दस्तावेज़/सेकंड मिल रहे हैं।

मेरा मुख्य प्रश्न है, क्या मुझे चिंतित होना चाहिए? मेरे पास प्रतिकृति पेश करने से पहले संख्याएं नहीं हैं, लेकिन मुझे पता है कि डिलीट बहुत तेज था। मैं सोच रहा हूं कि प्रतिकृति सेट सिंक I/O प्रतीक्षा कर रहा है, या यदि कोई अन्य कारण है। डिलीट कथन समाप्त होने तक मैं अस्थायी रूप से सिंक और इंडेक्स अपडेट अक्षम करने से पूरी तरह से खुश हूं, लेकिन मुझे वर्तमान में ऐसा करने के किसी भी तरीके से नहीं पता है। किसी कारण से, जब मैं तीन नोड्स में से दो को अक्षम करता हूं, केवल एक नोड और आर्बिटर छोड़कर, शेष नोड डिमोट किया जाता है और लिखना असंभव होता है (क्या इसे हल करने के लिए मध्यस्थ नहीं है?)।

यदि आप दिनांक सूचकांक को छोड़ते और फिर से बनाते हैं, तो सामान्य प्रदर्शन का कुछ संकेत देने के लिए, सभी 100 एम दस्तावेज़ों को स्कैन करने में लगभग 15 मिनट लगते हैं। इस क्वेरी संतुष्ट के रूप में कई -

+0

कारण आप अपने चार नोड्स को अक्षम नहीं कर सकते हैं यह है कि उपलब्ध अधिकांश सेट के बिना प्राथमिक नहीं हो सकता है। आपके पास चार सदस्य क्यों हैं? आपको एक प्रतिकृति सेट में तीन नोड्स के साथ एक मध्यस्थ की आवश्यकता नहीं है। –

+0

गोटा - इस समय मेरे पास केवल चार नोड्स हैं क्योंकि 5 वें नोड में हार्ड ड्राइव गुम है और मैंने इसे क्लस्टर से हटा दिया :) विडंबना यह है कि, मैं एक मास्टर चुनाव में हमेशा विजेता होने की गारंटी देने के लिए एक मध्यस्थ लाया। वैसे भी, arbiter एक छोटा वीएम है जिसे मैं अन्य कम ओवरहेड सामानों के लिए भी उपयोग करता हूं जैसे अन्य शेडिंग क्लस्टर में कॉन्फ़िगर सर्वर। – SteveK

+0

जब आपको चार नोड्स (पांच वोट प्राप्त करने के लिए) था तो आपको एक आर्बिटर की आवश्यकता होती थी, लेकिन जब आप प्रतिकृति सेट से पांचवें नोड को हटाते हैं तो आपको आर्बिटर को भी हटा देना चाहिए, ताकि आपके पास तीन सदस्य शेष रहें। –

उत्तर

7

इसका कारण यह है, भले ही

db.repo.remove({"date" : {"$lt" : new Date(1362096000000)}}) 

एक भी आदेश यह वास्तव में कई दस्तावेजों पर काम कर रहा है की तरह लग रहा हो रहा है।

जब आप प्रतिकृति का उपयोग करते हैं, तो प्रत्येक परिवर्तन ऑपरेशन local डेटाबेस में oplog.rs - संक्षिप्त के लिए ओप्लॉग नामक एक विशेष संग्रह में लिखा जाना चाहिए।

ओप्लोग में प्रत्येक हटाए गए दस्तावेज़ के लिए एक प्रविष्टि होनी चाहिए और उन सभी प्रविष्टियों को प्रत्येक माध्यमिक पर ओप्लॉग पर लागू करने की आवश्यकता है इससे पहले कि यह एक ही रिकॉर्ड को हटा सके।

एक बात मैं सुझाव दे सकता हूं कि आप TTL indexes पर विचार करें - वे आपके द्वारा निर्धारित समाप्ति दिनांक/मूल्य के आधार पर दस्तावेज़ों को स्वचालित रूप से हटा देंगे - इस तरह आपके पास एक बड़े पैमाने पर डिलीट नहीं होगा और इसके बजाय लोड फैलाने में सक्षम होंगे समय के साथ अधिक।

+0

स्पष्टीकरण के लिए धन्यवाद, यह बहुत समझ में आता है। मुझे टीटीएल इंडेक्स के बारे में भी पता नहीं था - एक शानदार सुविधा की तरह दिखता है! – SteveK

+0

मुझे यकीन नहीं है कि यह समाधान सटीक है। मोंडो डॉक्स में https://docs.mongodb.org/manual/core/index-ttl/ पर यह कहता है, "प्रतिकृति सेट पर, टीटीएल पृष्ठभूमि धागा केवल प्राथमिक पर दस्तावेज़ हटा देता है। हालांकि, टीटीएल पृष्ठभूमि धागा चलाता है सेकेंडरी पर। माध्यमिक सदस्य प्राथमिक से हटाने के संचालन को दोहराते हैं। " इसका मतलब यह नहीं होगा कि मैन्युअल ऑपरेशन की तुलना में टीटीएल के साथ ओप्लॉग प्रदर्शन में कोई अंतर नहीं है? – Nucleon

+0

अंतर यह है कि टीटीएल थ्रेड प्रत्येक मिनट को हटाने के लिए दस्तावेजों की तलाश में चलता है। इस मामले में उपयोगकर्ता एक बार में उन्हें हटाने के लिए एक विशाल विशाल हटा रहा था। टीटीएल सिर्फ लंबी अवधि में हटा देता है ताकि आप हर मिनट छोटे टुकड़े कर रहे हों। यह माना जा रहा है कि समाप्ति उस क्षेत्र पर है जो "मिनट में" सटीक है। –

1

एक और सुझाव है कि आप फिट नहीं है, लेकिन यह मेरे लिए इष्टतम समाधान था: संग्रह से

  1. ड्रॉप indeces
  2. अभिलेखों का संग्रह और स्टोर आईडी के सभी प्रविष्टियों को स्मृति सरणी में नष्ट करने के लिए खत्म हो गया
  3. पुनरावृति
  4. हर बार (मेरे लिए यह 10K रिकॉर्ड किया गया था) सरणी काफी बड़ा है, मैं आईडी द्वारा इन रिकॉर्ड को हटा दिया
  5. indeces
पुनर्निर्माण

यह सबसे तेज़ तरीका है, लेकिन इसे सिस्टम को रोकने की आवश्यकता है, जो मेरे लिए उपयुक्त था।

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