Docs Menu
Docs Home
/
MongoDB 매뉴얼
/

샤딩된 클러스터 밸런서

이 페이지의 내용

  • 밸런서 내부
  • 범위 마이그레이션 절차
  • Shard Size
  • 청크 크기와 밸런싱(Chunk Size and Balancing)

MongoDB 밸런서는 샤딩된 각 컬렉션에 대해 각 샤드 의 데이터 양을 모니터링하는 백그라운드 프로세스입니다. 특정 샤드의 샤딩된 컬렉션에 대한 데이터 양이 특정 마이그레이션 임계값에 도달하면 밸런서는 샤드 간에 데이터를 자동으로 마이그레이션하고 영역을 존중하면서 샤드당 동일한 양의 데이터에 도달하려고 시도합니다. 기본적으로 밸런서 프로세스는 항상 활성화되어 있습니다.

샤딩된 클러스터의 밸런싱 절차는 사용자와 애플리케이션 계층에 완전히 투명하게 공개되지만, 절차가 진행되는 동안 성능에 약간의 영향이 있을 수 있습니다.

세 개의 샤드에 분산된 컬렉션의 다이어그램입니다. 이 컬렉션의 경우 샤드 간의 청크 수 차이가 *마이그레이션 임계값*(이 경우 2)에 도달하여 마이그레이션을 트리거합니다.

밸런서는 구성 서버 복제본 세트(CSRS)의 기본 설정에서 실행됩니다.

단일 컬렉션에 대한 컬렉션 밸런싱을 구성하려면 configureCollectionBalancing 참조하세요.

샤딩된 클러스터 밸런서를 관리하려면 샤딩된 클러스터 밸런서 관리를 참조하세요.

범위 마이그레이션은 대역폭과 워크로드 측면에서 약간의 오버헤드를 수반하며, 이 두 가지 모두 데이터베이스 성능에 영향을 미칠 수 있습니다. 밸런서는 다음을 통해 영향을 최소화하려고 시도합니다.

  • 특정 시점에 샤드를 최대 1개의 마이그레이션으로 제한합니다. 특히 샤드는 동시에 여러 데이터 마이그레이션에 참여할 수 없습니다. 밸런서는 한 번에 하나씩 범위를 마이그레이션합니다.

    MongoDB는 병렬 데이터 마이그레이션을 수행할 수 있지만 샤드는 한 번에 최대 하나의 마이그레이션에 참여할 수 있습니다. n개의 샤드가 있는 샤딩된 클러스터의 경우, MongoDB는 최대 n/2개 (반올림)까지 동시 마이그레이션을 수행할 수 있습니다.

    비동기 범위 마이그레이션 정리도 참조하세요.

  • 샤딩된 컬렉션에 대해 가장 많은 데이터를 가진 샤드와 가장 적은 데이터를 가진 샤드 간의 데이터 양 차이마이그레이션 임계값에 도달할 때만 밸런싱 라운드가 시작됩니다.

유지 관리를 위해 밸런서 를 일시적으로 비활성화할 수 있지만, 밸런서 를 장기간 비활성화한 상태로 두면 클러스터 성능이 저하될 수 있습니다. 자세한 내용은 밸런서 비활성화를 참조하세요.

또한 밸런서가 실행되는 기간을 제한하여 프로덕션 트래픽에 영향을 주지 않도록 할 수 있습니다. 자세한 내용은 Schedule the Balancing Window를 참조하세요.

참고

밸런싱 기간의 사양은 구성 서버 복제본 세트의 주 시간대의 현지 시간대를 기준으로 합니다.

다음도 참조하세요.

클러스터에 샤드를 추가하면 새 샤드에는 데이터가 없기 때문에 불균형이 발생합니다. MongoDB는 새 샤드로 데이터를 즉시 마이그레이션하기 시작하지만 클러스터가 밸런싱되기까지 다소 시간이 걸릴 수 있습니다. 클러스터에 샤드를 추가하는 방법에 대한 지침은 클러스터에 샤드 추가 자습서를 참조하세요.

애플리케이션 이 시작하기 전에 를 충족하는 경우 reshardCollection 명령을 사용하여 클러스터 전체에 데이터를 재배포하여 새 샤드를 포함할 수 있습니다. 이 프로세스 는 대체 범위 마이그레이션 절차보다 훨씬 빠릅니다.

예시 는 새 샤드에 데이터 재배포를 참조하세요.

