컬렉션 이동
MongoDB 8.0 부터는 moveCollection
명령을 사용하여 샤딩되지 않은 컬렉션 을 다른 샤드 로 이동할 수 있습니다.
이 작업에 대하여
moveCollection
샤딩된 클러스터에서만 실행 수 있습니다.moveCollection
는 샤딩되지 않은 컬렉션만 이동할 수 있습니다.moveCollection
한 번에 하나의 컬렉션 만 이동할 수 있습니다.moveCollection
최소 지속 시간은 5 분입니다.moveCollection
실행 후 Atlas Search 인덱스를 다시 작성해야 합니다.moveCollection
가 완료될 때까지 샤드 추가 또는 제거 또는 임베디드 구성 서버와 전용 구성 서버 간의 전환과 같은 토폴로지 변경을 수행할 수 없습니다.moveCollection
이(가) 진행 중인 동안에는 이동 중인 컬렉션 에 대해 다음 작업을 실행 수 없습니다.moveCollection
이(가) 진행 중인 동안에는 클러스터 에 대해 다음 작업을 실행 수 없습니다.moveCollection
이(가) 진행 중인 동안 발생하는 인덱스 빌드는 자동으로 실패할 수 있습니다.moveCollection
이(가) 진행되는 동안에는 인덱스를 생성하지 마세요.진행 중인 인덱스 빌드가 있는 경우
moveCollection
를 호출하지 마세요.
액세스 제어
배포서버 에 액세스 제어 가 활성화되어 있는 경우 enableSharding
역할 은 moveCollection
명령을 실행 수 있는 액세스 을 부여합니다.
시작하기 전에
컬렉션 을 이동하기 전에 다음 요구 사항을 충족하는지 확인하세요.
애플리케이션 은 영향을 받는 컬렉션 이 쓰기를 차단하는 2초의 기간을 허용할 수 있습니다. 쓰기가 차단되는 기간 동안 애플리케이션 의 지연 시간 이 증가합니다.
데이터베이스는 다음과 같은 리소스 요구 사항을 충족합니다.
컬렉션 을 이동하려는 샤드 에 컬렉션 및 해당 인덱스를 위한 충분한 저장 공간이 있는지 확인합니다. 대상 샤드 에는 최소
( Collection storage size + Index Size ) * 2
바이트의 사용 가능한 공간이 필요합니다.I/O 용량 이 50% 미만인지 확인합니다.
CPU 로드가 80% 미만인지 확인합니다.
중요
이러한 요구 사항은 데이터베이스에 의해 적용되지 않습니다. 충분한 리소스를 할당하지 못하면 다음과 같은 결과가 발생할 수 있습니다.
데이터베이스 공간이 부족하여 종료되는 경우
성능 저하
작업이 예상보다 오래 걸리는 경우
애플리케이션 에 트래픽이 적은 기간이 있는 경우 가능하면 해당 기간 동안 컬렉션 에 대해 이 작업을 수행합니다.
단계
컬렉션 을 이동합니다.
app
데이터베이스 의 inventory
이라는 샤딩되지 않은 컬렉션 을 shard02
샤드 로 이동하려면 moveCollection
를 실행 .
db.adminCommand( { moveCollection: "app.inventory", toShard: "shard02" } )
사용 가능한 샤드 ID 목록을 가져오려면 sh.status()
를 실행 합니다. 자세한 내용은 sh.status() 출력을 참조하세요.
moveCollection 작업의 진행 상황을 모니터링합니다.
남은 시간을 모니터링합니다.
moveCollection
작업에 남은 시간을 모니터 하려면$currentOp
파이프라인 단계를 사용합니다.이 예시 에서는
app.inventory
컬렉션 에서moveCollection
의 진행 상황을 확인하는 방법을 보여 줍니다.db.getSiblingDB("admin").aggregate( [ { $currentOp: { allUsers: true, localOps: false } }, { $match: { type: "op", "originatingCommand.reshardCollection": "app.inventory" } } ] ) 참고
업데이트된 값을 확인하려면 이전 파이프라인을 계속 실행해야 합니다.
$currentOp
파이프라인은 다음을 출력합니다.totalOperationTimeElapsedSecs
: 경과된 작업 시간(초)remainingOperationTimeEstimatedSecs
: 현재moveCollection
작업에 남은 예상 시간(초)입니다. 새moveCollection
작업이 시작되면-1
으)로 반환됩니다.
참고
remainingOperationTimeEstimatedSecs
비관치 추정으로 설정됩니다.- 따라잡기 단계 시간 추정치는 복제 단계 시간으로 설정하다 되며,
- 시간이 비교적 오래 걸립니다.
- 실제로 보류 중인 쓰기 (write) 작업이 몇 개만 있는 경우
- 실제 따라잡기 단계 시간은 상대적으로 짧습니다.
이 파이프라인 단계의 출력은 다음과 유사합니다.
[ { shard: '<shard>', type: 'op', desc: 'ReshardingRecipientService | ReshardingDonorService | ReshardingCoordinatorService <reshardingUUID>', op: 'command', ns: '<database>.<collection>', originatingCommand: { reshardCollection: '<database>.<collection>', key: <shardkey>, unique: <boolean>, collation: { locale: 'simple' } }, totalOperationTimeElapsedSecs: <number>, remainingOperationTimeEstimatedSecs: <number>, ... }, ... ] 전송된 바이트 수를 모니터링합니다.
전송된 바이트 수를 모니터 하려면
shardingStatistics.resharding.active.bytesCopied
를 사용하고 컬렉션 의 바이트 수와 비교합니다.
컬렉션 이 이동되었는지 확인합니다.
컬렉션 이 예상 샤드 로 이동되었는지 확인하려면 $collStats
파이프라인 단계를 사용합니다.
이 예시 에서는 예상 샤드 에 app.inventory
컬렉션 이 있는지 확인하는 방법을 보여 줍니다.
db.inventory.aggregate( [ { $collStats: {} }, { $project: { "shard": 1 } } ] )
이 파이프라인 단계의 출력은 다음과 유사합니다.
[ { shard: 'shard02' } ]