영역
이 페이지의 내용
샤드 클러스터에서는 샤드 키 를 기반으로 샤드 데이터의구역 을 만들 수 있습니다. 각 구역을 클러스터에 있는 하나 이상의 샤드와 연결할 수 있습니다. 샤드는 여러 개의 구역과 연결할 수 있습니다. 균형 잡힌 클러스터에서 MongoDB는 구역에 포함된 청크 를 해당 구역과 연결된 샤드로만 마이그레이션합니다.
구역을 적용할 수 있는 몇 가지 일반적인 배포 패턴은 다음과 같습니다.
특정 샤드 세트에서 데이터의 특정 하위 집합을 격리합니다.
가장 관련성이 높은 데이터가 애플리케이션 서버와 지리적으로 가장 가까운 샤드에 있는지 확인합니다.
샤드 하드웨어의 하드웨어/성능을 기반으로 데이터를 샤드로 라우팅합니다.
다음 이미지는 3개의 샤드와 2개의 구역이 있는 샤드 클러스터를 보여줍니다. A
구역은 하한이 1
이고 상한이 10
인 범위를 나타냅니다. B
구역은 하한이 10
이고 상한이 20
인 범위를 나타냅니다. 샤드 Alpha
및 Beta
에는 A
구역이 있습니다. 샤드 Beta
에도 B
구역이 있습니다. 샤드 Charlie
에 연결된 구역이 없습니다. 클러스터는 안정된 상태이며 구역을 위반하는 청크는 없습니다.
동작 및 작업
범위
각 구역은 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()
를 제공합니다.
해시 필드에서 구역 범위를 사용하는 한 가지 유효한 방법은 collection의 데이터를 단일 구역의 샤드로 제한하는 것입니다. 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
를 포함해야 합니다.
샤드 키에 포함되지 않은 필드를 사용하여 범위를 생성할 수 없습니다. 예를 들어, 구역을 사용하여 지리적 위치를 기반으로 데이터를 분할하려는 경우, 샤드 키의 첫 번째 필드에 지리적 데이터가 포함되어야 합니다.
컬렉션에 대한 샤드 키를 선택할 때 구역 구성에 사용할 수 있는 필드를 고려하는 것이 좋습니다. 샤드 키 선택 시 고려할 사항은 샤드 키 선택을 참조하세요.
샤드 구역 경계
구역 범위는 항상 하한 경계를 포함하고 상한 경계를 제외합니다.