2016-10-12 4 views
1

다음에 따르면 : https://docs.mongodb.com/manual/administration/analyzing-mongodb-performance/#database-profiling, 각 복제본 세트는 다른 system.profile 콜렉션을 갖습니다. 내가 사용하는 복제 중 하나에서 system.profile 수집을 드롭하기 위해 노력하고있어 :mongodb 슬레이브에서 system.profile 콜렉션 삭제

> rs.slaveOk() 
> db.setProfilingLevel(0) 
> db.system.profile.drop() 
2016-10-12T06:42:29.187+0000 E QUERY [thread1] Error: drop failed: { "ok" : 0, "errmsg" : "not master", "code" : 10107 } : 
[email protected]/mongo/shell/utils.js:25:13 
[email protected]/mongo/shell/collection.js:739:1 
@(shell):1:1 

내가 여기에 문제가 있는지 모르겠습니다.

+0

'db.getProfilingStatus()'를 입력하면 어떻게 될까요? – Marco

+0

프로파일 링 상태를 쉽게 변경할 수 있습니다. 'db.setProfilingLevel (0)'은 프로파일 링 레벨을 0으로 설정합니다. – ignite

답변

0

는 잘 모르겠지만, 당신이 복제 세트의 보조 노드에 대한 몇 가지 일반적인 유지 보수 작업을 수행해야하는 경우, 문서를 살펴 갖는

  1. 당신은 차
  2. 를 중지해야합니다 다른 포트에서 독립형으로 차를 다시 시작
  3. 복제의 구성원
를 설정 당신이
  • 다시 시작 MongoDB를 필요로하는 작업을 수행

    보조 (link to documentation)에서 system.profile 컬렉션의 크기를 변경하는 데 필요한 단계이므로 같은 컬렉션을 삭제할 때 동일한 안내를 따라야한다고 가정합니다.

  • +0

    보조를 중지해야하는 이유는 무엇입니까? system.profile을 기본 노드에 쉽게 놓을 수 있습니다. 또한 system.profile은 capped 콜렉션이므로 문서를 삭제할 수도 없습니다. – ignite

    +0

    복제본 세트의 보조 노드에서 일반적인 유지 관리 작업을 수행하기 위해 문서에서 찾은 것이므로, 동일한 절차를 따라야하는'system.profile' 콜렉션을 삭제하고 다시 작성한다고 가정합니다. MongoDB를 개발하지 않았기 때문에 내 대답은 문서에서 본 내용을 기반으로합니다. 어쩌면, 보조 시스템 콜렉션이 어떻게 든 주 노드와 관련되어 있기 때문에, 뒤집기 변경을 방지하는 일종의 "보호"가 있어야합니다. – Marco

    2

    노드가 "기본"상태가 아니기 때문에 drop 명령이 실패합니다. 드롭 콜렉션 명령은 쓰기 연산입니다. 쓰기 조작은 1 차에서만 허용됩니다.

    "system.profile"컬렉션을 제거하는 가장 쉬운 방법은 컬렉션을 기본 노드에 놓는 것입니다. drop 명령은 다른 노드로 복제됩니다. 드롭 명령에 대한 항목은 oplog에서 볼 수있다 : 드롭 명령이 실행 된 때 프로파일 링의 결과 일 수 발생 될 수 있습니다

    $ db.oplog.rs.find() 
    .... 
    { "ts" : Timestamp(1477445036, 1), "h" : NumberLong("1583532073473005081"), "v" : 2, "op" : "c", "ns" : "stack.$cmd", "o" : { "drop" : "system.profile" } } 
    

    문제는 보조 노드에서 사용된다.

    당신이 드롭 명령이 실패하고 오류가 표시됩니다 프로파일을 사용하여 "system.profile"명령을 삭제하려고하면

    :

    $ db.system.profile.drop() 
    2016-10-25T18:28:43.030-0700 E QUERY Error: drop failed: { 
        "ns" : "stack.system.profile", 
        "nIndexesWas" : 0, 
        "ok" : 0, 
        "errmsg" : "turn off profiling before dropping system.profile collection", 
        "code" : 20 
    } 
        at Error (<anonymous>) 
        at DBCollection.drop (src/mongo/shell/collection.js:620:15) 
        at (shell):1:19 at src/mongo/shell/collection.js:620 
    

    프로파일 링 할 수 드롭 명령을 수 주에서 비활성화 할 수 있습니다 실행. 그러나 프로파일 링이 여전히 Secondary에서 활성화되어 있으면 drop 명령의 복제가 실패하고 콜렉션이 여전히 존재합니다. mongodb.log 파일에서 :

    2016-10-25T17:46:02.123-0700 W REPL  [repl writer worker 15] repl Failed command { drop: "system.profile" } on stack with status IllegalOperation turn off profiling before dropping system.profile collection during oplog application 
    

    컬렉션이 차에 존재하지 것이나 보조에 존재하는 것처럼이, 이상한 상태가 될 것입니다. 2w 노드에서 프로파일 링을 사용 불가능하게하고 명령을 다시 h 제하려고하면 콜렉션이 제거되지 않습니다. 존재하지 않는 콜렉션의 drop 명령은 본질적으로 oopog 항목을 작성하지 않고 복제되지 않는 no-op입니다.

    새로운 "system.profile"수집 한 후 삭제 될 수 있습니다 차에 생성하는 데 필요한 명령을 복제 할 수 있도록하고 다른 노드에서 떨어진 것 :

    2016-10-25T18:18:18.093-0700 I COMMAND [repl writer worker 15] CMD: drop stack.system.profile 
    

    문제의 노드가 주 노드입니까? 페일 오버를 시작하고 노드를 기본 상태로 승격하는 것이 좋습니다. 이렇게하면이 컬렉션을 제거하는 프로세스가 단순 해집니다.


    Marco 또한 정확합니다. 문제의 노드를 독립 실행 형 상태로 다시 시작하면 컬렉션을 제거 할 수도 있습니다. 그런 다음 노드를 다시 복제 세트에 다시 삽입 할 수 있습니다.

    +0

    db.getProfilingLevel()이 모든 노드에서 0을 반환하는지 확인했습니다. 그런 다음 기본 시스템에 새로운 system.profile 콜렉션을 작성했습니다. 그 후 나는 primary에서 system.profile 노드를 삭제했지만 그 변화는 2 차 노드로 전달되지 않았다. 어쨌든, 나는 각 노드가 하나씩 주 노드가되도록 강요하고 system.profile 콜렉션을 개별적으로 삭제함으로써이를 해결했다. – ignite

    +0

    드롭을 복제하지 못한 노드의 로그를 확인 했습니까? 컬렉션이 삭제되지 않은 이유에 대한 정보를 제공 할 수 있습니다. 검사 한 데이터베이스에서 프로파일 링이 비활성화되었지만 system.profile 콜렉션이 존재하는 데이터베이스에서 여전히 활성화되어있을 가능성이 있습니까? –

    +0

    예, 로그에 아무 것도 없습니다. 또한 다른 데이터베이스에서 프로파일 링을 사용할 수 있다고 생각하지 않습니다. – ignite

    관련 문제