클러스터에서 샤드를 제거하면 해당 샤드에 있는 데이터가 클러스터 전체에 재분배되어야 하므로 비슷한 불균형이 발생합니다. MongoDB는 제거된 샤드를 즉시 비우기 시작하지만 클러스터가 균형을 이루기까지는 다소 시간이 걸릴 수 있습니다. 이 프로세스 중에 제거된 샤드와 연결된 서버를 종료 하지 마십시오 .

청크 분포가 균일하지 않은 클러스터에서 샤드를 제거하면 밸런서는 먼저 드레이닝 샤드에서 청크를 제거한 다음 나머지 불균등 청크 분포를 조정합니다.

클러스터에서 샤드를 안전하게 제거하는 방법에 대한 지침은 클러스터에서 샤드 제거 튜토리얼을 참조하세요.

다음도 참조하세요.

모든 범위 마이그레이션은 다음 절차를 사용합니다.

  1. 밸런서 프로세스는 moveRange 명령을 소스 샤드로 보냅니다.

  2. 소스는 내부 moveRange 명령을 수신하면 이동을 시작합니다. 마이그레이션 프로세스 중에 해당 범위에 대한 작업이 소스 샤드로 전송됩니다. 소스 샤드는 해당 범위에 대한 수신 쓰기 작업을 담당합니다.

  3. 대상 샤드는 대상에 존재하지 않는 소스에 필요한 모든 인덱스를 구축합니다.

  4. 대상 샤드는 해당 범위의 문서를 요청하기 시작하고 데이터 복사본을 받기 시작합니다. 범위 마이그레이션 및 복제도 참조하세요.

  5. 범위의 최종 문서를 받은 후 대상 샤드는 마이그레이션 중에 발생한 마이그레이션된 문서에 대한 변경 사항이 있는지 확인하기 위해 동기화 프로세스를 시작합니다.

  6. 완전히 동기화되면 소스 샤드가 구성 데이터베이스 에 연결되고 클러스터 메타데이터를 해당 범위의 새 위치로 업데이트합니다.

  7. 소스 샤드가 메타데이터 업데이트를 완료하고 범위에 열려 있는 커서가 없으면 소스 샤드가 문서 사본을 삭제합니다.

    참고

    밸런서가 소스 샤드에서 추가 청크 마이그레이션을 수행해야 하는 경우, 밸런서는 현재 마이그레이션 프로세스가 이 삭제 단계를 완료할 때까지 기다리지 않고 다음 청크 마이그레이션을 시작할 수 있습니다. 비동기 범위 마이그레이션 정리를 참조하세요.

경고

마이그레이션이 있는 샤딩된 클러스터의 세컨더리 읽기는 문서를 놓칠 수 있습니다.

샤딩된 클러스터에서 장기 실행 세컨더리 읽기는 마이그레이션이 발생하는 경우 문서를 누락할 수 있습니다.

청크 마이그레이션 중에 청크를 삭제하기 전에, MongoDB는 orphanCleanupDelaySecs 또는 청크와 관련된 진행 중인 쿼리가 샤드 프라이머리에서 완료될 때까지 둘 중 더 긴 시간을 기다립니다. 처음에 프라이머리 노드에서 실행되었지만 노드가 세컨더리 노드로 내려간 후에도 계속되는 쿼리는 처음에 세컨더리 노드에서 실행된 것처럼 처리됩니다. 즉, 서버는 현재 기본 서버에 청크를 대상으로 하는 쿼리가 없는 경우에만 orphanDelayCleanupSecs동안 대기합니다.

청크를 대상으로 하고 세컨더리에서 실행되는 쿼리는 쿼리가 orphanCleanupDelaySecs보다 오래 걸리면 문서를 누락할 수 있습니다.

밸런싱이 클러스터에 미치는 영향을 최소화하기 위해 밸런서는 샤딩된 컬렉션의 데이터 분배가 특정 임계값에 도달한 후에만 밸런싱을 시작합니다.

해당 컬렉션의 샤드 간 데이터 차이가 컬렉션에 대해 구성된 범위 크기의 3배 미만인 경우 컬렉션이 균형 잡힌 것으로 간주됩니다. 기본 범위 크기인 128MB 의 경우 마이그레이션을 수행하려면 샤드 두 개에 주어진 컬렉션의 데이터 크기 차이가 384MB 이상이어야 합니다.

다음도 참조하세요.

샤드에서 데이터를 마이그레이션하기 위해 밸런서는 한 번에 한 범위씩 데이터를 마이그레이션합니다. 하지만 밸런서는 다음 범위 마이그레이션을 시작하기 전에 현재 마이그레이션의 삭제 단계가 완료될 때까지 기다리지 않습니다. 범위 마이그레이션 프로세스 및 삭제 단계는 범위 마이그레이션을 참조하세요.

