Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/

샤딩

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

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

시스템 성장을 주소 두 가지 방법은 수직 및 수평 확장.

수직 확장 은 더 강력한 CPU를 사용하거나, RAM 추가하거나, 저장 확장하여 단일 서버의 용량을 늘립니다. 사용 가능한 기술과 클라우드 공급자 hardware 구성은 수직 확장 대한 실질적인 최대치를 부과합니다.

수평적 확장 에는 시스템 데이터 세트와 로드를 여러 서버로 나누고 필요에 따라 서버를 추가하여 용량 늘리는 작업이 포함됩니다. 각 머신은 전체 워크로드 의 하위 집합을 처리하며, 이는 단일 머신의 고급 hardware 보다 비용 저렴할 수 있습니다. 그 대신 인프라와 유지 관리의 복잡성이 증가합니다.

MongoDB Atlas 에서 호스팅되는배포서버를 위해 UI 에서 클러스터를 샤드 할 수 있습니다.

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

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

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

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

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

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

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

문서의 샤드 키 값에 따라 샤드 전체에 대한 분포가 결정됩니다. 샤드 키 필드가 변경 불가능한 _id 필드가 아닌 경우 문서의 샤드 키 값을 업데이트할 수 있습니다. 자세한 내용은 문서의 샤드 키 값 변경을 참조합니다.

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

샤드 키와 그 백업 인덱스의 선택은 클러스터가 사용할 수 있는 샤딩 전략에도 영향을 줄 수 있습니다.

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

클러스터의 모든 샤드에 데이터를 균등하게 분산하기 위해 밸런서 가 배경에서 실행되어 범위샤드간에 마이그레이션 합니다.

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

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

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

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

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

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

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

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

나중에 컬렉션 리샤딩 할 수 있지만, 확장성 및 성능 문제를 방지하려면 샤드 키 선택을 신중하게 고려하세요.

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

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

MongoDB 5.1부터 사용하여 샤드 서버를 시작, 다시 시작하거나 sh.addShard() 추가할 때 CWWC(Cluster Wide Write Concern) 를 설정해야 합니다.

0}이 CWWC 설정되어 있지 않고 기본 쓰기 우려 사항이 이 되도록 샤드가 구성된 { w : 1 } 경우, 샤드 서버는 시작 또는 추가에 실패하고 오류를 반환합니다.

기본 쓰기 관심사 계산 방법에 대한 자세한 내용은 기본 쓰기 관심사 계산을 참조하세요.

참고

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

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

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

클러스터 의 모든 컬렉션 과 상호 작용 하려면 mongos 라우터에 연결해야 합니다. 여기에는 샤딩된 샤딩되지 않은 컬렉션이 포함됩니다. 클라이언트는 절대 읽기 또는 쓰기 (write) 작업을 수행하기 위해 단일 샤드에 연결해서는 안 됩니다.

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

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

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

해시된 샤딩은 샤드 키 필드 값의 해시를 계산합니다. 각 청크 는 그런 다음 해시 샤드 키 값을 기반으로 범위 할당됩니다.

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

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

해시된 값은 동일한 청크 주식 할 가능성이 거의 없으며, 특히 단조롭게 변경되는 샤드 키의 경우 더욱 균등한 데이터 배포를 제공합니다.

그러나 해시 배포는 샤드 키에 대한 범위 기반 쿼리가 단일 샤드 대상으로 할 가능성이 낮음을 의미하며, 그 결과 클러스터 전체에 걸친 브로드캐스트 작업이 더 많아집니다.

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

범위 지정 샤딩 샤드 키 값을 기반으로 데이터를 범위로 나누고 각 청크 에 해당 범위 중 하나를 할당합니다.

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

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

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

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

구역은 여러 데이터 센터에 걸쳐 있는 샤딩된 클러스터의 데이터 로컬리티를 개선합니다.

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

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

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

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

샤드 키 선택할 때 잠재적인 향후 구역 사용을 고려합니다.

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

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

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

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

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

데이터 정렬을 사용하여 새 컬렉션을 만들 때는 컬렉션 샤딩 전에 이러한 조건이 충족되는지 확인하세요.

참고

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

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

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

분산 트랜잭션 은 샤딩된 클러스터에서 다중 문서 트랜잭션을 지원 .

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

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

샤딩이 집계와 함께 작동하는 방식에 대한 자세한 내용은 실용적인 MongoDB 집계 전자책에서 샤딩 장을 읽어보세요.

돌아가기

로컬 데이터베이스.

스킬 배지 획득

'샤딩 전략'을 무료로 마스터하세요!

자세한 내용을 알아보세요.

이 페이지의 내용