मैं (सुरक्षित रूप से) MongoDB में लंबे समय तक चलने वाले ऑपरेशनों को कैसे मारूं?


11

कभी-कभी ऑपरेशन MongoDB में नियंत्रण से बाहर हो जाते हैं और सैकड़ों सेकंड तक चलने लगते हैं, और प्रदर्शन को प्रभावित करते हैं जब तक कि वे मारे नहीं जाते या पूरा नहीं होते हैं।

जब ऐसा होता है, तो मुझे पता है कि मेरे पास killOp()उपलब्ध है, लेकिन मैं केवल लंबे समय तक चलने वाले ऑपरेशनों को भी कैसे मार सकता हूं (उदाहरण के लिए) लंबे समय तक चलने वाले ऑपरेशन प्रतिकृति में शामिल हैं (जो खतरनाक हो सकते हैं)?

जवाबों:


15

यह थोड़ा मुश्किल हो सकता है, लेकिन तथ्य यह है कि MongoDB खोल मूल रूप से एक जावास्क्रिप्ट दुभाषिया है जो हमें छानने के मामले में सभ्य विकल्प देता है। यहाँ इस कार्य को पूरा करने के लिए उपयोग किया जाता है:

// kills long running ops in MongoDB (taking seconds as an arg to define "long")
// attempts to be a bit safer than killing all by excluding replication related operations
// and only targeting queries as opposed to commands etc.
killLongRunningOps = function(maxSecsRunning) {
    currOp = db.currentOp();
    for (oper in currOp.inprog) {
        op = currOp.inprog[oper-0];
        if (op.secs_running > maxSecsRunning && op.op == "query" && !op.ns.startsWith("local")) {
            print("Killing opId: " + op.opid
            + " running over for secs: "
            + op.secs_running);
            db.killOp(op.opid);
        }
    }
};

यह maxSecsRunningथ्रेशोल्ड के ऊपर के प्रश्नों को केवल मार देगा और localडेटाबेस के खिलाफ चलने वाली किसी भी चीज़ को नहीं छूएगा , जहाँ oplogजीवन है (और इसलिए वह डेटाबेस है जो लंबे समय तक चलने वाले ऑप्सन ऑप्स में शामिल है। आंतरिक ifसशर्त मानदंड को जोड़ना अपेक्षाकृत आसान है। विशिष्ट आवश्यकताओं के आधार पर आवश्यकतानुसार अधिक सटीक लक्ष्य संचालन।

कोड एक जिस्ट के रूप में भी उपलब्ध है (जहां मैं इसे निरंतर आधार पर अपडेट करना याद रखूंगा)।


मैंने इसके लिए कई स्क्रिप्ट देखी हैं। फिर भी, यह जांचने के लिए कि क्या ऑपरेशन स्थानीय डेटाबेस के विरुद्ध चल रहा है, एक अच्छा सुधार है।
जोओ

हाँ - मैंने इसे कई बार दिया है, और एक ब्लॉग पोस्ट देखी जिसमें ऑप्स को मारने के लिए एक बहुत खतरनाक स्क्रिप्ट है, इसलिए मैंने सोचा कि मैं खुद को एक अच्छा और आसानी से लिंक करने योग्य संस्करण दूंगा
एडम सी

3
मेरा मानना ​​है कि यह कम से कम प्रतिकृतियों का उपयोग करते समय एक खतरनाक स्क्रिप्ट है। db.currentOp()हमारे शार्प किए गए डेटाबेस पर चल रहा है "" नामस्थान (उर्फ ns: "") में संचालन जो "उत्तर लेखक कार्यकर्ता n" (जहाँ n एक पूर्णांक है) के अवरोह के साथ बहुत लंबे समय से चल रहा है। मैं आपके वास्तविक डेटाबेस में उन नामस्थानों को श्वेतसूची में रखने का सुझाव दूंगा, जिन्हें आप मारना चाहते हैं। हालत के && (['users', 'analytics'].indexOf(op.ns) != -1)बदले कुछ ऐसा !op.ns.startsWith
रनमोक

अच्छी बात है, और यह पूरी तरह से संभव है कि रिक्त नाम स्थान नए संस्करणों में अधिक बार होता है - मैं मूल रूप से स्क्रिप्ट को अद्यतित रखने का इरादा रखता था, लेकिन मैंने अब MongoDB छोड़ दिया है, इसलिए यह संभावना नहीं है कि मैं डरता हूं। यदि आप अपना अपडेटेड कोड जमा करते हैं (नोट के साथ कि यह बाद के संस्करणों पर लागू होता है) तो यहां एक उत्तर के रूप में मैं खुशी से आपको वोट दूंगा :)
एडम सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.