ฉันจะฆ่าการดำเนินการที่ใช้เวลานานใน MongoDB ได้อย่างปลอดภัยได้อย่างไร


11

การดำเนินการเป็นครั้งคราวจะออกจากการควบคุมใน MongoDB และอาจสิ้นสุดการทำงานเป็นเวลาหลายร้อยวินาทีและส่งผลกระทบต่อประสิทธิภาพจนกว่าจะถูกฆ่าหรือเสร็จสิ้น

เมื่อสิ่งนี้เกิดขึ้นฉันรู้ว่าฉันมีkillOp()ให้ แต่ฉันจะฆ่าเฉพาะการปฏิบัติการระยะยาวโดยไม่ฆ่า (ตัวอย่าง) การปฏิบัติการระยะยาวที่เกี่ยวข้องกับการจำลองแบบ (ซึ่งอาจเป็นอันตราย) ได้อย่างไร

คำตอบ:


15

นี่อาจเป็นเรื่องยุ่งยากเล็กน้อย แต่ความจริงที่ว่า MongoDB shell นั้นเป็นล่าม Javascript ทำให้เรามีตัวเลือกที่เหมาะสมในแง่ของการกรอง นี่คือฟังก์ชั่นที่ฉันใช้เพื่อทำให้สิ่งนี้สำเร็จ:

// 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ชีวิต (และด้วยเหตุนี้เป็นฐานข้อมูลที่มีส่วนเกี่ยวข้องในการทำงานนาน Ops จำลองแบบ. มันค่อนข้างง่ายที่จะเพิ่มเกณฑ์การภายในifเงื่อนไข ไปยังเป้าหมายการดำเนินงานที่แม่นยำยิ่งขึ้นตามความจำเป็นตามความต้องการเฉพาะ

รหัสนี้ยังมีอยู่ในส่วนสำคัญ (ที่ฉันจะจำเพื่อปรับปรุงอย่างต่อเนื่อง)


ฉันเคยเห็นหลายสคริปต์สำหรับอันนี้ อย่างไรก็ตามเพื่อตรวจสอบว่าการดำเนินการทำงานกับฐานข้อมูลท้องถิ่นเป็นการปรับปรุงที่ดี
joao

ใช่ - ฉันได้ให้สิ่งนี้มาหลายครั้งแล้วและเห็นโพสต์บล็อกด้วยสคริปต์ที่อันตรายมากสำหรับการฆ่า ops ดังนั้นคิดว่าฉันจะให้เวอร์ชั่นที่ดีและเชื่อมโยงได้ง่าย
Adam C

3
ฉันเชื่อว่านี่เป็นสคริปต์ที่อันตรายอย่างน้อยเมื่อใช้แบบจำลอง การรันdb.currentOp()บนฐานข้อมูลที่ถูกแบ่งของเราจะส่งคืนการดำเนินการใน "" namespace (aka ns: "") ที่ใช้เวลาในการรันนานมากโดยมี "ผู้เขียน repl ผู้ปฏิบัติงาน n" (โดยที่ n เป็นจำนวนเต็ม) ฉันอยากจะแนะนำรายการที่อนุญาตในเนมสเปซไปยังฐานข้อมูลจริงของคุณพร้อมกับแบบสอบถามที่คุณอาจต้องการฆ่า สิ่งที่ชอบ&& (['users', 'analytics'].indexOf(op.ns) != -1)แทน!op.ns.startsWithเงื่อนไข
runamok

จุดดีและเป็นไปได้ทั้งหมดว่าเนมสเปซเปล่านั้นเกิดขึ้นบ่อยครั้งในเวอร์ชันที่ใหม่กว่า - เดิมทีฉันตั้งใจจะให้สคริปต์เป็นปัจจุบัน แต่ตอนนี้ฉันออกจาก MongoDB แล้วดังนั้นฉันจึงไม่กลัว หากคุณส่งรหัสการอัปเดตของคุณ (มีหมายเหตุว่ามันใช้กับรุ่นต่อมา) ที่นี่เป็นคำตอบที่ผมมีความสุขที่จะออกเสียงลงคะแนนคุณขึ้น :)
อดัม C
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.