문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

샤딩

이 페이지의 내용

  • 샤딩된 클러스터
  • 샤드 키
  • 청크
  • 밸런서 및 짝수 청크 배포
  • 샤딩의 장점
  • 샤딩 전 고려 사항
  • 샤드 및 비샤드 컬렉션
  • 샤드 클러스터에 연결
  • 샤딩 전략
  • 샤드 클러스터 내 구역
  • 샤딩 중 데이터 정렬
  • 변경 스트림
  • 트랜잭션
  • 자세히 알아보기

샤딩은 데이터를 여러 머신에 분산하는 방법입니다. MongoDB는 샤딩을 사용하여 대규모 데이터 세트와 높은 처리량 작업의 배포를 지원합니다.

대규모 데이터 세트 또는 높은 처리량의 애플리케이션을 갖춘 데이터베이스 시스템은 단일 서버의 용량에 문제가 될 수 있습니다. 예를 들어 쿼리 속도가 높으면 서버의 CPU 용량이 고갈될 수 있습니다. 시스템의 RAM보다 작업 세트 크기가 크면 디스크 드라이브의 I/O 용량에 부담을 줍니다.

시스템 증대에 대응하는 방법에는 수직적 확장과 수평적 확장이 있습니다.

수직 확장에는 더 강력한 CPU를 사용하거나, RAM을 추가하거나, 스토리지 공간을 늘리는 등 단일 서버의 용량을 늘리는 것이 포함됩니다. 사용 가능한 기술의 제한으로 인해 단일 머신이 주어진 워크로드를 감당하기에 충분히 강력하지 않을 수 있습니다. 또한 클라우드 기반 제공자는 사용 가능한 하드웨어 구성에 따라 엄격한 상한선을 적용합니다. 결과적으로 수직 확장에는 실질적인 최대치가 있습니다.

수평적 확장은 시스템 데이터 세트와 로드를 여러 서버로 나누고 필요에 따라 서버를 추가하여 용량을 늘리는 것입니다. 단일 머신의 전반적인 속도나 용량은 높지 않을 수 있지만, 각 머신이 전체 워크로드의 일부를 처리하므로 잠재적으로 단일 고속 대용량 서버보다 더 나은 효율성을 제공할 수 있습니다. 배포서버의 용량을 확장하려면 필요에 따라 서버를 추가하기만 하면 되므로 단일 머신의 고급 하드웨어보다 전체 비용이 저렴할 수 있습니다. 그 대신 배포서버를 위한 인프라 및 유지 관리의 복잡성이 증가합니다.

MongoDB는 샤딩을 통한 수평적 확장을 지원합니다.

MongoDB Atlas 에서 호스팅되는 배포 를 위해UI에서 컬렉션을 샤딩할 수 있습니다.

MongoDB 샤딩된 클러스터는 다음 컴포넌트로 구성됩니다.

  • 샤드: 각 샤드에는 샤드 데이터의 하위 집합이 포함됩니다. 각 샤드는 복제본 세트로 배포되어야 합니다.

  • mongos: mongos 는 클라이언트 애플리케이션과 샤드 cluster 간의 인터페이스를 제공하는 쿼리 역할을 합니다. mongos 는 헤지된 읽기( hedged read )를 지원하여 지연 시간을 최소화할 수 있습니다.

  • 구성 서버: 구성 서버는 클러스터에 대한 메타데이터와 구성 설정을 저장합니다. MongoDB 3.4부터 구성 서버는 복제본 세트 (CSRS)로 배포되어야 합니다.

다음 그래픽은 샤드 클러스터 내 구성 요소의 상호 작용을 설명합니다.

프로덕션 목적을 위한 샘플 샤드 클러스터의 다이어그램입니다. 정확히 3개의 config 서버, 2개 이상의 ``mongo`` 쿼리 라우터, 최소 2개의 샤드를 포함합니다. 샤드는 복제본 세트입니다.

MongoDB는 컬렉션 수준에서 데이터를 샤딩하여 클러스터의 샤드 전체에 컬렉션 데이터를 분산합니다.

MongoDB는 샤드 키를 사용하여 샤드 전반에서 컬렉션 문서를 분산합니다. 샤드 키는 문서의 필드 하나 또는 여러 필드로 구성됩니다.