이 큐 동작은 사전 분할 없이 초기 데이터 로드를 수행할 때나 새 샤드를 추가할 때와 같이 클러스터의 불균형이 심한 경우 샤드가 데이터를 더 빠르게 언로드할 수 있게 해줍니다.

이 동작은 moveRange 명령에도 영향을 미치므로 moveRange 명령을 사용하는 마이그레이션 스크립트가 더 빠르게 진행될 수 있습니다.

경우에 따라 삭제 단계가 더 오래 지속될 수 있습니다. 삭제 단계 중 장애 조치가 발생하는 경우 복원력이 향상되도록 범위 마이그레이션이 향상되었습니다. 이 단계에서 복제본 세트의 기본이 충돌하거나 다시 시작되는 경우에도 고아 문서가 정리됩니다.

_waitForDelete 분산 장치 설정은 현재 마이그레이션의 삭제 단계가 다음 청크 마이그레이션의 시작을 차단하도록 동작을 변경할 수 있습니다. _waitForDelete은 일반적으로 내부 테스트 용도로 사용됩니다. 자세한 내용은 삭제 대기를 참조하세요.

참고

범위 삭제는 리소스 집약적인 작업으로, 클러스터 가 문서를 삭제할 때 상당한 캐시 및 I/O 스트레스를 초래할 수 있습니다.

클러스터 에 샤드를 추가하거나 여러 샤드에 샤딩된 컬렉션 을 초기 배포하는 경우와 같이 대량의 데이터를 이동하려는 경우에는 대신 컬렉션 을 리샤딩하는 것이 좋습니다. 리샤딩 작업에는 범위 정리가 필요하지 않으므로 클러스터 에 대한 스트레스가 훨씬 줄어듭니다.

자세한 내용은 컬렉션 리샤딩을 참조하세요.

범위 마이그레이션 시 _secondaryThrottle 값은 범위 내의 다음 문서로 마이그레이션이 진행되는 시기를 결정합니다.

config.settings 컬렉션에서:

  • 밸런서의 _secondaryThrottle 설정이 쓰기 고려 (write concern)로 설정된 경우 범위 마이그레이션 중 이동된 각 문서는 다음 문서로 진행하기 전에 요청된 승인을 받아야 합니다.

  • _secondaryThrottle 설정이 설정되지 않은 경우 마이그레이션 프로세스는 보조 문서로의 복제를 기다리지 않고 대신 다음 문서를 계속 진행합니다.

밸런서의 _secondaryThrottle 파라미터를 업데이트하려면 예를 들어 보조 스로틀을 참조하세요.

_secondaryThrottle 설정과 관계없이 범위 마이그레이션의 특정 단계에는 다음과 같은 복제 정책이 있습니다.

  • MongoDB는 범위 위치로 구성 서버를 업데이트하기 전에 소스 샤드에서 마이그레이션되는 컬렉션에 대한 모든 애플리케이션 읽기 및 쓰기를 잠시 일시 중지합니다. MongoDB는 업데이트 후 애플리케이션 읽기 및 쓰기를 재개합니다. 범위 이동을 위해서는 범위 이동을 구성 서버로 커밋하기 전과 후에 복제본 세트 구성원의 과반수가 모든 쓰기를 승인해야 합니다.

  • 나가는 마이그레이션이 완료되고 정리가 발생하면 모든 쓰기가 대다수의 서버에 복제되어야 다른 나가는 마이그레이션에서 추가 정리 또는 새로 들어오는 마이그레이션을 진행할 수 있습니다.

3} 컬렉션에서 _secondaryThrottle 설정을 config.settings 업데이트하려면 보조 스로틀의 예를 참조하세요.

기본적으로 MongoDB는 범위 내의 문서 수가 구성된 범위 크기를 평균 문서 크기로 나눈 결과의 2배보다 크면 범위를 이동할 수 없습니다. MongoDB가 청크의 하위 범위를 이동하여 크기를 그 이하로 줄일 수 있는 경우, 밸런서는 범위를 마이그레이션하는 방식으로 이를 수행합니다. db.collection.stats()에는 컬렉션의 avgObjSize 평균 문서 크기를 나타내는 필드가 포함되어 있습니다.

