Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

rewriteCollection (데이터베이스 명령)

rewriteCollection

동일한 샤드 키 사용하여 샤딩된 컬렉션 디스크에 다시 씁니다.

샤드를 추가 또는 제거할 때 데이터를 재배포하거나 디스크 공간을 확보하려면 이 명령을 사용합니다.

진행 중인 컬렉션 다시 쓰기를 중지하려면 abortRewriteCollection 명령을 사용합니다.

버전 8.3에 추가 되었습니다.

이 명령은 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

참고

이 명령은 모든 MongoDB Atlas 클러스터에서 지원됩니다. 모든 명령에 대한 Atlas 지원에 관해 자세히 알아보려면 지원되지 않는 명령을 참조하십시오.

명령은 다음과 같은 구문을 가집니다:

db.adminCommand( {
rewriteCollection: "<database>.<collection>",
numInitialChunks: <int>,
zones: <zones>
} )

이 명령은 다음 필드를 사용합니다.

필드
유형
설명

rewriteCollection

문자열

필수입니다. 다시 쓸 데이터베이스 및 컬렉션 의 이름입니다.

numInitialChunks

integer

선택 사항. 컬렉션 을 리샤딩하는 데 사용할 초기 청크의 개수입니다. 기본값은 90입니다.

zones

배열

선택 사항. 샤드 키 의 구역을 지정하는 문서입니다.

컬렉션 다시 작성을 시작하기 전에 다음 요구 사항을 충족하는지 확인하세요.

  • 애플리케이션 은 영향을 받는 컬렉션 이 쓰기를 차단하는 2초의 기간을 허용할 수 있습니다. 쓰기가 차단되는 기간 동안 애플리케이션 의 지연 시간 이 증가합니다.

    워크로드가 이러한 요구 사항을 수용할 수 없는 경우에는 대신 샤드 키를 개선하는 것이 좋습니다.

  • 데이터베이스는 다음과 같은 리소스 요구 사항을 충족합니다.

    • 각 수신자 샤드 의 사용 가능한 저장 공간이 다시 쓰려는 컬렉션 의 저장 크기에 총 인덱스 크기를 더한 값을 샤드 수로 나눈 값의 두 배 이상이어야 합니다.

      ( ( collection_storage_size + index_size ) * 2 ) / shard_count = storage_req

      예시 를 들어, 저장 크기가 2 TB 데이터이고 인덱스 400 GB 인 컬렉션 생각해 보겠습니다. 4개의 샤드에 분산하려면 다음이 필요합니다.

      ( ( 2 TB collection + 0.4 TB index ) * 2 ) / 4 shards = 1.2 TB storage

      이 컬렉션 다시 작성하려면 각 샤드 1.2 TB의 사용 가능한 저장 필요합니다.

      MongoDB Atlas 에서는 다시 쓰기 작업을 위해 다음 저장 계층 으로 업그레이드 해야 할 수 있습니다. 작업이 완료되면 다운그레이드할 수 있습니다.

    • I/O 용량 이 50% 미만인지 확인합니다.

    • CPU 로드가 80% 미만인지 확인합니다.

    중요

    이러한 요구 사항은 데이터베이스에 의해 적용되지 않습니다. 충분한 리소스를 할당하지 못하면 다음과 같은 결과가 발생할 수 있습니다.

    • 데이터베이스 공간이 부족하여 종료되는 경우

    • 성능 저하

    • 작업이 예상보다 오래 걸리는 경우

    애플리케이션 에 트래픽이 적은 기간이 있는 경우 가능하면 해당 기간 동안 컬렉션 에 대해 이 작업을 수행합니다.

  • 리샤딩하기 전에 새 샤드 키 에 인덱스 생성할 필요가 없습니다. 리샤딩 작업은 인덱스 단계에서 필요한 인덱스를 자동으로 빌드합니다.

  • 진행 중인 인덱스 빌드가 없습니다. 실행 인덱스 빌드를 확인하려면 $currentOp을 사용합니다.

    db.getSiblingDB("admin").aggregate( [
    { $currentOp : { idleConnections: true } },
    { $match: {
    $or: [
    { "op": "command", "command.createIndexes": { $exists: true } },
    { "op": "none", "msg": /^Index Build/ }
    ]
    }
    }
    ] )

    결과 문서에서 inprog 필드 값이 빈 배열이면 진행 중인 인덱스 빌드는 없습니다.

    {
    inprog: [],
    ok: 1,
    '$clusterTime': { ... },
    operationTime: <timestamp>
    }

참고

다시 쓰기 작업은 쓰기 집약적인 프로세스 로, oplog 비율을 높일 수 있습니다. 다음을 수행할 수 있습니다.

  • 고정된 oplog 크기를 설정하여 무한한 oplog 증가를 방지합니다.

  • 하나 이상의 세컨더리 노드가 오래된 상태가 될 가능성을 최소화하기 위해 oplog 크기를 늘립니다.

자세한 내용은 복제본 세트 Oplog 문서를 참조하세요.

명령에는 클러스터 또는 다시 작성하려는 데이터베이스 및 컬렉션 rewriteCollection rewriteCollection 에 대한 권한 조치 필요합니다.

이 권한 조치 다음 역할을 가진 사용자도 사용할 수 있습니다.

컬렉션 다시 작성하려면 다음 명령을 실행 .

db.adminCommand( {
rewriteCollection: "sales.orders"
} )

돌아가기

reshardCollection

이 페이지의 내용