문서 in sharded collection에는 샤드 키 필드가 누락될 수 있습니다. 누락된 샤드 키 필드는 문서를 여러 샤드에 분산할 때는 null 값이 있는 것으로 처리되지만, 쿼리를 라우팅할 때는 그렇지 않습니다. 자세한 내용은 누락된 샤드 키 필드를 참조하세요.

컬렉션 샤딩 시 샤드 키를 선택합니다.

문서의 샤드 키 값에 따라 샤드 전체에 대한 분포가 결정됩니다.

  • MongoDB 4.2부터 샤드 키 필드가 변경 불가능한 _id 필드가 아닌 이상 문서의 샤드 키 값을 업데이트할 수 있습니다. 자세한 내용은 문서의 샤드 키 값 변경을 참조하세요.

  • MongoDB 4.0 이하 버전에서는 문서의 샤드 키 필드 값을 변경할 수 없습니다.

채워진 컬렉션을 샤딩하려면 컬렉션에 샤드 키로 시작하는 인덱스가 있어야 합니다. 빈 컬렉션을 샤딩할 때, 컬렉션에 지정된 샤드 키에 대한 적절한 인덱스가 아직 없는 경우 MongoDB는 지원 인덱스를 생성합니다. 샤드 키 인덱스를 참조하세요.

샤드 키의 선택은 샤드 클러스터의 성능, 효율성 및 확장성에 영향을 줍니다. 최상의 하드웨어와 인프라를 갖춘 클러스터도 샤드 키 선택에 따라 병목 현상이 발생할 수 있습니다. 샤드 키와 그 백업 인덱스의 선택은 클러스터가 사용할 수 있는 샤딩 전략 에도 영향을 미칠 수 있습니다.

다음도 참조하세요.

MongoDB는 샤드 데이터를 청크로 분할합니다. 각 청크에는 샤드 키에 따라 포괄적인 하위 범위와 배타적인 상위 범위가 있습니다.

cluster의 모든 샤드에 청크를 균등하게 분배하기 위해 밸런서 가 백그라운드에서 실행되어 샤드 간에 청크 를 마이그레이션합니다.

MongoDB는 샤드 클러스터샤드 전반에 읽기 및 쓰기 워크로드를 분산시켜 각 샤드가 클러스터 작업의 하위 집합을 처리할 수 있도록 합니다. 읽기 및 쓰기 워크로드는 모두 더 많은 샤드를 추가하여 클러스터 전반에서 수평으로 확장할 수 있습니다.

샤드 키 또는 복합 샤드 키의 접두사가 포함된 쿼리의 경우, mongos가 특정 샤드 또는 샤드 세트의 쿼리를 대상으로 삼을 수 있습니다. 이러한 타겟팅된 작업은 일반적으로 클러스터의 모든 샤드에 브로드캐스트하는 것보다 더 효율적입니다.

mongos 는 헤지된 읽기( hedged read )를 지원하여 지연 시간을 최소화할 수 있습니다.

샤딩은 클러스터의 샤드 전반에 데이터를 분산시켜 각 샤드가 전체 클러스터 데이터의 하위 집합을 포함하도록 합니다. 데이터가 증가함에 따라 추가 샤드로 클러스터의 저장 용량을 늘릴 수 있습니다.

config 서버 및 샤드를 복제본 세트로 배포하면 가용성이 향상됩니다.

하나 이상의 샤드 복제본 세트를 완전히 사용할 수 없게 되더라도 샤드 클러스터는 부분적으로 읽기 및 쓰기를 계속 수행할 수 있습니다. 즉, 사용할 수 없는 샤드에 있는 데이터에는 액세스할 수 없지만, 사용 가능한 샤드를 대상으로 하는 읽기 또는 쓰기는 계속 성공적으로 수행할 수 있습니다.

샤드 클러스터 인프라 요구 사항과 복잡성에는 신중한 계획, 실행 및 유지 관리가 필요합니다.

일단 컬렉션이 샤딩되고 나면 MongoDB는 샤드 컬렉션의 샤딩을 되돌리는 메서드를 제공하지 않습니다.

나중에 컬렉션을 다시 샤딩할 수는 있지만, 확장성 및 성능 관련 문제를 피하려면 샤드 키 선택을 신중하게 고려하는 것이 중요합니다.

다음도 참조하세요.

