샤딩된 클러스터에서 범위 만들기
대부분의 상황에서 샤딩된 클러스터 는 사용자 개입 없이 자동으로 범위를 생성, 분할 및 배포합니다. 그러나 경우에 따라 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
샤딩 명령으로 생성 및 분산되는 초기 범위는 빈 컬렉션을 참조하세요.
범위를 수동으로 마이그레이션하려면 샤딩된 클러스터에서 범위 마이그레이션을 참조하세요.