문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

청크를 사용한 데이터 파티셔닝

이 페이지의 내용

  • 초기 청크
  • 청크 크기
  • 청크 분할
  • 청크 마이그레이션
  • 분할 불가능/점보 청크
  • moveChunk 디렉토리

MongoDB uses the shard key associated to the collection to partition the data into chunks. 청크 는 샤딩된 데이터의 하위 집합으로 구성됩니다. 각 청크에는 샤드 키에 따라 포괄적인 하위 범위와 배타적인 상위 범위가 있습니다.

더 작은 범위 또는 청크로 분할된 샤드 키 값 공간의 다이어그램.

MongoDB는 구성된 청크 크기 이상으로 커지면 청크를 분할합니다. 삽입과 업데이트 모두 청크 분할을 트리거할 수 있습니다.

청크가 표현할 수 있는 가장 작은 범위는 단일 고유 샤드 키 값입니다. 단일 샤드 키 값을 가진 문서만 포함하는 청크는 분할할 수 없습니다.

  • 샤딩 작업은 샤드 키 값의 전체 범위를 포함하는 초기 청크를 생성합니다. 생성되는 청크 수는 구성된 청크 크기에 따라 달라집니다.

  • 초기 청크 생성 후, 밸런서는 이러한 초기 청크를 샤드 전체에 적절하게 마이그레이션하고 향후 청크 분포를 managed합니다.

  • 비어 있거나 존재하지 않는 컬렉션에 대해 구역 및 영역 범위가 정의되어 있는 경우.

    • 샤딩 작업은 정의된 영역 범위에 대해 빈 청크를 생성하고 샤드 키 값의 전체 범위를 포함하는 추가 청크를 생성하고, 영역 범위에 기반하여 초기 청크 분배를 수행합니다. 이러한 청크의 초기 생성 및 배포는 영역별 샤딩의 빠른 설정을 가능하게 합니다.

    • 초기 분배 이후에는 밸런서가 앞으로의 청크 분배를 관리합니다.

  • 비어 있거나 존재하지 않는 collection에 대해 정의된 구역 및 구역 범위 가 없는 경우:

    • 해시 샤딩의 경우:

      • 샤딩 작업은 샤드 키 값의 전체 범위를 포함하는 빈 청크를 생성하고 초기 청크 분산을 수행합니다. 기본적으로 이 작업은 샤드당 2개의 청크를 생성하고 클러스터 전체에 마이그레이션됩니다. numInitialChunks 옵션을 사용하여 초기 청크의 개수를 다르게 지정할 수 있습니다. 이러한 청크의 초기 생성 및 배포를 통해 샤딩을 더 빠르게 설정할 수 있습니다.

      • 초기 분배 이후에는 밸런서가 앞으로의 청크 분배를 관리합니다.

    • 원거리 샤딩의 경우:

      • 샤딩 작업은 샤드 키 값의 전체 범위를 포괄하는 빈 단일 청크를 생성합니다.

      • 초기 청크 생성 후, 밸런서는 초기 청크를 샤드 간에 적절히 마이그레이션하고 향후 청크 분산을 관리합니다.

다음도 참조하세요.

MongoDB의 기본 청크 크기는 64메가바이트입니다. 청크 크기를 늘리거나 줄일 수 있습니다. 기본 청크 크기를 변경하는 것이 어떤 영향을 미치는지 생각해 보세요.

  1. 청크가 작을수록 마이그레이션 빈도가 높아지는 대신 데이터가 더 고르게 분산됩니다. 이로 인해 쿼리 라우팅(mongos) 계층에서 비용이 발생합니다.

  2. 청크가 클수록 마이그레이션 횟수가 줄어듭니다. 이는 네트워킹 관점 쿼리 라우팅 계층의 내부 오버헤드 측면에서 더 효율적입니다. 그러나 이러한 효율성은 데이터의 불균등한 분산을 초래할 수 있습니다.

  3. 청크 크기는 마이그레이션할 청크당 최대 문서 수에 영향을 줍니다.

  4. 청크 크기는 기존 collection 을 샤딩할 때 최대 collection 크기에 영향을 줍니다. 샤딩 후 청크 크기는 collection 크기를 제한하지 않습니다.

대부분의 배포 환경에서는 데이터 세트의 분산이 균등하지 않더라도 빈번하고 잠재적으로 잘못된 마이그레이션을 피하는 것이 합리적입니다.

청크 크기를 변경하면 청크 분할 시기에 영향을 받지만 효과에는 몇 가지 제한 사항이 있습니다.

  • 자동 분할은 삽입 또는 업데이트 중에만 발생합니다. 청크 크기를 낮추면 모든 청크가 새 크기로 분할되는 데 시간이 걸릴 수 있습니다.

  • 분할은 "실행 취소"할 수 없습니다. 청크 크기를 늘리면 기존 청크는 새 크기에 도달할 때까지 삽입 또는 업데이트를 통해 커져야 합니다.