컬렉션 샤딩에 관한 운영 요구 사항 및 제한 사항을 이해하려면 샤드 클러스터의 운영 제한 사항을 참조하세요.

쿼리에 샤드 키 또는 복합 샤드 키의 접두사가 포함되지 않은 경우, mongos브로드캐스트 작업을 수행하여 샤드 클러스터의 모든 샤드에 대해 쿼리를 실시합니다. 이러한 분산/수집 쿼리는 장기간 실행되는 작업이 될 수 있습니다.

참고

MongoDB와 활성화된 지원 계약이 있는 경우, 샤드 클러스터 계획 및 배포에 대한 지원을 받으려면 계정 담당자에게 문의하는 것이 좋습니다.

데이터베이스에는 샤드 컬렉션과 비샤드 컬렉션이 혼합되어 있을 수 있습니다. 샤드 컬렉션은 클러스터의 샤드분할되어 분산됩니다. 비샤드 컬렉션은 프라이머리 샤드에 저장됩니다. 각 데이터베이스에는 고유한 프라이머리 샤드가 있습니다.

프라이머리 샤드의 다이어그램입니다. 프라이머리 샤드에는 샤딩되지 않은 컬렉션뿐만 아니라 샤드 컬렉션의 문서 청크도 포함됩니다. 샤드 A가 프라이머리 샤드입니다.

샤드 클러스터의 모든 컬렉션과 상호 작용하려면 mongos 라우터에 연결해야 합니다. 여기에는 샤드 컬렉션과 함께 비샤드 컬렉션도 포함됩니다. 클라이언트는 읽기 또는 쓰기 작업을 수행하기 위해 단일 샤드에 연결해서는 안 됩니다.

샤딩되지 않은 컬렉션과 샤드 컬렉션을 위해 mongos에 쿼리를 발행하는 애플리케이션/드라이버의 다이어그램입니다. Config 서버가 표시되지 않습니다.

또는 MongoDB 드라이버 mongod mongosh 를 사용하여 mongos 에 연결하는 것과 같은 방식으로 에 연결할 수 있습니다.

MongoDB는 샤드 클러스터 전반에 데이터를 분산하기 위한 두 가지 샤딩 전략을 지원합니다.

해시 샤딩에는 샤드 키 필드 값의 해시를 계산하는 작업이 포함됩니다. 그런 다음 각 청크에는 해시 샤드 키 값에 따라 범위가 할당됩니다.

MongoDB는 해시된 인덱스를 사용하여 쿼리를 해결할 때 해시를 자동으로 계산합니다. 애플리케이션은 해시를 계산할 필요가 없습니다.

해시 기반 세분화 다이어그램.

샤드 키의 범위는 'close' 일 수 있지만, 해시 값이 같은 청크에 있을 가능성은 낮습니다. 해시된 값을 기반으로 하는 데이터 분산은 특히 샤드 키가 단조롭게 변경되는 데이터 세트에서 더욱 균일한 데이터 분산을 가능하게 합니다.

그러나 해시된 분산은 샤드 키에 대한 범위 기반 쿼리가 단일 샤드를 대상으로 할 가능성이 적다는 것을 의미하며, 그 결과 클러스터 전체에 대한 브로드캐스트 작업이 증가합니다.

자세한 내용은 해시된 샤딩을 참조하세요.

범위가 지정된 샤딩에는 샤드 키 값을 기준으로 데이터를 범위로 나누는 작업이 포함됩니다. 그런 다음 샤드 키 값을 기반으로 각 청크에 범위가 할당됩니다.

더 작은 범위 또는 청크로 분할된 샤드 키 값 공간의 다이어그램.

값이 'close' 인 다양한 샤드 키는 동일한 청크에 존재할 가능성이 높습니다. mongos는 필요한 데이터가 포함된 샤드로만 작업을 라우팅할 수 있으므로 타겟팅된 작업이 가능합니다.

범위가 지정된 샤딩의 효율성은 선택한 샤드 키에 따라 달라집니다. 샤드 키를 제대로 고려하지 않으면 데이터가 고르지 않게 분산되어 샤딩의 일부 이점을 무효화하거나 성능 병목 현상을 초래할 수 있습니다. 범위 기반 샤딩을 위한 샤드 키 선택을 참조하세요.

