MongoDB में निर्मित इंडेक्स आपके MongoDB क्लस्टर की उपलब्धता पर प्रतिकूल प्रभाव डाल सकता है। यदि आप अपने उत्पादन सर्वर पर बड़े संग्रह पर अग्रभूमि अनुक्रमणिका निर्माण को ट्रिगर करते हैं, तो आप पाएंगे कि अनुक्रमणिका निर्माण पूर्ण होने तक आपका क्लस्टर अनुत्तरदायी है। बड़े संग्रह पर, इसमें कई घंटे या दिन लग सकते हैं, जैसा कि MongoDB में इंडेक्स बिल्डिंग के खतरों में वर्णित है।
अनुशंसित सर्वोत्तम अभ्यास पृष्ठभूमि में इंडेक्स बिल्ड को ट्रिगर करना है, हालांकि, बड़े संग्रह इंडेक्स पर, हमने इस दृष्टिकोण के साथ कई समस्याएं देखी हैं। तीन नोड क्लस्टर के मामले में, दोनों सेकेंडरी इंडेक्स बनाना शुरू करते हैं और किसी भी अनुरोध का जवाब देना बंद कर देते हैं। नतीजतन, प्राइमरी में कोरम नहीं होता है और यह आपके क्लस्टर को नीचे ले जाकर सेकेंडरी अवस्था में चला जाता है। साथ ही, कमांड लाइन से ट्रिगर किए गए डिफ़ॉल्ट इंडेक्स बिल्ड अग्रभूमि इंडेक्स बिल्ड हैं - यह अब एक व्यापक समस्या है। भविष्य की रिलीज़ में, हमें उम्मीद है कि यह डिफ़ॉल्ट रूप से पृष्ठभूमि बन जाएगी।
एक बार जब आप एक इंडेक्स को ट्रिगर कर देते हैं, तो बस सर्वर को रीस्टार्ट करने से हमारी समस्या का समाधान नहीं होता है; MongoDB इंडेक्स बिल्ड को वहीं से उठाएगा जहां से उसने छोड़ा था। अगर आप बैकग्राउंड इंडेक्स बिल्ड को रीस्टार्ट करने के बाद पहले चला रहे थे, तो अब यह फ़ोरग्राउंड इंडेक्स बिल्ड बन जाता है, इसलिए इस मामले में, रीस्टार्ट समस्या को और खराब कर सकता है।
यदि आप पहले से ही एक इंडेक्स बिल्ड को ट्रिगर कर चुके हैं, तो आप इसे कैसे रोकेंगे? सौभाग्य से, अनुक्रमणिका निर्माण को रोकना अपेक्षाकृत आसान है।
विकल्प 1:अनुक्रमणिका निर्माण प्रक्रिया को समाप्त करें
db.currentOp() का उपयोग करके अनुक्रमणिका निर्माण प्रक्रिया का पता लगाएँ और फिर db.killOp(
{ "opid" : 820659355, "active" : true, "lockType" : "write", .... "op" : "insert", "ns" : "xxxx", "query" : { }, "client" : "xxxx", "desc" : "conn", "msg" : "index: (2/3) btree bottom up 292168587/398486401 64%" }
यदि नोड जहां इंडेक्स बन रहा है, नए कनेक्शन का जवाब नहीं देता है, या किलऑप काम नहीं करता है, तो नीचे विकल्प 2 का उपयोग करें:
विकल्प 2:“noIndexBuildRetry” को कॉन्फ़िगर करना और फिर से शुरू करना
MongoDB एक “–noIndexBuildRetry” विकल्प प्रदान करता है जो MongoDB को पुनरारंभ होने पर अपूर्ण अनुक्रमणिका बनाने से रोकने का निर्देश देता है।
ऐसा लगता है कि यह पैरामीटर कॉन्फ़िगरेशन फ़ाइल से समर्थित नहीं है, केवल mongod प्रक्रिया के पैरामीटर के रूप में। हम इस विकल्प के साथ मैन्युअल रूप से mongod चलाना पसंद नहीं करते हैं क्योंकि यदि आप गलती से mongod प्रक्रिया को एक उन्नत उपयोगकर्ता (जैसे रूट) के रूप में चलाते हैं, तो यह सभी फ़ाइलों की अनुमतियों को बदल देता है। इसके अलावा, एक बार "रूट" के रूप में चलाने के बाद, हमें प्रक्रिया को फिर से मोंगोड के रूप में चलाने में आंतरायिक समस्याएं होती हैं।
एक आसान विकल्प /etc/init.d/mongod फ़ाइल को संपादित करना है। इस लाइन की तलाश है:
OPTIONS=" -f $CONFIGFILE"
इस लाइन से बदलें:
OPTIONS=" -f $CONFIGFILE --noIndexBuildRetry"
विस्तृत चरण
इस चर्चा के प्रयोजनों के लिए, हम CentOS/RedHat/Amazon Linux के लिए निर्देश प्रदान कर रहे हैं।
-
कॉन्फ़िगर करें "–noIndexBuildRetry"
जैसा कि ऊपर बताया गया है, अपने सभी डेटा नोड्स में “–noIndexBuildRetry” विकल्प जोड़ें।
-
इंडेक्स बनाने वाले सभी नोड्स को रीस्टार्ट करें
प्रत्येक डेटा सर्वर के लिए mongod लॉग फ़ाइल को देखें और निर्धारित करें कि क्या यह अनुक्रमणिका का निर्माण कर रहा है। यदि ऐसा है, तो सर्वर को पुनरारंभ करें "सेवा mongod पुनरारंभ करें"।
-
अपूर्ण अनुक्रमणिका छोड़ें
एक बार सभी संबंधित नोड्स के पुनरारंभ होने के बाद, अनुक्रमणिका की सूची देखें और यदि आप सूची में अपूर्ण अनुक्रमणिका देखते हैं तो उसे छोड़ दें।
-
“–noIndexBuildRetry” हटाएं
आपके द्वारा चरण 1 में जोड़े गए –noIndexBuildRetry विकल्प को हटाने के लिए /etc/init.d/mongod फ़ाइल को संपादित करें ताकि हम इंडेक्स बिल्ड को फिर से शुरू करने के डिफ़ॉल्ट व्यवहार पर वापस लौट सकें।
किसी और प्रश्न के लिए, [email protected] पर हमसे संपर्क करें।
हैप्पी इंडेक्सिंग!