샤딩된 클러스터 밸런서
MongoDB 밸런서는 샤딩된 각 컬렉션에 대해 각 샤드 의 데이터 양을 모니터링하는 백그라운드 프로세스입니다. 특정 샤드의 샤딩된 컬렉션에 대한 데이터 양이 특정 마이그레이션 임계값에 도달하면 밸런서는 샤드 간에 데이터를 자동으로 마이그레이션하고 영역을 존중하면서 샤드당 동일한 양의 데이터에 도달하려고 시도합니다. 기본적으로 밸런서 프로세스는 항상 활성화되어 있습니다.
샤딩된 클러스터의 밸런싱 절차는 사용자와 애플리케이션 계층에 완전히 투명하게 공개되지만, 절차가 진행되는 동안 성능에 약간의 영향이 있을 수 있습니다.
밸런서는 구성 서버 복제본 세트(CSRS)의 기본 설정에서 실행됩니다.
단일 컬렉션에 대한 컬렉션 밸런싱을 구성하려면 configureCollectionBalancing
참조하세요.
샤딩된 클러스터 밸런서를 관리하려면 샤딩된 클러스터 밸런서 관리를 참조하세요.
밸런서 내부
범위 마이그레이션은 대역폭과 워크로드 측면에서 약간의 오버헤드를 수반하며, 이 두 가지 모두 데이터베이스 성능에 영향을 미칠 수 있습니다. 밸런서는 다음을 통해 영향을 최소화하려고 시도합니다.
특정 시점에 샤드를 최대 1개의 마이그레이션으로 제한합니다. 특히 샤드는 동시에 여러 데이터 마이그레이션에 참여할 수 없습니다. 밸런서는 한 번에 하나씩 범위를 마이그레이션합니다.
MongoDB는 병렬 데이터 마이그레이션을 수행할 수 있지만 샤드는 한 번에 최대 하나의 마이그레이션에 참여할 수 있습니다. n개의 샤드가 있는 샤딩된 클러스터의 경우, MongoDB는 최대 n/2개 (반올림)까지 동시 마이그레이션을 수행할 수 있습니다.
비동기 범위 마이그레이션 정리도 참조하세요.
샤딩된 컬렉션에 대해 가장 많은 데이터를 가진 샤드와 가장 적은 데이터를 가진 샤드 간의 데이터 양 차이가 마이그레이션 임계값에 도달할 때만 밸런싱 라운드가 시작됩니다.
유지 관리를 위해 밸런서 를 일시적으로 비활성화할 수 있지만, 밸런서 를 오랫동안 비활성화한 상태로 두면 클러스터 성능이 저하될 수 있습니다. 자세한 내용 은 밸런서 비활성화를 참조하세요.
또한 밸런서가 실행되는 기간을 제한하여 프로덕션 트래픽에 영향을 주지 않도록 할 수 있습니다. 자세한 내용은 Schedule the Balancing Window를 참조하세요.
참고
밸런싱 기간의 사양은 구성 서버 복제본 세트의 주 시간대의 현지 시간대를 기준으로 합니다.
클러스터에서 샤드 추가 및 제거하기
클러스터에 샤드를 추가하면 새 샤드에는 데이터가 없기 때문에 불균형이 발생합니다. MongoDB는 새 샤드로 데이터를 즉시 마이그레이션하기 시작하지만 클러스터가 밸런싱되기까지 다소 시간이 걸릴 수 있습니다. 클러스터에 샤드를 추가하는 방법에 대한 지침은 클러스터에 샤드 추가 자습서를 참조하세요.
클러스터에서 샤드를 제거하면 해당 샤드에 있는 데이터가 클러스터 전체에 재분배되어야 하므로 비슷한 불균형이 발생합니다. MongoDB는 제거된 샤드를 즉시 비우기 시작하지만 클러스터가 균형을 이루기까지는 다소 시간이 걸릴 수 있습니다. 이 프로세스 중에 제거된 샤드와 연결된 서버를 종료 하지 마십시오 .
청크 분포가 균일하지 않은 클러스터에서 샤드를 제거하면 밸런서는 먼저 드레이닝 샤드에서 청크를 제거한 다음 나머지 불균등 청크 분포를 조정합니다.
클러스터에서 샤드를 안전하게 제거하는 방법에 대한 지침은 클러스터에서 샤드 제거 튜토리얼을 참조하세요.
범위 마이그레이션 절차
모든 범위 마이그레이션은 다음 절차를 사용합니다.
밸런서 프로세스는
moveRange
명령을 소스 샤드로 보냅니다.소스는 내부
moveRange
명령을 수신하면 이동을 시작합니다. 마이그레이션 프로세스 중에 해당 범위에 대한 작업이 소스 샤드로 전송됩니다. 소스 샤드는 해당 범위에 대한 수신 쓰기 작업을 담당합니다.대상 샤드는 대상에 존재하지 않는 소스에 필요한 모든 인덱스를 구축합니다.
대상 샤드는 해당 범위의 문서를 요청하기 시작하고 데이터 복사본을 받기 시작합니다. 범위 마이그레이션 및 복제도 참조하세요.
범위의 최종 문서를 받은 후 대상 샤드는 마이그레이션 중에 발생한 마이그레이션된 문서에 대한 변경 사항이 있는지 확인하기 위해 동기화 프로세스를 시작합니다.
완전히 동기화되면 소스 샤드가 구성 데이터베이스 에 연결되고 클러스터 메타데이터를 해당 범위의 새 위치로 업데이트합니다.
소스 샤드가 메타데이터 업데이트를 완료하고 범위에 열려 있는 커서가 없으면 소스 샤드가 문서 사본을 삭제합니다.
참고
밸런서가 소스 샤드에서 추가 청크 마이그레이션을 수행해야 하는 경우, 밸런서는 현재 마이그레이션 프로세스가 이 삭제 단계를 완료할 때까지 기다리지 않고 다음 청크 마이그레이션을 시작할 수 있습니다. 비동기 범위 마이그레이션 정리를 참조하세요.
마이그레이션 임계값
밸런싱이 클러스터에 미치는 영향을 최소화하기 위해 밸런서는 샤딩된 컬렉션의 데이터 분배가 특정 임계값에 도달한 후에만 밸런싱을 시작합니다.
해당 컬렉션의 샤드 간 데이터 차이가 컬렉션에 대해 구성된 범위 크기의 3배 미만인 경우 컬렉션이 균형 잡힌 것으로 간주됩니다. 기본 범위 크기인 128MB
의 경우 마이그레이션을 수행하려면 샤드 두 개에 주어진 컬렉션의 데이터 크기 차이가 384MB
이상이어야 합니다.
비동기 범위 마이그레이션 정리
샤드에서 데이터를 마이그레이션하기 위해 밸런서는 한 번에 한 범위씩 데이터를 마이그레이션합니다. 하지만 밸런서는 다음 범위 마이그레이션을 시작하기 전에 현재 마이그레이션의 삭제 단계가 완료될 때까지 기다리지 않습니다. 범위 마이그레이션 프로세스 및 삭제 단계는 범위 마이그레이션을 참조하세요.
이 큐 동작은 사전 분할 없이 초기 데이터 로드를 수행할 때나 새 샤드를 추가할 때와 같이 클러스터의 불균형이 심한 경우 샤드가 데이터를 더 빠르게 언로드할 수 있게 해줍니다.
이 동작은 moveRange
명령에도 영향을 미치므로 moveRange
명령을 사용하는 마이그레이션 스크립트가 더 빠르게 진행될 수 있습니다.
경우에 따라 삭제 단계가 더 오래 지속될 수 있습니다. 삭제 단계 중 장애 조치가 발생하는 경우 복원력이 향상되도록 범위 마이그레이션이 향상되었습니다. 이 단계에서 복제본 세트의 기본이 충돌하거나 다시 시작되는 경우에도 고아 문서가 정리됩니다.
_waitForDelete
분산 장치 설정은 현재 마이그레이션의 삭제 단계가 다음 청크 마이그레이션의 시작을 차단하도록 동작을 변경할 수 있습니다. _waitForDelete
은 일반적으로 내부 테스트 용도로 사용됩니다. 자세한 내용은 삭제 대기를 참조하세요.
범위 마이그레이션 및 복제
범위 마이그레이션 시 _secondaryThrottle
값은 범위 내의 다음 문서로 마이그레이션이 진행되는 시기를 결정합니다.
config.settings
컬렉션에서:
밸런서의
_secondaryThrottle
설정이 쓰기 고려 (write concern)로 설정된 경우 범위 마이그레이션 중 이동된 각 문서는 다음 문서로 진행하기 전에 요청된 승인을 받아야 합니다._secondaryThrottle
설정이 설정되지 않은 경우 마이그레이션 프로세스는 보조 문서로의 복제를 기다리지 않고 대신 다음 문서를 계속 진행합니다.
밸런서의 _secondaryThrottle
파라미터를 업데이트하려면 예를 들어 보조 스로틀을 참조하세요.
_secondaryThrottle
설정과 관계없이 범위 마이그레이션의 특정 단계에는 다음과 같은 복제 정책이 있습니다.
MongoDB는 범위 위치로 구성 서버를 업데이트하기 전에 소스 샤드에서 마이그레이션되는 컬렉션에 대한 모든 애플리케이션 읽기 및 쓰기를 잠시 일시 중지합니다. MongoDB는 업데이트 후 애플리케이션 읽기 및 쓰기를 재개합니다. 범위 이동을 위해서는 범위 이동을 구성 서버로 커밋하기 전과 후에 복제본 세트 구성원의 과반수가 모든 쓰기를 승인해야 합니다.
나가는 마이그레이션이 완료되고 정리가 발생하면 모든 쓰기가 대다수의 서버에 복제되어야 다른 나가는 마이그레이션에서 추가 정리 또는 새로 들어오는 마이그레이션을 진행할 수 있습니다.
3} 컬렉션에서 _secondaryThrottle
설정을 config.settings
업데이트하려면 보조 스로틀의 예를 참조하세요.
마이그레이션할 범위당 최대 문서 수
기본적으로 MongoDB는 범위 내의 문서 수가 구성된 범위 크기를 평균 문서 크기로 나눈 결과의 2배보다 크면 범위를 이동할 수 없습니다. MongoDB가 청크의 하위 범위를 이동하여 크기를 그 이하로 줄일 수 있는 경우, 밸런서는 범위를 마이그레이션하는 방식으로 이를 수행합니다. db.collection.stats()
에는 컬렉션의 avgObjSize
평균 문서 크기를 나타내는 필드가 포함되어 있습니다.
너무 커서 마이그레이션할 수 없는 청크의 경우:
밸런서 설정
attemptToBalanceJumboChunks
를 사용하면 청크에 점보 레이블이 지정되지 않은 한 밸런서가 이동하기에는 너무 큰 청크를 마이그레이션할 수 있습니다. 자세한 내용은 크기 제한을 초과하는 밸런스 범위를 참조하십시오.moveRange
및moveChunk
명령을 발행할 때, forceJumbo 옵션을 지정하여 너무 커서 이동할 수 없는 범위의 마이그레이션을 허용할 수 있습니다. 범위는 점보로 표시되거나 표시되지 않을 수 있습니다.
범위 삭제 성능 튜닝
2} ,rangeDeleterBatchSize
rangeDeleterBatchDelayMS
, 매개 rangeDeleterHighPriority
변수를 사용하여 범위 삭제가 성능에 미치는 영향을 조정할 수 있습니다. 예시:
일괄 처리당 삭제되는 문서 수를 제한하려면
rangeDeleterBatchSize
를32
과 같은 작은 값으로 설정하면 됩니다.일괄 삭제 사이에 지연 시간을 추가하려면 현재 기본값인
20
밀리초보다rangeDeleterBatchDelayMS
초 더 길게 설정하면 됩니다.범위 삭제의 우선 순위를 지정하려면
rangeDeleterHighPriority
~true
를 설정할 수 있습니다. 범위 삭제는 시스템 부하가 심할 때 사용자 작업 처리량에 부정적인 영향을 미칠 수 있는 장기 실행 백그라운드 작업일 수 있습니다.
참고
If there are ongoing read operations or open cursors on the collection targeted for deletes, range deletion processes may not proceed.
Change Streams 및 고아 문서
MongoDB 5.3부터는 범위 마이그레이션 중에 고아 문서에 대한 업데이트에 대한 변경 스트림 이벤트가 생성되지 않습니다.
Shard Size
기본적으로 MongoDB는 데이터 세트가 커짐에 따라 사용 가능한 모든 디스크 공간을 모든 샤드의 데이터로 채우려고 시도합니다. 클러스터가 항상 데이터 증가를 처리할 수 있는 용량을 확보하려면 디스크 사용량 및 기타 성능 지표를 모니터링하십시오.
샤드의 최대 크기를 설정하는 방법은 주어진 샤드의 최대 저장 공간 크기 변경 튜토리얼을 참조하세요.
청크 크기와 밸런싱(Chunk Size and Balancing)
chunkSize
에 대한 소개는 샤딩된 클러스터에서 범위 크기 수정을 참조하세요.
다음 표는 chunkSize
가 다양한 MongoDB 버전에서 조각 모음 및 밸런서 작업에 미치는 영향을 설명합니다.
MongoDB 버전 | 설명 |
---|---|
MongoDB 6.0 이상 | 두 샤드 간에 공유되는 컬렉션 데이터가 구성된 예를 들어 |
MongoDB 6.0 이전 버전 | 청크가 chunkSize 보다 커지면 청크가 분할됩니다. |
청크가 이동, 분할 또는 병합되면 구성 서버에서 청크 작업이 커밋된 후 샤드 메타데이터가 업데이트됩니다. 청크 작업과 관련되지 않은 샤드도 새로운 메타데이터로 업데이트됩니다.
샤드 메타데이터 업데이트 시간은 라우팅 테이블의 크기에 비례합니다. 샤드 메타데이터가 업데이트되는 동안 컬렉션에 대한 CRUD 작업이 일시적으로 차단되며, 라우팅 테이블이 작을수록 CRUD 작업 지연이 더 짧아집니다.
컬렉션 조각 모음을 수행하면 청크 수와 청크 메타데이터 업데이트 시간이 줄어듭니다.
시스템 작업 부하를 줄이려면 샤드 밸런싱 창을 사용하여 특정 시간에만 밸런서가 실행되도록 구성하세요. 조각 모음은 밸런싱 기간 동안 실행됩니다.
2}chunkDefragmentationThrottlingMS
매개변수를 사용하여 밸런서에서 실행되는 분할 및 병합 명령의 속도를 제한할 수 있습니다.
조각 모음을 언제든지 시작하고 중지할 수 있습니다.
샤드 존을 설정할 수도 있습니다. 샤드 영역은 샤드 키를 기반으로 하며, 각 영역을 클러스터에 있는 하나 이상의 샤드와 연결할 수 있습니다.
MongoDB 6.0부터 샤딩된 클러스터는 청크를 마이그레이션해야 하는 경우에만 청크를 분할합니다. 이는 청크 크기가 chunkSize
를 초과할 수 있음을 의미합니다. 청크가 클수록 샤드의 청크 수가 줄어들고 샤드 메타데이터를 업데이트하는 데 걸리는 시간이 줄어들기 때문에 성능이 향상됩니다. 예를 들어 chunkSize
를 256MB로 설정했는데도 샤드에 1TB 청크가 표시될 수 있습니다.
chunkSize
는 다음에 영향을 줍니다.
단일 청크 마이그레이션 작업에서 밸런서가 두 샤드 간에 마이그레이션을 시도하는 최대 데이터 양입니다.
조각 모음 중에 마이그레이션된 데이터의 양입니다.
샤딩된 컬렉션의 조각 모음에 대한 자세한 내용은 샤딩된 컬렉션 조각 모음을 참조하세요.