너무 커서 마이그레이션할 수 없는 청크의 경우:

  • 밸런서 설정 attemptToBalanceJumboChunks를 사용하면 청크에 점보 레이블이 지정되지 않은 한 밸런서가 이동하기에는 너무 큰 청크를 마이그레이션할 수 있습니다. 자세한 내용은 크기 제한을 초과하는 밸런스 범위를 참조하십시오.

    moveRangemoveChunk 명령을 발행할 때, forceJumbo 옵션을 지정하여 너무 커서 이동할 수 없는 범위의 마이그레이션을 허용할 수 있습니다. 범위는 점보로 표시되거나 표시되지 않을 수 있습니다.

2} ,rangeDeleterBatchSizerangeDeleterBatchDelayMS, 매개 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.

MongoDB 5.3부터는 범위 마이그레이션 중에 고아 문서에 대한 업데이트에 대한 변경 스트림 이벤트가 생성되지 않습니다.

기본적으로 MongoDB는 데이터 세트가 커짐에 따라 사용 가능한 모든 디스크 공간을 모든 샤드의 데이터로 채우려고 시도합니다. 클러스터가 항상 데이터 증가를 처리할 수 있는 용량을 확보하려면 디스크 사용량 및 기타 성능 지표를 모니터링하십시오.

샤드의 최대 크기를 설정하는 방법은 주어진 샤드의 최대 저장 공간 크기 변경 튜토리얼을 참조하세요.

chunkSize에 대한 소개는 샤딩된 클러스터에서 범위 크기 수정을 참조하세요.

다음 표는 chunkSize가 다양한 MongoDB 버전에서 조각 모음 및 밸런서 작업에 미치는 영향을 설명합니다.

MongoDB 버전
설명
MongoDB 6.0 이상

두 샤드 간에 공유되는 컬렉션 데이터가 구성된 chunkSize 설정보다 3배 이상 다른 경우 밸런서는 샤드 간에 청크를 마이그레이션합니다.

예를 들어 chunkSize 값이 128MB이고 컬렉션 데이터의 차이가 384MB 이상인 경우 밸런서는 샤드 간에 청크를 마이그레이션합니다.

MongoDB 6.0 이전 버전
청크가 chunkSize보다 커지면 청크가 분할됩니다.

청크가 이동, 분할 또는 병합되면 구성 서버에서 청크 작업이 커밋된 후 샤드 메타데이터가 업데이트됩니다. 청크 작업과 관련되지 않은 샤드도 새로운 메타데이터로 업데이트됩니다.

샤드 메타데이터 업데이트 시간은 라우팅 테이블의 크기에 비례합니다. 샤드 메타데이터가 업데이트되는 동안 컬렉션에 대한 CRUD 작업이 일시적으로 차단되며, 라우팅 테이블이 작을수록 CRUD 작업 지연이 더 짧아집니다.

컬렉션 조각 모음을 수행하면 청크 수와 청크 메타데이터 업데이트 시간이 줄어듭니다.

시스템 작업 부하를 줄이려면 샤드 밸런싱 창을 사용하여 특정 시간에만 밸런서가 실행되도록 구성하세요. 조각 모음은 밸런싱 기간 동안 실행됩니다.

2}chunkDefragmentationThrottlingMS 매개변수를 사용하여 밸런서에서 실행되는 분할 및 병합 명령의 속도를 제한할 수 있습니다.

조각 모음을 언제든지 시작하고 중지할 수 있습니다.

샤드 존을 설정할 수도 있습니다. 샤드 영역은 샤드 키를 기반으로 하며, 각 영역을 클러스터에 있는 하나 이상의 샤드와 연결할 수 있습니다.

MongoDB 6.0부터 샤딩된 클러스터는 청크를 마이그레이션해야 하는 경우에만 청크를 분할합니다. 이는 청크 크기가 chunkSize를 초과할 수 있음을 의미합니다. 청크가 클수록 샤드의 청크 수가 줄어들고 샤드 메타데이터를 업데이트하는 데 걸리는 시간이 줄어들기 때문에 성능이 향상됩니다. 예를 들어 chunkSize를 256MB로 설정했는데도 샤드에 1TB 청크가 표시될 수 있습니다.

chunkSize 는 다음에 영향을 줍니다.

  • 단일 청크 마이그레이션 작업에서 밸런서가 두 샤드 간에 마이그레이션을 시도하는 최대 데이터 양입니다.

  • 조각 모음 중에 마이그레이션된 데이터의 양입니다.

샤딩된 컬렉션의 조각 모음에 대한 자세한 내용은 샤딩된 컬렉션 조각 모음을 참조하세요.

돌아가기

컬렉션 이동 중지