정의
rewriteCollection동일한 샤드 키 사용하여 샤딩된 컬렉션 디스크에 다시 씁니다.
샤드를 추가 또는 제거할 때 데이터를 재배포하거나 디스크 공간을 확보하려면 이 명령을 사용합니다.
진행 중인 컬렉션 다시 쓰기를 중지하려면
abortRewriteCollection명령을 사용합니다.버전 8.3에 추가 되었습니다.
호환성
이 명령은 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
참고
이 명령은 모든 MongoDB Atlas 클러스터에서 지원됩니다. 모든 명령에 대한 Atlas 지원에 관해 자세히 알아보려면 지원되지 않는 명령을 참조하십시오.
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
명령은 다음과 같은 구문을 가집니다:
db.adminCommand( { rewriteCollection: "<database>.<collection>", numInitialChunks: <int>, zones: <zones> } )
명령 필드
이 명령은 다음 필드를 사용합니다.
필드 | 유형 | 설명 |
|---|---|---|
| 문자열 | 필수입니다. 다시 쓸 데이터베이스 및 컬렉션 의 이름입니다. |
| integer | 선택 사항. 컬렉션 을 리샤딩하는 데 사용할 초기 청크의 개수입니다. 기본값은 90입니다. |
| 배열 | 선택 사항. 샤드 키 의 구역을 지정하는 문서입니다. |
고려 사항
컬렉션 다시 작성을 시작하기 전에 다음 요구 사항을 충족하는지 확인하세요.
애플리케이션 은 영향을 받는 컬렉션 이 쓰기를 차단하는 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 문서를 참조하세요.
재작성 제한
컬렉션 Atlas Search 를 사용하는 경우 작업이 완료된 후 검색 인덱스 사용할 수 없게 됩니다. 복원 하려면 검색 인덱스 수동으로 다시 작성합니다.
Queryable Encryption 사용하는 컬렉션은 지원되지 않습니다.
액세스 제어
명령에는 클러스터 또는 다시 작성하려는 데이터베이스 및 컬렉션 rewriteCollection rewriteCollection 에 대한 권한 조치 필요합니다.
이 권한 조치 다음 역할을 가진 사용자도 사용할 수 있습니다.
예시
컬렉션 다시 작성하려면 다음 명령을 실행 .
db.adminCommand( { rewriteCollection: "sales.orders" } )