MongoDB에서 장기 실행 작업을 (안전하게) 어떻게 종료합니까?


11

때때로 작업이 MongoDB에서 제어되지 않고 수백 초 동안 실행되어 종료되거나 완료 될 때까지 성능에 영향을 줄 수 있습니다.

그런 일이 발생하면 나에게 도움이된다는 것을 알고 killOp()있지만 복제와 관련된 장기 실행 작업 (예 : 위험한)을 종료하지 않고 대상 장기 실행 작업 만 어떻게 종료합니까?

답변:


15

이것은 약간 까다로울 수 있지만 MongoDB 쉘은 기본적으로 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(따라서 수명이 긴 복제 작업에 관련된 데이터베이스입니다. 내부 if조건부에 기준을 추가하기가 상대적으로 쉽습니다) 특정 요구 사항에 따라 필요에 따라 작업을보다 정확하게 타겟팅합니다.

이 코드는 요점 으로도 제공됩니다 (지속적으로 업데이트하는 것을 기억할 것입니다).


이것에 대한 몇 가지 스크립트를 보았습니다. 그럼에도 불구하고 작업이 로컬 데이터베이스에 대해 실행 중인지 확인하는 것이 좋습니다.
joao

그래 - 그래서 나 자신에게 좋은 쉽게 연결 가능한 버전 줄 것이라고 생각 여러 번에서이 주어지고, 작전을 죽이는 매우 위험한 스크립트와 블로그 게시물을 본 한
아담 C

3
나는 이것이 복제 세트를 사용할 때 위험한 스크립트라고 생각합니다. 실행 db.currentOp()"(NS 일명 네임 스페이스 :" ")은"우리의 분산됩니다 데이터베이스를 반환 작업에 매우 긴의 내림차순으로 실행하는 "REPL 작가 노동자 N"(여기서 n은 정수). 죽일 수있는 쿼리를 사용하여 네임 스페이스를 실제 데이터베이스에 허용 목록에 추가하는 것이 좋습니다. 조건 && (['users', 'analytics'].indexOf(op.ns) != -1)대신에 뭔가 !op.ns.startsWith.
runamok

좋은 지적이며, 새로운 버전에서 빈 네임 스페이스가 더 자주 발생할 가능성이 있습니다. 원래 스크립트를 최신 상태로 유지하려고했지만 이제 MongoDB를 떠났으므로 두려워하지 않습니다. 여기에 답변으로 업데이트 된 코드 (이후 버전에 적용됨)를 제출하면 기꺼이 투표하겠습니다. :)
Adam C
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.