샤드 추가 및 제거를 위한 리샤딩
이 작업에 대하여
리샤딩을 사용하여 샤딩된 컬렉션을 새 샤드에 배포할 수 있습니다. 이를 사용하여 청크 마이그레이션보다 빠르게 샤드를 제거 수도 있습니다.
리샤딩 작업은 다음 단계를 순서대로 수행합니다.
복제 단계에서는 현재 수집 데이터를 복제합니다.
인덱스 구축 단계에서는 리샤딩된 컬렉션 에 인덱스를 구축합니다.
따라잡기 단계에서는 보류 중인 모든 쓰기 작업을 리샤딩된 컬렉션에 적용합니다.
커밋 단계에서는 임시 컬렉션 이름을 바꾸고 이전 컬렉션 삭제하여 전환을 수행합니다.
시작하기 전에
리샤딩하기 전에 클러스터의 스토리지 요구 사항, 지연 시간 요구 사항 및 추가 리소스 요구 사항을 계산해야 합니다.
스토리지 요구 사항
이 공식을 사용하여 최소 oplog window 24 시간이라고 가정하고 컬렉션 크기와 인덱스 크기를 추가하여 리샤딩 작업에 필요한 저장 공간을 계산합니다.
Available storage required on each shard = [(collection size + index size) *2 ] / number of shards the collection will be distributed across.
예시 들어 4 샤드에 분산된 2TB 컬렉션 과 400GB 인덱스에는 샤드 당 최소 1.2TB의 사용 가능한 저장 필요합니다.
[ (2 TB + 400GB) * 2 ] / 4 shards = 1.2 TB / shard
클러스터 에 사용 가능한 저장 공간이 있는지 확인해야 합니다.
공간이 부족하거나 사용 가능한 I/O 헤드룸이 있는 경우 저장 크기를 늘려야 합니다. CPU 헤드룸이 충분하지 않은 경우 더 높은 인스턴스 크기를 선택하여 클러스터 확장하다 해야 합니다.
팁
MongoDB cluster Atlas 에서 호스팅되는 경우, Atlas UI 사용하여 저장, CPU 및 I/O 헤드룸 지표 검토 수 있습니다.
지연 시간 요구 사항
애플리케이션 리샤딩되는 컬렉션 컬렉션 쓰기를 차단하는 2초를 허용할 수 있는지 확인해야 합니다. 쓰기가 차단되면 애플리케이션 지연 시간 증가합니다. 워크로드 이 요구 사항을 수용할 수 없는 경우 청크 마이그레이션을 사용하여 클러스터 의 균형을 맞추세요.
추가 리소스 요구 사항
클러스터 는 다음과 같은 추가 요구 사항을 충족해야 합니다.
최소 24 시간의 oplog window .
I/O 용량 50% 미만입니다.
CPU 로드가 80% 미만입니다.
단계
클러스터 에 샤드를 추가하거나 제거 .
클러스터에 샤드를 추가하려면 클러스터에 샤드 추가를 참조하세요. 클러스터에서 샤드를 제거하려면 샤드 클러스터에서 샤드 제거를 참조하세요.
샤딩된 컬렉션을 한 번에 하나씩 동일한 샤드 키 리샤딩합니다.
reshardCollection
명령을 forceRedistribution
옵션과 함께 사용하여 클러스터 전체에 데이터를 재배포합니다.
db.adminCommand( { reshardCollection: "<db>.<collection>", key: { "<shardkey>" }, forceRedistribution: true } )
forceRedistribution: true
을(를) 사용하여 리샤딩하면 배출 상태 아닌 클러스터 의 모든 샤드에 걸쳐 데이터를 다시 씁니다. 기본값 으로 리샤딩은 numInitialChunks: 90
을(를) 사용합니다. 리샤딩은 클러스터 에 최소 numInitialChunks - 1
개의 청크를 생성합니다. 90 개보다 많은 샤드가 있는 경우 reshardCollection
명령에 더 많은 수의 numInitialChunks
를 지정합니다.
리샤딩 작업을 모니터링합니다.
리샤딩 작업을 모니터링하려면 $currentOp
파이프라인 단계를 사용할 수 있습니다.
db.getSiblingDB("admin").aggregate( [ { $currentOp: { allUsers: true, localOps: false } }, { $match: { type: "op", "originatingCommand.reshardCollection": "<database>.<collection>" } } ] )
참고
업데이트된 값을 보려면 파이프라인 지속적으로 실행 해야 합니다.
$currentOp
파이프라인은 다음을 출력합니다.
totalOperationTimeElapsedSecs
: 경과된 작업 시간(초)remainingOperationTimeEstimatedSecs
: 현재 리샤딩 작업에 남은 예상 시간(초)입니다. 새로운 리샤딩 작업이 시작되면-1
로 반환됩니다.MongoDB 7.0부터 리샤딩 작업 중에 코디네이터에서
remainingOperationTimeEstimatedSecs
를 사용할 수도 있습니다.remainingOperationTimeEstimatedSecs
비관치 추정으로 설정됩니다.따라잡기 단계 시간 추정은 상대적으로 긴 시간인 클론 단계 시간으로 설정됩니다.
실제로 보류 중인 쓰기 작업이 적은 경우 실제 따라잡기 단계 시간은 상대적으로 짧습니다.
[ { 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>, ... }, ... ]
forceRedistribution: true
(으)로 리샤딩하면 컬렉션 데이터를 모든 관련 샤드에 다시 쓰고 이전 컬렉션 삭제합니다. 클러스터 에서 데이터를 이동하는 가장 빠른 방법입니다.