자세한 내용은 범위가 지정된 샤딩을 참조하세요.

구역은 여러 데이터 센터에 걸쳐 있는 샤드 클러스터의 데이터 지역성을 개선하는 데 도움이 될 수 있습니다.

샤드 클러스터에서는 샤드 키를 기반으로 샤드 데이터의 영역을 만들 수 있습니다. 각 영역을 클러스터에 있는 하나 이상의 샤드와 연결할 수 있습니다. 샤드는 여러 개의 영역과 연결할 수 있습니다. 균형 잡힌 클러스터에서 MongoDB는 영역에 포함된 청크를 해당 영역과 관련된 샤드로만 마이그레이션합니다.

구역은 하나 이상의 샤드 키 값 범위를 다룹니다. 구역이 포함하는 각 범위는 항상 하한선를 포함하며 상한선은 제외합니다.

샤드 클러스터의 구역을 기반으로 하는 데이터 분포 다이어그램
클릭하여 확대

포함할 구역에 대한 새 범위를 정의할 때 샤드 키에 포함된 필드를 사용해야 합니다. 복합 샤드 키를 사용하는 경우, 범위에는 샤드 키의 접두사가 포함되어야 합니다. 자세한 내용은 구역 내 샤드 키를 참조하세요.

샤드 키를 선택할 때는 향후 구역 사용 가능성을 고려해야 합니다.

MongoDB 4.0.3부터는 비어 있거나 존재하지 않는 컬렉션을 샤딩하기 전에 구역과 구역 범위를 설정하면 구역별 샤딩을 더 빠르게 설정할 수 있습니다.

자세한 내용은 구역을 참조하세요.

기본 데이터 정렬이 있는 컬렉션을 샤딩하려면 shardCollection 명령과 collation : { locale : "simple" } 옵션을 함께 사용하세요. 성공적인 샤딩을 위해서는 다음 사항이 필요합니다.

  • 컬렉션에는 접두사가 샤드 키인 인덱스가 있어야 합니다.

  • 인덱스는 다음 데이터 정렬을 보유해야 합니다. { locale: "simple" }

데이터 정렬을 사용하여 새 컬렉션을 생성하는 경우, 컬렉션을 샤딩하기 전에 이러한 조건이 충족되는지 확인하세요.

참고

샤드 컬렉션에 대한 쿼리는 컬렉션에 대해 구성된 기본 데이터 정렬을 계속 사용합니다. 샤드 키 인덱스의 simple 데이터 정렬을 사용하려면 쿼리의 데이터 정렬 문서에서 {locale : "simple"}를 지정합니다.

샤딩 및 데이터 정렬에 대한 자세한 내용은 shardCollection를 참조하세요.

MongoDB 3.6부터는 복제본 세트와 샤드 클러스터에 대해 변경 스트림을 사용할 수 있습니다. 변경 스트림을 통해 애플리케이션은 복잡한 방식 및 oplog를 테일링하는 위험 없이 실시간 데이터 변경에 액세스할 수 있습니다. 애플리케이션은 변경 스트림을 사용하여 단일 또는 복수 컬렉션의 모든 데이터 변경 사항을 구독할 수 있습니다.

MongoDB 4.2부터 분산된 트랜잭션이 도입되면서 샤드 클러스터에서 다중 문서 트랜잭션을 사용할 수 있습니다.

트랜잭션이 커밋될 때까지 트랜잭션에서 변경된 데이터는 트랜잭션 외부에 표시되지 않습니다.

그러나 트랜잭션이 여러 샤드에 쓰기를 수행하는 경우, 모든 외부 읽기 작업이 커밋된 트랜잭션의 결과가 샤드 전체에 표시될 때까지 기다릴 필요는 없습니다. 예를 들어, 트랜잭션이 커밋되고 쓰기 1이 샤드 A에 표시되지만 쓰기 2가 샤드 B에 아직 표시되지 않는 경우, 읽기 고려 "local"의 외부 읽기는 쓰기 2를 보지 않고 쓰기 1의 결과를 읽을 수 있습니다.

샤딩이 애그리게이션 과 함께 작동하는 방식에 대한 자세한 내용은 실용적인 MongoDB 애그리게이션 의 샤딩 장을 참조하세요. 전자책.

← 복제본 세트 노드 상태.