샤딩된 클러스터에서 범위 만들기
대부분의 상황에서 샤딩된 클러스터 는 사용자 개입 없이 자동으로 범위를 생성, 분할 및 배포합니다. 그러나 경우에 따라 MongoDB 는 필요한 처리량 을 지원 만큼 충분한 범위를 생성하거나 데이터를 빠르게 배포할 수 없습니다.
예를 예시 , 샤드에 삽입물이 분산된 된 클러스터 로 대량의 데이터를 수집하려는 경우 빈 샤딩된 컬렉션 의 범위를 사전 분할 하면 처리량 이 향상될 수 있습니다.
참고
MongoDB 6.0부터 밸런서 가 빈 범위를 배포하지 않습니다. 컬렉션 을 미리 moveRange
분할하려면 를 사용하여 클러스터 의 샤드 전체에 빈 범위를 분산합니다. moveRange
는 이동할 범위 를 자동으로 분할하므로 moveRange
는 분할과 이동을 모두 수행합니다. 을 사용하여 범위 를 수동으로 분할 할 필요가 split
없습니다.
또는 비어 있거나 존재하지 않는 컬렉션을 샤딩하기 전에 영역 및 영역 범위를 정의하여 샤드 컬렉션 작업에서 정의된 영역 범위와 샤드 키 값의 전체 범위를 포함하는 추가 범위를 생성하고 영역 범위를 기반으로 초기 범위 분배를 수행합니다. 자세한 내용은 빈 컬렉션을 참조하세요.
경고
빈 컬렉션의 경우 사전 분할된 범위만 해당됩니다. 채워진 컬렉션의 범위를 수동으로 분할하면 범위와 크기를 예측할 수 없을 뿐만 아니라, 비효율적이거나 비효과적인 밸런싱 동작이 발생할 수 있습니다.
단계
다음 예시 범위를 수동으로 생성하고 배포하는 방법을 보여 줍니다. 이 예시 sample.documents
네임스페이스 의 컬렉션 사용하고 email
필드 에서 해당 컬렉션 샤딩합니다.
샤드 키 범위 정의
샤드 키 범위를 정의하는 함수를 만듭니다. 이 예시 email
이 샤드 키 사용되므로 가능한 이메일 주소를 기반으로 범위를 생성합니다.
// Generate two character prefix email ranges. function getRanges(shards) { let ranges = []; // The total number of prefix possibilities is 26 * 26 (aa to zz). // We calculate the number of combinations to add in a range. const totalCombinationsPerShard = 26 * 26 / shards.length; let minKey = { email: MinKey }; let maxKey = { email: MinKey }; for(let i = 1; i <= shards.length; ++i) { // 97 is lower case 'a' in ASCII. let prefix = 97 + ((totalCombinationsPerShard*i)/26); let suffix = 97 + ((totalCombinationsPerShard*i)%26); let initialChars = String.fromCharCode(prefix) + String.fromCharCode(suffix); minKey = maxKey; maxKey = { email: i !== shards.length ? initialChars : MaxKey }; ranges.push({ min: minKey, max: maxKey }); } return ranges; }
결과
moveRange
명령은 클러스터 의 샤드 전체에 빈 범위를 분산합니다. 이제 클러스터 대량 삽입에 최적화되었습니다.
다음 단계
성능을 더욱 향상시키려면 애플리케이션의 일반적인 쿼리를 지원 추가 인덱스를 생성하세요.
자세히 알아보기
분할된 컬렉션에 대한 대량 삽입을 위한 전략Strategies for bulk inserts to a Sharded Collection
샤딩 명령으로 생성 및 분산되는 초기 범위는 빈 컬렉션을 참조하세요.
범위를 수동으로 마이그레이션하려면 샤딩된 클러스터에서 범위 마이그레이션을 참조하세요.