청크를 사용한 데이터 파티셔닝
MongoDB 는 컬렉션 과 연결된 샤드 키 를 사용하여 데이터를 청크 로 분할합니다. 청크 는 샤딩된 데이터의 하위 집합으로 구성됩니다. 각 청크 에는 샤드 키에 따라 포괄적인 하위 범위와 배타적인 상위 범위 가 있습니다.
MongoDB 는 청크가 구성된 청크 크기 를 초과하면 청크를 분할합니다. 삽입과 업데이트 모두 청크 분할 을 trigger 할 수 있습니다.
청크가 표현할 수 있는 가장 작은 범위는 단일 고유 샤드 키 값입니다. 단일 샤드 키 값을 가진 문서만 포함하는 청크는 분할할 수 없습니다.
초기 청크
채워진 컬렉션
샤딩 작업은 샤드 키 값의 전체 범위를 포함하는 초기 청크를 생성합니다. 생성되는 청크 수는 구성된 청크 크기에 따라 달라집니다.
초기 청크 생성 후, 밸런서는 이러한 초기 청크를 샤드 전체에 적절하게 마이그레이션하고 향후 청크 분포를 managed합니다.
빈 컬렉션
비어 있거나 존재하지 않는 컬렉션에 대해 구역 및 영역 범위가 정의되어 있는 경우.
샤딩 작업은 정의된 영역 범위에 대해 빈 청크를 생성하고 샤드 키 값의 전체 범위를 포함하는 추가 청크를 생성하고, 영역 범위에 기반하여 초기 청크 분배를 수행합니다. 이러한 청크의 초기 생성 및 배포는 영역별 샤딩의 빠른 설정을 가능하게 합니다.
초기 분배 이후에는 밸런서가 앞으로의 청크 분배를 관리합니다.
비어 있거나 존재하지 않는 collection에 대해 정의된 구역 및 구역 범위 가 없는 경우:
해시 샤딩의 경우:
샤딩 작업은 샤드 키 값의 전체 범위를 포함하는 빈 청크를 생성하고 초기 청크 분산을 수행합니다. 기본적으로 이 작업은 샤드당 2개의 청크를 생성하고 클러스터 전체에 마이그레이션됩니다.
numInitialChunks
옵션을 사용하여 초기 청크의 개수를 다르게 지정할 수 있습니다. 이러한 청크의 초기 생성 및 배포를 통해 샤딩을 더 빠르게 설정할 수 있습니다.초기 분배 이후에는 밸런서가 앞으로의 청크 분배를 관리합니다.
원거리 샤딩의 경우:
샤딩 작업은 샤드 키 값의 전체 범위를 포괄하는 빈 단일 청크를 생성합니다.
초기 청크 생성 후, 밸런서는 초기 청크를 샤드 간에 적절히 마이그레이션하고 향후 청크 분산을 관리합니다.
청크 크기
MongoDB의 기본 청크 크기는 64메가바이트입니다. 청크 크기를 늘리거나 줄일 수 있습니다. 기본 청크 크기를 변경하는 것이 어떤 영향을 미치는지 생각해 보세요.
청크가 작을수록 마이그레이션 빈도가 높아지는 대신 데이터가 더 고르게 분산됩니다. 이로 인해 쿼리 라우팅(
mongos
) 계층에서 비용이 발생합니다.청크가 클수록 마이그레이션 횟수가 줄어듭니다. 이는 네트워킹 관점 과 쿼리 라우팅 계층의 내부 오버헤드 측면에서 더 효율적입니다. 그러나 이러한 효율성은 데이터의 불균등한 분산을 초래할 수 있습니다.
청크 크기는 기존 collection 을 샤딩할 때 최대 collection 크기에 영향을 줍니다. 샤딩 후 청크 크기는 collection 크기를 제한하지 않습니다.
대부분의 배포 환경에서는 데이터 세트의 분산이 균등하지 않더라도 빈번하고 잠재적으로 잘못된 마이그레이션을 피하는 것이 합리적입니다.
제한 사항
청크 크기를 변경하면 청크 분할 시기에 영향을 받지만 효과에는 몇 가지 제한 사항이 있습니다.
자동 분할은 삽입 또는 업데이트 중에만 발생합니다. 청크 크기를 낮추면 모든 청크가 새 크기로 분할되는 데 시간이 걸릴 수 있습니다.
분할은 "실행 취소"할 수 없습니다. 청크 크기를 늘리면 기존 청크는 새 크기에 도달할 때까지 삽입 또는 업데이트를 통해 커져야 합니다.
청크 분할
분할은 청크가 너무 커지지 않도록 하는 프로세스 입니다. 청크 가 지정된 청크 크기 를 초과하거나 청크 의 문서 수가 마이그레이션할 청크당 최대 문서 수를 초과하는 경우 MongoDB 는 청크 가 나타내는 샤드 키 값을 기준으로 청크 를 분할합니다. 청크 는 필요한 경우 여러 청크로 분할 될 수 있습니다. 삽입 및 업데이트로 인해 분할이 발생할 수 trigger . 분할은 효율적인 메타데이터 변경입니다. 분할을 생성하기 위해 MongoDB 는 데이터를 마이그레이션 하거나 샤드에 영향을 주지 않습니다 .
분할은 shards 전체에 collection에 대한 청크가 고르지 않게 분산될 수 있습니다. 이러한 경우 밸런서는 샤드 전체에 청크를 재분배합니다. 샤드 간 청크 균형 조정에 대한 자세한 내용은 cluster 밸런서 를 참조하세요.
청크 마이그레이션
MongoDB는 cluster 의 청크를 마이그레이션하여 collection의 청크를 샤드 간에 균등하게 분배합니다. 마이그레이션은 다음 중 하나일 수 있습니다.
수동입니다. 대량 삽입 중 데이터를 배포하는 등 제한된 경우에만 수동 마이그레이션을 사용합니다. 자세한 내용은 청크 수동 마이그레이션을 참조하세요.
자동. 밸런서 프로세스는 샤드 전체에 collection의 청크가 고르지 않게 분포되어 있는 경우 청크를 자동으로 마이그레이션합니다. 자세한 내용은 마이그레이션 임계값 을 참조하세요.
샤딩된 클러스터 밸런서에 대한 자세한 내용은 샤딩된 클러스터 밸런서를 참조하십시오.
밸런싱
밸런서 는 청크 마이그레이션을 managed 백그라운드 프로세스입니다. 가장 큰 샤드와 가장 작은 샤드 간의 청크 수 차이가 마이그레이션 임곗값을 초과하면 밸런서는 데이터가 균등하게 분산되도록 cluster 전체에 청크를 마이그레이션하기 시작합니다.
밸런서의 특정 측면을 managed 수 있습니다. 밸런서는 또한 샤드 클러스터에서 구역 을 구성할 때 생성된 모든 구역 을 존중합니다.
밸런서에 대한 자세한 내용은 샤딩된 클러스터 밸런서를 참조하십시오.
분할 불가능/점보 청크
경우에 따라 청크가 지정된 청크 크기 이상으로 커질 수 있지만 분할 할 수 없는 경우도 있습니다. 가장 일반적인 시나리오는 청크가 단일 샤드 키 값을 나타내는 경우입니다. 청크는 분할할 수 없으므로 청크 크기를 초과하여 계속 커져 점보 청크가 됩니다. 이러한 점보 청크는 계속 증가함에 따라 성능 병목 현상이 발생할 수 있으며, 특히 샤드 키 값이 높은 빈도로 발생하는 경우 더욱 그렇습니다.
MongoDB 5.0부터는 문서의 샤드 키를 변경하여 컬렉션을 리샤할 수 있습니다.
MongoDB는 refineCollectionShardKey
명령을 제공합니다. 컬렉션의 샤드 키를 세분화하면 데이터를 더 세밀하게 분배할 수 있으며, 기존 키의 카디널리티가 부족해 점보 청크가 커지는 상황을 해결할 수 있습니다.
컬렉션을 리샤딩해야 하는지 또는 샤드 키를 세분화해야 하는지 알아보려면 샤드 키 변경을 참조하세요.
자세한 내용은 다음을 참조하세요.
moveChunk
디렉토리
MongoDB 2.6 및 3.0에서는 sharding.archiveMovedChunks
이 기본적으로 활성화됩니다. 다른 모든 MongoDB 버전에서는 기본적으로 비활성화되어 있습니다. sharding.archiveMovedChunks
를 활성화하면 소스 샤드는 마이그레이션된 청크의 문서를storage.dbPath
의 moveChunk
디렉토리 아래 컬렉션 네임스페이스 이름을 딴 디렉토리에 보관합니다
마이그레이션 중에 오류가 발생하는 경우 이러한 파일은 마이그레이션 중에 영향을 받은 문서를 복구하는 데 도움이 될 수 있습니다.
마이그레이션이 성공적으로 완료되어 이러한 파일에서 문서를 복구할 필요가 없으면 해당 파일을 안전하게 삭제할 수 있습니다. 또는 복구에 사용할 수 있는 데이터베이스의 기존 백업이 있는 경우 마이그레이션 후 이러한 파일을 삭제할 수도 있습니다.
모든 마이그레이션이 완료되었는지 확인하려면 인스턴스에 sh.isBalancerRunning()
연결된 mongos
상태에서 를 실행합니다.