Zones
이 페이지의 내용
샤딩된 클러스터에서는 샤드 키를 기반으로 샤드 데이터의 영역을 만들 수 있습니다. 각 영역을 클러스터에 있는 하나 이상의 샤드와 연결할 수 있습니다. 샤드는 여러 개의 영역과 연결할 수 있습니다. 균형 잡힌 클러스터에서 MongoDB는 영역에 포함된 청크를 해당 영역과 관련된 샤드로만 마이그레이션합니다.
구역을 적용할 수 있는 몇 가지 일반적인 배포 패턴은 다음과 같습니다.
특정 샤드 세트에서 데이터의 특정 하위 집합을 격리합니다.
가장 관련성이 높은 데이터가 애플리케이션 서버와 지리적으로 가장 가까운 샤드에 있는지 확인합니다.
샤드 하드웨어의 하드웨어/성능을 기반으로 데이터를 샤드로 라우팅합니다.
다음 이미지는 3개의 샤드와 2개의 구역이 있는 샤딩된 클러스터를 보여줍니다. A
구역은 하한이 1
이고 상한이 10
인 범위를 나타냅니다. B
구역은 하한이 10
이고 상한이 20
인 범위를 나타냅니다. 샤드 Alpha
및 Beta
에는 A
구역이 있습니다. 샤드 Beta
에도 B
구역이 있습니다. 샤드 Charlie
에 연결된 구역이 없습니다. cluster는 안정된 상태이며 구역을 위반하는 청크는 없습니다.
동작 및 작업
범위
각 구역은 collection의 샤드 키 값 중 하나 이상의 범위를 포함합니다. 구역이 포함하는 각 범위는 항상 하한선를 포함하며 상한선은 제외합니다. 구역은 범위를 공유할 수 없으며 범위가 중복될 수도 없습니다.
예를 들어 {"x": 1}
에 있는 샤드 키를 생각해 보겠습니다. 클러스터의 구역 범위는 다음과 같습니다.
{ "x" : 5 } --> { "x" : 10 } // Zone A { "x" : 10} --> { "x" : 20 } // Zone B
샤드 키 값이
7
인 문서가 구역 A로 라우팅됩니다.샤드 키 값이
10
인 문서가 구역 B로 라우팅됩니다.
해시 샤드 키 및 구역 범위
샤드 키에 해시 필드가 포함된 collection의 경우 해당 필드의 구역 범위와 데이터 분포는 해시 값을 기반으로 합니다. 이 구역에는 해시 샤드 키 값이 정의된 범위에 속하는 문서가 포함되어 있습니다. 해시 필드의 구역 범위는 해시되지 않은 필드의 구역 범위와 예측 가능한 문서 라우팅 동작이 동일하지 않습니다.
예를 들어 {"x" : "hashed"}
에 있는 샤드 키를 가정해 보겠습니다. 다음 범위는 5
부터 10
사이의 해시된 범위를 나타냅니다.
{ "x": NumberLong("4470791281878691347") } --> { "x": NumberLong("7766103514953448109") } // Zone A
샤드 키 값이
1
인 문서는 해시 값1
이 정의된 범위에 속하기 때문에 역 A로 라우팅됩니다.샤드 키 값이
15
인 문서는 해시 값15
이 정의된 범위에 속하기 때문에 역 A로 라우팅됩니다.샤드 키 값이
8
인 문서는 해시 값8
이 정의된 범위에 속하지 않기 때문에 구역 A로 라우팅되지 않습니다.
mongosh
는 지정된 매개변수의 포스트 해시 값을 계산하기 위한 convertShardKeyToHashed()
를 제공합니다.
해시 필드에서 구역 범위를 사용하는 한 가지 유효한 방법은 컬렉션의 데이터를 단일 구역의 샤드로 제한하는 것입니다. MinKey
를 하한으로, MaxKey
를 상한으로 사용하여 가능한 해시 샤드 키 값의 전체 범위를 포괄하는 구역 범위를 생성합니다.
범위를 정의하기 위해 MongoDB는 updateZoneKeyRange
명령과 관련 헬퍼 메서드 sh.updateZoneKeyRange()
및 sh.addShardTag()
를 제공합니다.
updateZoneKeyRange
데이터베이스 명령과 해당 헬퍼 sh.updateZoneKeyRange()
및 sh.addTagRange()
를 비샤드형 컬렉션 또는 존재하지 않는 컬렉션에서 실행할 수 있습니다.
컬렉션을 제거하면 관련된 영역/태그 범위가 삭제됩니다.
초기 청크 분산
샤드 컬렉션 작업은 비어 있거나 존재하지 않는 컬렉션을 샤딩하기 전에 구역 및 구역 범위를 정의하여 정의된 구역 범위에 대한 청크와 샤드 키 값의 전체 범위를 포함하는 추가 청크를 생성하고 그역 범위를 기반으로 초기 청크 분배를 수행합니다. 이러한 청크의 초기 생성 및 배포를 통해 샤딩을 더 빠르게 설정할 수 있습니다. 초기 분배 이후에는 밸런서가 앞으로의 청크 분배를 관리합니다.
MongoDB는 복합 해시 인덱스에 대한 샤딩 컬렉션을 지원합니다. 복합 해시 샤드 키를 사용하여 비어 있거나 존재하지 않는 컬렉션을 샤딩하는 경우 MongoDB가 초기 청크 생성 및 분산을 수행하려면 추가 요구 사항이 적용됩니다.
예시는 비어 있거나 존재하지 않는 컬렉션에 대한 구역 및 구역 범위 사전 정의를 참조하세요.
다음도 참조하세요.
밸런서
밸런서는 샤딩된 collection의 청크를 클러스터의 모든 샤드에 균등하게 분배하려고 시도합니다.
마이그레이션으로 표시된 각 청크에 대해 밸런서는 구성된 모든 구역의 가능한 각 대상 샤드를 확인합니다. 청크 범위가 구역에 속하면 밸런서는 청크를 해당 구역 내부의 샤드로 마이그레이션합니다. 구역에 속하지 않는 청크는 cluster의 모든 샤드에 존재할 수 있으며 정상적으로 마이그레이션됩니다.
밸런싱 라운드 중에 밸런서가 특정 샤드에 대해 구성된 구역을 위반하는 청크를 감지하면 밸런서는 해당 청크를 충돌이 없는 샤드로 마이그레이션합니다.
구역을 샤드와 연결하고 샤드 컬렉션에 대한 샤드 키 범위로 구역을 구성한 후 클러스터가 샤드 컬렉션에 대해 영향을 받는 데이터를 마이그레이션하는 데 시간이 걸릴 수 있습니다. 이는 청크의 분할과 클러스터의 현재 데이터 분산에 따라 달라집니다. 밸런싱이 완료되면 특정 구역의 문서에 대한 읽기 및 쓰기가 해당 구역 내의 샤드에만 라우팅됩니다.
일단 구성되면 밸런서는 향후 밸런싱 라운드 동안 구역을 존중합니다.
다음도 참조하세요.
샤드 키
포함할 구역에 대한 새 범위를 정의할 때 샤드 키에 포함된 필드를 사용해야 합니다. 복합 샤드 키를 사용하는 경우, 범위에는 샤드 키의 접두사가 포함되어야 합니다.
예를 들어, 샤드 키 { a : 1, b : 1, c : 1 }
가 주어진 경우 b
의 값을 포함하도록 범위를 만들거나 업데이트하려면 접두사로 a
를 포함해야 합니다. c
값을 포함하도록 범위를 만들거나 업데이트하려면 접두사로 a
및 b
를 포함해야 합니다.
샤드 키에 포함되지 않은 필드를 사용하여 범위를 생성할 수 없습니다. 예를 들어, 구역을 사용하여 지리적 위치를 기반으로 데이터를 분할하려는 경우, 샤드 키의 첫 번째 필드에 지리적 데이터가 포함되어야 합니다.
컬렉션에 대한 샤드 키를 선택할 때 구역 구성에 사용할 수 있는 필드를 고려하는 것이 좋습니다. 샤드 키 선택 시 고려할 사항은 샤드 키 선택을 참조하세요.
샤드 구역 경계
구역 범위는 항상 하한 경계를 포함하고 상한 경계를 제외합니다.
다음도 참조하세요.
Time Series 컬렉션
Zone sharding does not support time series collections. The balancer always distributes data in sharded time series collections evenly across all shards in the cluster.