샤드 키 선택
샤드 키의 선택은 사용 가능한 샤드 전체에 걸친 청크 배포 및 생성에 영향을 줍니다. 데이터 분포는 샤딩된 클러스터 내 작업의 효율성과 성능에 영향을 미칩니다.
이상적인 샤드 키를 사용하면 MongoDB가 클러스터 전체에 문서를 고르게 분산하는 동시에 일반적인 쿼리 패턴을 용이하게 할 수 있습니다.
샤드 키를 선택할 때는 다음 사항을 고려하세요:
참고
MongoDB 5.0부터는
reshardCollection
명령을 사용하여 샤드 키를 변경하고 데이터를 재배포할 수 있습니다.refineCollectionShardKey
명령을 사용하여 컬렉션의 샤드 키를 구체화할 수 있습니다.refineCollectionShardKey
명령은 기존 키에 접미사 필드를 하나 이상 추가하여 새 샤드 키를 생성합니다.샤드 키 필드가 변경할 수 없는
_id
필드가 아닌 경우 문서의 샤드 키 값을 업데이트할 수 있습니다.
중요
값이 다른 샤드 가 소유한 샤드 키 범위 에 있도록 문서의 샤드 키 값 을 정기적으로 변경하는 경우, 샤드 간에 문서 를 마이그레이션하는 데 필요한 추가 리소스로 인해 클러스터 성능에 영향 을 미칠 수 있습니다. 자세한 내용 은 청크 및 db를 사용한 데이터 분할을 참조하세요. 컬렉션.updateOne().
샤드 키 카디널리티
샤드 키의 카디널리티는 밸런서가 생성할 수 있는 최대 청크 수를 결정합니다. 가능하면 카디널리티가 높은 샤드 키를 선택하세요. 카디널리티가 낮은 샤드 키는 클러스터의 수평 규모 조정 효과를 감소시킵니다.
각각의 고유한 샤드 키 값은 특정 시점에 단일 청크에만 존재할 수 있습니다. 필드가 continent
인 사용자 데이터가 포함된 데이터 집합을 생각해 보겠습니다. continent
에서 샤딩하도록 선택한 경우 샤드 키의 카디널리티는 7
. 카디널리티가 7
이면 샤딩된 클러스터 내에 7
개 이상의 청크가 있을 수 없으며, 각 청크는 하나의 고유한 샤드 키 값을 저장할 수 있습니다. 이렇게 하면 클러스터의 유효 샤드 수도 7
개로 제한되며, 샤드를 7개 이상 추가해도 아무런 이점이 없습니다.
다음 이미지는 X
필드를 샤드 키로 사용하는 샤딩된 클러스터를 보여줍니다. X
의 카디널리티가 낮은 경우 삽입 분포는 다음과 유사할 수 있습니다.
데이터 모델에서 카디널리티가 낮은 키에 샤딩이 필요한 경우 인덱싱된 필드 조합을 사용하여 카디널리티를 높이는 것이 좋습니다.
카디널리티가 높은 샤드 키는 그 자체로 샤딩된 클러스터 전체에 데이터의 균일한 배포를 보장하지 않습니다. 샤드 키의 빈도와 샤드 키 값이 단조롭게 변경될 가능성도 데이터 분포에 영향을 미칩니다.
Shard Key Frequency
샤드 키의 frequency
는 지정된 샤드 키 값이 데이터에서 발생하는 빈도를 나타냅니다. 문서 대다수가 가능한 샤드 키 값의 일부만 포함하는 경우 해당 값이 포함된 문서를 저장하는 청크가 클러스터 내에서 병목 현상을 일으킬 수 있습니다. 또한 이러한 덩어리가 커지면 더 이상 분할할 수 없어 분할 불가능한 덩어리가 될 수도 있습니다. 이렇게 하면 클러스터 내에서 수평적 크기 조정의 효율성이 감소합니다.
다음 이미지는 X
필드를 샤드 키로 사용하는 샤딩된 클러스터를 보여줍니다. X
값의 하위 집합이 높은 빈도로 발생하는 경우 삽입 분포는 다음과 유사할 수 있습니다.
데이터 모델에 높은 빈도의 값을 갖는 키에 대한 샤딩이 필요한 경우, 고유하거나 낮은 빈도의 값을 사용하는 복합 인덱스를 사용하는 것이 좋습니다.
빈도가 낮은 샤드 키는 그 자체로 샤딩된 클러스터 전체에 데이터의 균일한 배포를 보장하지 않습니다. 샤드 키의 카디널리티와 샤드 키 값이 단조롭게 변경될 가능성도 데이터 분포에 영향을 미칩니다.
단조롭게 변경되는 샤드 키
단조롭게 증가하거나 감소하는 값의 샤드 키는 클러스터 내 단일 청크에 삽입물을 분산시킬 가능성이 높습니다.
이는 모든 cluster에 상한이 maxKey 인 범위를 캡처하는 청크가 있기 때문에 발생합니다. maxKey
는 항상 다른 모든 값보다 높은 값으로 비교됩니다. 마찬가지로, minKey 하한이 있는 범위를 캡처하는 청크가 있습니다. minKey
는 항상 다른 모든 값보다 낮은 값으로 비교됩니다.
샤드 키 값이 항상 증가하는 경우 모든 새 삽입은 maxKey
상한으로 사용하여 청크로 라우팅됩니다. 샤드 키 값이 항상 감소하는 경우 모든 새 삽입은 하한이 minKey
인 청크로 라우팅됩니다. 해당 청크가 포함된 샤드는 쓰기 작업의 병목 현상이 됩니다.
데이터 배포를 최적화하기 위해 전역 maxKey
(또는 minKey
)을 포함하는 청크는 동일한 샤드에 유지되지 않습니다. 청크가 분할되면 maxKey
(또는 minKey
) 청크가 있는 새 청크가 다른 샤드에 위치합니다.
다음 이미지는 X
필드를 샤드 키로 사용하는 샤딩된 클러스터를 보여줍니다. X
의 값이 단조 증가하는 경우 삽입 분포는 다음과 유사할 수 있습니다.
샤드 키 값이 단조롭게 감소하는 경우 모든 삽입이 대신 Chunk A
로 라우팅됩니다.
데이터 모델에 단조롭게 변경되는 키에 대한 샤딩이 필요한 경우, 해시 샤딩을사용하는 것이 좋습니다.
단조롭게 변경되지 않는 샤드 키는 그 자체로는 샤딩된 클러스터 전체에 균일한 데이터 분배를 보장하지 않습니다. 샤드 키의 카디널리티와 빈도도 데이터의 분포에 영향을 미칩니다.
쿼리 패턴 샤딩
이상적인 샤드 키는 샤딩된 클러스터 전체에 데이터를 고르게 분산하는 동시에 일반적인 쿼리 패턴을 촉진합니다. 샤드 키를 선택할 때 가장 일반적인 쿼리 패턴과 지정된 샤드 키가 해당 패턴을 다루는지 여부를 고려하세요.
샤딩된 클러스터에서 mongos
는 쿼리에 샤드 키가 포함된 경우 관련 데이터가 포함된 샤드로만 쿼리를 라우팅합니다. 쿼리에 샤드 키가 포함되어 있지 않으면 쿼리는 평가를 위해 모든 샤드에 브로드캐스트됩니다. 이러한 유형의 쿼리를 분산 수집 쿼리라고 합니다. 각 요청에 대해 여러 개의 샤드를 포함하는 쿼리는 효율성이 떨어지며 클러스터에 더 많은 샤드가 추가될 때 선형적으로 확장되지 않습니다.
이는 대량의 데이터에 대해 작동하는 집계 쿼리에는 적용되지 않습니다. 이러한 경우 분산 수집은 쿼리가 모든 샤드에서 병렬로 실행될 수 있도록 하는 유용한 접근 방식이 될 수 있습니다.