분할은 청크가 너무 커지지 않도록 하는 프로세스입니다. 청크가 지정된 청크 크기 를 초과하거나 청크의 문서 수가 마이그레이션할 청크당 최대 문서 수를 초과하는 경우 MongoDB는 청크가 나타내는 샤드 키 값을 기준으로 청크를 분할합니다. 청크는 필요한 경우 여러 청크로 분할될 수 있습니다. 삽입 및 업데이트로 인해 분할이 발생할 수 있습니다. 분할은 효율적인 메타데이터 변경입니다. 분할을 생성하기 위해 MongoDB는 데이터를 마이그레이션하거나 샤드에 영향을 주지 않습니다 .

기본 청크 크기인 64MB를 초과하는 청크가 있는 샤드의 다이어그램으로 청크를 두 개의 청크로 Atlas Triggers합니다.

분할은 shards 전체에 collection에 대한 청크가 고르지 않게 분산될 수 있습니다. 이러한 경우 밸런서는 샤드 전체에 청크를 재분배합니다. 샤드 간 청크 균형 조정에 대한 자세한 내용은 cluster 밸런서 를 참조하세요.

MongoDB는 cluster 의 청크를 마이그레이션하여 collection의 청크를 샤드 간에 균등하게 분배합니다. 마이그레이션은 다음 중 하나일 수 있습니다.

  • 수동입니다. 대량 삽입 중 데이터를 배포하는 등 제한된 경우에만 수동 마이그레이션을 사용합니다. 자세한 내용은 청크 수동 마이그레이션을 참조하세요.

  • 자동. 밸런서 프로세스는 샤드 전체에 collection의 청크가 고르지 않게 분포되어 있는 경우 청크를 자동으로 마이그레이션합니다. 자세한 내용은 마이그레이션 임계값 을 참조하세요.

샤딩된 클러스터 밸런서에 대한 자세한 내용은 샤드 클러스터 밸런서를 참조하십시오.

밸런서 는 청크 마이그레이션을 managed 백그라운드 프로세스입니다. 가장 큰 샤드와 가장 작은 샤드 간의 청크 수 차이가 마이그레이션 임곗값을 초과하면 밸런서는 데이터가 균등하게 분산되도록 cluster 전체에 청크를 마이그레이션하기 시작합니다.

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

밸런서의 특정 측면을 managed 수 있습니다. 밸런서는 또한 샤드 클러스터에서 구역 을 구성할 때 생성된 모든 구역 을 존중합니다.

밸런서에 대한 자세한 내용은 샤딩된 클러스터 밸런서를 참조하십시오.

경우에 따라 청크가 지정된 청크 크기 이상으로 커질 수 있지만 분할 할 수 없는 경우도 있습니다. 가장 일반적인 시나리오는 청크가 단일 샤드 키 값을 나타내는 경우입니다. 청크는 분할할 수 없으므로 청크 크기를 초과하여 계속 커져 점보 청크가 됩니다. 이러한 점보 청크는 계속 증가함에 따라 성능 병목 현상이 발생할 수 있으며, 특히 샤드 키 값이 높은 빈도로 발생하는 경우 더욱 그렇습니다.

MongoDB 5.0부터는 문서의 샤드 키를 변경하여 컬렉션을 리샤할 수 있습니다.

MongoDB는 refineCollectionShardKey 명령을 제공합니다. 컬렉션의 샤드 키를 수정하면 데이터를 더욱 세분화할 수 있으며 기존 키의 카디널리티가 부족하여 점보 청크가 엄청나게 커지는 상황을 해결할 수 있습니다.

컬렉션을 리샤딩해야 하는지 또는 샤드 키를 세분화해야 하는지 알아보려면 샤드 키 변경을 참조하세요.

자세한 내용은 다음을 참조하세요.

MongoDB 2.6 및 3.0에서는 sharding.archiveMovedChunks 이 기본적으로 활성화됩니다. 다른 모든 MongoDB 버전에서는 기본적으로 비활성화되어 있습니다. sharding.archiveMovedChunks 를 활성화하면 소스 샤드는 마이그레이션된 청크의 문서를storage.dbPathmoveChunk 디렉토리 아래 컬렉션 네임스페이스 이름을 딴 디렉토리에 보관합니다

마이그레이션 중에 오류가 발생하는 경우 이러한 파일은 마이그레이션 중에 영향을 받은 문서를 복구하는 데 도움이 될 수 있습니다.

마이그레이션이 성공적으로 완료되어 이러한 파일에서 문서를 복구할 필요가 없으면 해당 파일을 안전하게 삭제할 수 있습니다. 또는 복구에 사용할 수 있는 데이터베이스의 기존 백업이 있는 경우 마이그레이션 후 이러한 파일을 삭제할 수도 있습니다.

모든 마이그레이션이 완료되었는지 확인하려면 인스턴스에 sh.isBalancerRunning() 연결된 mongos 상태에서 를 실행합니다.

← 영역을 사용하여 컬렉션 배포하기