analyzeShardKey
정의
analyzeShardKey
버전 7.0에 추가.
샤딩되지 않은 컬렉션 또는 샤딩된 컬렉션 에 대한 샤드 키 를 평가하기 위한 지표 를 계산합니다. 지표는 샘플링된 쿼리를 기반으로 합니다.
configureQueryAnalyzer
를 사용하여 컬렉션 에 대한 쿼리 샘플링을 구성할 수 있습니다.
호환성
이 명령은 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
참고
이 명령은 모든 MongoDB Atlas 클러스터에서 지원됩니다. 모든 명령에 대한 Atlas 지원에 관해 자세히 알아보려면 지원되지 않는 명령을 참조하십시오.
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
analyzeShardKey
에는 다음 구문이 있습니다.
db.adminCommand( { analyzeShardKey: <string>, key: <shardKey>, keyCharacteristics: <bool>, readWriteDistribution: <bool>, sampleRate: <double>, sampleSize: <int> } )
명령 필드
필드 | 유형 | 필요성 | 설명 |
---|---|---|---|
analyzeShardKey | 문자열 | 필수 사항 | 분석할 collection의 네임스페이스입니다. 기본값 은 없습니다. |
key | 문서 | 필수 사항 | 분석할 샤드 키입니다. 이는 샤딩되지 않은 컬렉션 또는 샤딩된 컬렉션의 후보 샤드 키 또는 샤딩된 컬렉션의 현재 샤드 키일 수 있습니다. 기본값 은 없습니다. |
keyCharacteristics | 부울 | 옵션 | 샤드 키의 특성에 대한 지표의 계산 여부입니다. 자세한 내용은 keyCharacteristics를 참조하세요. 기본값은 |
readWriteDistribution | 부울 | 옵션 | 읽기 및 쓰기 분포에 대한 지표의 계산 여부입니다. 자세한 내용은 readWriteDistribution을 참조하세요. 기본값은
|
sampleRate | double | 옵션 | 샤드 키 의 특성에 대한 지표 를 계산할 때 샘플 할 컬렉션 의 문서 비율입니다.
기본값 은 없습니다. |
sampleSize | integer | 옵션 | 샤드키 특성에 대한 지표를 계산할 때 샘플링할 문서 수입니다. 지정되지 않았으며 |
행동
analyzeShardKey
메서드를 실행할 때 지정한 keyCharacteristic
및 readWriteDistribution
값에 따라 다른 지표를 반환합니다.
샤드 주요 특성에 대한 지표
keyCharacteristic
는 샤드 키의 카디널리티, 빈도, 단조성 에 대한 지표로 구성됩니다. 이 지표는 keyCharacteristics
이 참인 경우에만 반환됩니다.
지표 는 컬렉션 에서 샘플링된 문서를 기반으로 analyzeShardKey
가 실행 때 계산됩니다. 계산을 위해서는 샤드 키 에 지원 인덱스 가 있어야 합니다. 지원 인덱스 가 없는 경우 지표 가 반환되지 않습니다.
sampleRate
및 sampleSize
필드를 사용하여 샘플링을 구성할 수 있습니다. 둘 다 선택 사항이며 하나만 지정할 수 있습니다. 둘 다 지정하지 않으면 샘플 크기가 10
로 설정됩니다. analyzeShardKeyCharacteristicsDefaultSampleSize
을(를) 설정하여 이 값을 구성합니다.
collection의 모든 문서를 기반으로 지표를 계산하려면 sampleRate
을 1
로 설정합니다.
읽기 및 쓰기 분포에 대한 지표
readWriteDistribution
쿼리 라우팅 패턴과 샤드 키 범위의 핫스팟에 대한 지표가 포함되어 있습니다. 이 지표는 샘플링된 쿼리를 기반으로 합니다.
collection에 대한 쿼리 샘플링을 구성하려면 configureQueryAnalyzer
명령을 사용합니다. 읽기 및 쓰기 분포 지표는 readWriteDistribution
가 true
인 경우에만 반환됩니다. 지표는 analyzeShardKey
가 실행될 때 계산되며 지표는 샘플링된 읽기 및 쓰기 쿼리를 사용합니다. 샘플링된 쿼리가 없는 경우 읽기 및 쓰기 분포 지표가 반환되지 않습니다.
샘플링된 읽기 쿼리가 없는 경우 명령은
writeDistribution
을 반환하지만readDistribution
은(는) 생략됩니다.샘플링된 쓰기 쿼리가 없는 경우 명령은
readDistribution
을 반환하지만writeDistribution
은(는) 생략합니다.
analyzeShardKey
를 사용하여 컬렉션 에 대한 읽기 및 쓰기 (write) 분포 지표 를 반환하려면 컬렉션 에서 실행 되는 쿼리를 샘플 하도록 쿼리 분석기 를 구성해야 합니다. 그렇지 않으면 analyzeShardKey
는 읽기 및 쓰기 (write) 분포 지표 를 0
값으로 반환합니다. 쿼리 분석기 를 구성하려면 configureQueryAnalyzer를 참조하세요 .
keyCharacteristics 값 | readWriteDistribution 값 | 반환된 결과 |
---|---|---|
true | false |
|
false | true | analyzeShardKey readWriteDistribution 지표 를 반환하고 keyCharacteristics 지표 를 생략합니다. |
true | true |
|
비차단 동작
analyzeShardKey
collection에 대한 읽기 또는 쓰기를 차단하지 않습니다.
쿼리 샘플링
읽기 및 쓰기 분산에 대한 지표의 품질은 쿼리 샘플링이 발생할 때 워크로드의 대표성 정도에 따라 결정됩니다. 일부 애플리케이션의 경우 대표 메트릭을 반환하려면 며칠 동안 쿼리 샘플링을 켜 두어야 할 수 있습니다.
지원 인덱스
analyzeShardKey
에 필요한 지원 인덱스는 shardCollection
명령에 필요한 지원 인덱스와 다릅니다.
이 표는 analyzeShardKey
및 shardCollection
모두에 대해 동일한 샤드 키에 대해 지원하는 인덱스를 보여줍니다.
명령 | 샤드 키 | 지원 인덱스 |
---|---|---|
| { a.x: 1, b: "hashed" } |
|
shardCollection | { a.x: 1, b: "hashed" } | { a.x: 1, b: "hashed", ... } |
이를 통해 아직 샤딩에 필요한 지원 인덱스가 없을 수 있는 샤드 키를 분석할 수 있습니다.
analyzeShardKey
및 shardCollection
모두 다음과 같은 인덱스 요구 사항이 있습니다.
지원 인덱스를 만들려면 db.collection.createIndex()
메서드를 사용합니다.
읽기 설정
성능을 최소화하려면 secondary
또는 secondaryPreferred
읽기 설정 (read preference)으로 analyzeShardKey
를 실행합니다. 샤드 cluster에서 mongos
는 지정하지 않으면 자동으로 읽기 설정 (read preference)을 secondaryPreferred
로 설정합니다.
제한 사항
독립형 배포에서는
analyzeShardKey
를 실행할 수 없습니다.--shardsvr
복제본 세트에 대해 직접analyzeShardKey
를 실행할 수 없습니다. 샤드 cluster에서 실행할 때는analyzeShardKey
을(를)mongos
에 대해 실행해야 합니다.time-series collection에 대해
analyzeShardKey
를 실행할 수 없습니다.Queryable Encryption을 사용하는 컬렉션에 대해
analyzeShardKey
를 실행할 수 없습니다.
액세스 제어
analyzeShardKey
에는 다음 역할 중 하나가 필요합니다.
enableSharding
분석 중인 collection에 대한 권한 조치입니다.clusterManager
역할을 수행합니다.
출력
analyzeShardKey
keyCharacteristics 및 readWriteDistribution 에 관한 정보를 반환합니다.
keyCharacteristics
샤드 키의 카디널리티, 빈도, 단조성에 대한 지표를 제공합니다.readWriteDistribution
쿼리 라우팅 패턴과 샤드 키 범위의 핫스팟에 대한 지표를 제공합니다.
keyCharacteristics
다음은 keyCharacteristics
을 true
로 설정할 때 반환되는 keyCharacteristics
문서의 구조입니다.
{ keyCharacteristics: { numDocsTotal: <integer>, numOrphanDocs: <integer>, avgDocSizeBytes: <integer>, numDocsSampled: <integer>, isUnique: <bool>, numDistinctValues: <integer>, mostCommonValues: [ { value: <shardkeyValue>, frequency: <integer> }, ... ], monotonicity: { recordIdCorrelationCoefficient: <double>, type: "monotonic"|"not monotonic"|"unknown", } } }
필드 | 유형 | 설명 | 사용법 |
---|---|---|---|
numDocsTotal | integer | collection의 문서 수입니다. | |
numOrphanDocs | integer | 고아 문서 수입니다. | 고아 문서는 성능상의 이유로 지표 계산에서 제외되지 않습니다. numOrphanDocs 가 numDocsTotal 에 비해 큰 경우 고아 문서 수가 collection의 총 문서 수에 비해 매우 작아질 때까지 명령을 실행하는 것이 좋습니다. |
avgDocSizeBytes | integer | collection에 있는 문서의 평균 크기(바이트)입니다. | numDocsTotal 을 numDocsSampled 과 비교하면 각 mostCommonValues 의 frequency 에 avgDocSizeBytes 를 곱하여 가장 큰 청크의 크기를 추정할 수 있습니다. |
numDocsSampled | integer | 샘플링된 문서 수입니다. | |
numDistinctValues | integer | 고유한 샤드 키 값의 수입니다. | 고유 샤드 키 값의 수는 밸런서가 생성할 수 있는 최대 청크 수이므로 numDistinctValues 가 큰 샤드 키를 선택합니다. |
isUnique | 부울 | 샤드 키가 고유한지 여부를 나타냅니다. 이 값은 샤드 키에 대한 고유 인덱스가 있는 경우에만 true 로 설정됩니다. | 샤드 키가 고유한 경우 고유 값의 수는 문서 수와 동일합니다. |
mostCommonValues | 문서 배열 | 가장 일반적인 샤드 키 값의 값과 frequency (문서 수)의 배열입니다. | 샤드 키 값의 빈도는 해당 값을 포함하는 청크에 있는 최소 문서 수입니다. 빈도가 높으면 청크가 저장, 읽기 및 쓰기에 병목 현상이 발생할 수 있습니다. 가장 일반적인 각 값의 빈도가 가장 일반적인 샤드 키 값의 수는 |
mostCommonValues[n].value | 문서 | 샤드 키입니다. | |
mostCommonValues[n].frequency | integer | 지정된 샤드 키에 대한 문서 수입니다. | 가장 일반적인 각 값의 빈도가 numDocsSampled 에 비해 낮은 샤드 키를 선택합니다. |
monotonicity.
recordIdCorrelationCoefficient | double | 단조성을 알려진 경우에만 설정됩니다. | 다음 중 하나에 해당하면
collection이 청크 마이그레이션을 거친 경우 단조성 검사는 잘못된 결과를 반환할 수 있습니다. 청크 마이그레이션은 기증자 샤드에서 문서를 삭제하고 수신자 샤드에 다시 삽입합니다. 클라이언트의 삽입 순서가 유지된다는 보장은 없습니다. analyzeShardKeyMonotonycityCorrelationCofluentThreshold를 사용하여 상관 계수에 대한 임계값을 구성할 수 있습니다. |
monotoncity.type | 문자열 | 다음 중 하나일 수 있습니다.
| 새 문서를 자주 삽입할 것으로 예상되지 않는 경우가 아니라면 단조롭게 증가하거나 감소하는 샤드 키의 collection이 샤딩되는 경우, |
readWriteDistribution
다음은 readWriteDistribution
을 true
로 설정할 때 반환되는 문서의 구조입니다.
{ readDistribution: { sampleSize: { total: <integer>, find: <integer>, aggregate: <integer>, count: <integer>, distinct: <integer> }, percentageOfSingleShardReads: <double>, percentageOfMultiShardReads: <double>, percentageOfScatterGatherReads: <double>, numReadsByRange: [ <integer>, ... ] }, writeDistribution: { sampleSize: { total: <integer>, update: <integer>, delete: <integer>, findAndModify: <integer> }, percentageOfSingleShardWrites: <double>, percentageOfMultiShardWrites: <double>, percentageOfScatterGatherWrites: <double>, numWritesByRange: [ <integer>, ... ], percentageOfShardKeyUpdates: <double>, percentageOfSingleWritesWithoutShardKey: <double>, percentageOfMultiWritesWithoutShardKey: <double> } }
analyzeShardKey
를 사용하여 컬렉션 에 대한 읽기 및 쓰기 (write) 분포 지표 를 반환하려면 컬렉션 에서 실행 되는 쿼리를 샘플 하도록 쿼리 분석기 를 구성해야 합니다. 그렇지 않으면 analyzeShardKey
는 읽기 및 쓰기 (write) 분포 지표 를 0
값으로 반환합니다. 쿼리 분석기 를 구성하려면 configureQueryAnalyzer를 참조하세요 .
readDistribution 필드
필드 | 유형 | 설명 | 사용법 |
---|---|---|---|
sampleSize.total | integer | 샘플링된 읽기 쿼리의 총 개수입니다. | |
sampleSize.find | integer | 샘플링된 find 쿼리의 총 개수입니다. | |
sampleSize.aggregate | integer | 샘플링된 aggregate 쿼리의 총 개수입니다. | |
sampleSize.count | integer | 샘플링된 count 쿼리의 총 개수입니다. | |
sampleSize.distinct | integer | 샘플링된 distinct 쿼리의 총 개수입니다. | |
percentageOfSingleShardReads | double | 데이터 분산 방식에 관계없이 단일 샤드를 대상으로 하는 읽기의 백분율입니다. | |
percentageOfMultiShardReads | double | 여러 샤드를 대상으로 하는 읽기의 백분율입니다. | 이 범주에는 읽기 대상 값이 단일 샤드에 속하도록 데이터가 분산된 경우 단일 샤드만을 대상으로 할 수 있는 읽기가 포함됩니다. 쿼리가 대량의 데이터에서 작동하는 경우 하나의 샤드 대신 여러 개의 샤드를 대상으로 하는 경우 병렬 쿼리 실행으로 인해 지연 시간이 줄어들 수 있습니다. |
percentageOfScatterGatherReads | double | 데이터 분산 방식에 관계없이 분산 수집된 읽기의 비율입니다. | 이 메트릭에는 값이 높은 샤드 키는 사용하지 마세요. 분산 수집 쿼리는 대상 데이터가 없는 샤드에 미치는 영향은 크지 않지만 여전히 성능에 미치는 영향은 있습니다. 샤드 수가 많은 cluster에서는 분산 수집 쿼리가 단일 샤드를 대상으로 하는 queries보다 성능이 크게 저하됩니다. |
numReadsByRange | 정수 배열 | MinKey 에서 MaxKey 까지 정렬된 각 범위가 타겟팅된 횟수를 나타내는 숫자 배열입니다. |
범위 수는 |
writeDistribution 필드
필드 | 유형 | 설명 | 사용법 |
---|---|---|---|
sampleSize.total | integer | 샘플링된 쓰기 쿼리의 총 개수입니다. | |
sampleSize.update | integer | 샘플링된 update 쿼리의 총 개수입니다. | |
sampleSize.delete | integer | 샘플링된 delete 쿼리의 총 개수입니다. | |
sampleSize.findAndModify | integer | 샘플링된 findAndModify 쿼리의 총 개수입니다. | |
percentageOfSingleShardWrites | double | 데이터 분산 방식에 관계없이 단일 샤드를 대상으로 하는 쓰기의 백분율입니다. | |
percentageOfMultiShardWrites | double | 여러 샤드를 대상으로 하는 쓰기의 백분율입니다. | 이 범주에는 쓰기 대상 값이 단일 샤드에 속하도록 데이터가 분산된 경우 단일 샤드만 대상으로 할 수 있는 쓰기가 포함됩니다. |
percentageOfScatterGatherWrites | double | 데이터 분산 방식에 관계없이 분산 수집된 쓰기의 백분율입니다. | 일반적으로 단일 샤드를 대상으로 하는 쓰기가 더 나은 성능을 발휘하므로 이 메트릭에 대해 값이 높은 샤드 키는 피하는 것이 좋습니다. |
numWritesByRange | 정수 배열 | MinKey 에서 MaxKey 까지 정렬된 각 범위가 타겟팅된 횟수를 나타내는 숫자 배열입니다. |
범위 수는 |
percentageOfShardKeyUpdates | double | 문서의 샤드 키 값 을 업데이트 하는 쓰기 (write) 쿼리의 비율입니다. |
업데이트는 현재 재시도 가능한 쓰기 또는 트랜잭션으로만 지원되며 배치 크기 제한은 |
percentageOfSingleWritesWithoutShardKey | double | multi=false 상태이고 단일 샤드를 대상으로 지정할 수 없는 쓰기 쿼리의 비율입니다. | 이 지표에는 값이 높은 샤드 키는 사용하지 마세요. 이러한 유형의 쓰기를 수행하는 것은 내부 트랜잭션을 실행하는 것이 포함될 수 있기 때문에 비용이 많이 듭니다. |
percentageOfMultiWritesWithoutShardKey | double | multi=true 상태이고 단일 샤드를 대상으로 지정할 수 없는 쓰기 쿼리의 비율입니다. | 이 지표에는 값이 높은 샤드 키는 사용하지 마세요. |
예시
간소화된 소셜 미디어 앱 버전을 생각해 보세요. 샤딩하려는 컬렉션은 post
컬렉션입니다.
post
collection의 문서는 다음과 같은 스키마가 있습니다.
{ userId: <uuid>, firstName: <string>, lastName: <string>, body: <string>, // the field that can be modified. date: <date>, // the field that can be modified. }
배경 정보
이 앱의 사용자 수는 1500명입니다.
성 30개, 이름 45개가 있으며, 일부는 다른 이름보다 더 일반적입니다.
세 명의 유명인 사용자가 있습니다.
각 사용자는 정확히 5명의 다른 사용자를 팔로우하며 적어도 한 명의 유명인을 팔로우할 가능성이 매우 높습니다.
샘플 워크로드
각 사용자는 하루에 약 2개 정도의 게시물을 무작위로 게시합니다. 각 게시물은 게시된 직후 한 번씩 수정됩니다.
각 사용자는 6시간마다 로그인하여 지난 24시간 동안 자신의 프로필과 자신이 팔로우하는 사용자의 게시물을 읽습니다. 또한 지난 3시간 동안 임의의 게시물로 답장을 보냅니다.
앱은 모든 사용자에 대해 3일이 지난 자정에 게시물을 제거합니다.
워크로드 쿼리 패턴
이 워크로드에는 다음과 같은 쿼리 패턴이 있습니다.
find
필터가 있는 명령{ userId: , firstName: , lastName: }
find
필터가 있는 명령{ $or: [{ userId: , firstName: , lastName:, date: { $gte: }, ] }
findAndModify
필터{ userId: , firstName: , lastName: , date: }
와 함께 명령을 입력하여 본문 및 날짜 필드를 업데이트합니다.update
명령에multi: false
및 필터{ userId: , firstName: , lastName: , date: { $gte: , $lt: } }
를 사용하여 본문 및 날짜 필드를 업데이트합니다.delete
multi: true
및 필터{ userId: , firstName: , lastName: , date: { $lt: } }
가 포함된 명령
다음은 analyzeShardKey
가 일부 후보 샤드 키에 대해 반환한 지표의 예시이며, 7일 동안의 워크로드에서 수집된 샘플링된 쿼리를 포함합니다.
참고
analyzeShardKey
명령을 실행하기 전에 이 페이지 앞부분의 지원 인덱스 섹션을 읽어보세요. 분석하려는 샤드 키에 대한 지원 인덱스가 필요한 경우 db.collection.createIndex()
메서드를 사용하여 인덱스를 생성합니다.
{ lastName: 1 } keyCharacteristics
이 analyzeShardKey
명령은 social.post
collection의 { lastName: 1 }
샤드 키에 대한 지표를 제공합니다.
db.adminCommand( { analyzeShardKey: "social.post", key: { lastName: 1 }, keyCharacteristics: true, readWriteDistribution: false } )
이 명령의 출력은 다음과 유사합니다.
{ "keyCharacteristics": { "numDocsTotal" : 9039, "avgDocSizeBytes" : 153, "numDocsSampled" : 9039, "isUnique" : false, "numDistinctValues" : 30, "mostCommonValues" : [ { "value" : { "lastName" : "Smith" }, "frequency" : 1013 }, { "value" : { "lastName" : "Johnson" }, "frequency" : 984 }, { "value" : { "lastName" : "Jones" }, "frequency" : 962 }, { "value" : { "lastName" : "Brown" }, "frequency" : 925 }, { "value" : { "lastName" : "Davies" }, "frequency" : 852 } ], "monotonicity" : { "recordIdCorrelationCoefficient" : 0.0771959161, "type" : "not monotonic" }, } }
{ userId: 1 } keyCharacteristics
이 analyzeShardKey
명령은 social.post
collection의 { userId: 1 }
샤드 키에 대한 지표를 제공합니다.
db.adminCommand( { analyzeShardKey: "social.post", key: { userId: 1 }, keyCharacteristics: true, readWriteDistribution: false } )
이 명령의 출력은 다음과 유사합니다.
{ "keyCharacteristics": { "numDocsTotal" : 9039, "avgDocSizeBytes" : 162, "numDocsSampled" : 9039, "isUnique" : false, "numDistinctValues" : 1495, "mostCommonValues" : [ { "value" : { "userId" : UUID("aadc3943-9402-4072-aae6-ad551359c596") }, "frequency" : 15 }, { "value" : { "userId" : UUID("681abd2b-7a27-490c-b712-e544346f8d07") }, "frequency" : 14 }, { "value" : { "userId" : UUID("714cb722-aa27-420a-8d63-0d5db962390d") }, "frequency" : 14 }, { "value" : { "userId" : UUID("019a4118-b0d3-41d5-9c0a-764338b7e9d1") }, "frequency" : 14 }, { "value" : { "userId" : UUID("b9c9fbea-3c12-41aa-bc69-eb316047a790") }, "frequency" : 14 } ], "monotonicity" : { "recordIdCorrelationCoefficient" : -0.0032039729, "type" : "not monotonic" }, } }
{ userId: 1 } readWriteDistribution
이 analyzeShardKey
명령은 social.post
collection의 { userId: 1 }
샤드 키에 대한 지표를 제공합니다.
db.adminCommand( { analyzeShardKey: "social.post", key: { userId: 1 }, keyCharacteristics: false, readWriteDistribution: true } )
이 명령의 출력은 다음과 유사합니다.
{ "readDistribution" : { "sampleSize" : { "total" : 61363, "find" : 61363, "aggregate" : 0, "count" : 0, "distinct" : 0 }, "percentageOfSingleShardReads" : 50.0008148233, "percentageOfMultiShardReads" : 49.9991851768, "percentageOfScatterGatherReads" : 0, "numReadsByRange" : [ 688, 775, 737, 776, 652, 671, 1332, 1407, 535, 428, 985, 573, 1496, ... ], }, "writeDistribution" : { "sampleSize" : { "total" : 49638, "update" : 30680, "delete" : 7500, "findAndModify" : 11458 }, "percentageOfSingleShardWrites" : 100, "percentageOfMultiShardWrites" : 0, "percentageOfScatterGatherWrites" : 0, "numWritesByRange" : [ 389, 601, 430, 454, 462, 421, 668, 833, 493, 300, 683, 460, ... ], "percentageOfShardKeyUpdates" : 0, "percentageOfSingleWritesWithoutShardKey" : 0, "percentageOfMultiWritesWithoutShardKey" : 0 } }