샤딩
이 페이지의 내용
샤딩은 데이터를 여러 머신에 분산하는 방법입니다. MongoDB는 샤딩을 사용하여 대규모 데이터 세트와 높은 처리량 작업의 배포를 지원합니다.
대규모 데이터 세트 또는 높은 처리량의 애플리케이션을 갖춘 데이터베이스 시스템은 단일 서버의 용량에 문제가 될 수 있습니다. 예를 들어 쿼리 속도가 높으면 서버의 CPU 용량이 고갈될 수 있습니다. 시스템의 RAM보다 작업 세트 크기가 크면 디스크 드라이브의 I/O 용량에 부담을 줍니다.
시스템 증대에 대응하는 방법에는 수직적 확장과 수평적 확장이 있습니다.
수직 확장에는 더 강력한 CPU를 사용하거나, RAM을 추가하거나, 스토리지 공간을 늘리는 등 단일 서버의 용량을 늘리는 것이 포함됩니다. 사용 가능한 기술의 제한으로 인해 단일 머신이 주어진 워크로드를 감당하기에 충분히 강력하지 않을 수 있습니다. 또한 클라우드 기반 제공자는 사용 가능한 하드웨어 구성에 따라 엄격한 상한선을 적용합니다. 결과적으로 수직 확장에는 실질적인 최대치가 있습니다.
수평적 확장은 시스템 데이터 세트와 로드를 여러 서버로 나누고 필요에 따라 서버를 추가하여 용량을 늘리는 것입니다. 단일 머신의 전반적인 속도나 용량은 높지 않을 수 있지만, 각 머신이 전체 워크로드의 일부를 처리하므로 잠재적으로 단일 고속 대용량 서버보다 더 나은 효율성을 제공할 수 있습니다. 배포서버의 용량을 확장하려면 필요에 따라 서버를 추가하기만 하면 되므로 단일 머신의 고급 하드웨어보다 전체 비용이 저렴할 수 있습니다. 그 대신 배포서버를 위한 인프라 및 유지 관리의 복잡성이 증가합니다.
MongoDB는 샤딩을 통한 수평적 확장을 지원합니다.
MongoDB Atlas에서 호스팅되는 배포를 위해 UI에서 컬렉션을 샤딩할 수 있습니다.
샤딩된 클러스터
참고
다음 그래픽은 샤딩된 클러스터 내 구성 요소의 상호 작용을 설명합니다.
MongoDB는 컬렉션 수준에서 데이터를 샤딩하여 클러스터의 샤드 전체에 컬렉션 데이터를 분산합니다.
샤드 키
MongoDB는 샤드 키를 사용하여 샤드 전반에서 컬렉션 문서를 분산합니다. 샤드 키는 문서의 필드 하나 또는 여러 필드로 구성됩니다.
샤딩된 컬렉션의 문서에는 샤드 키 필드가 누락될 수 있습니다. 누락된 샤드 키 필드는 문서를 여러 샤드에 분산할 때는 null 값이 있는 것으로 처리되지만, 쿼리를 라우팅할 때는 그렇지 않습니다. 자세한 내용은 누락된 샤드 키 필드를 참조하세요.
컬렉션 샤딩 시 샤드 키를 선택합니다.
문서의 샤드 키 값에 따라 샤드 전체에 대한 분포가 결정됩니다. 샤드 키 필드가 변경 불가능한 _id
필드가 아닌 경우 문서의 샤드 키 값을 업데이트할 수 있습니다. 자세한 내용은 문서의 샤드 키 값 변경을 참조합니다.
샤드 키 인덱스
채워진 컬렉션을 샤딩하려면 컬렉션에 샤드 키로 시작하는 인덱스가 있어야 합니다. 빈 컬렉션을 샤딩할 때, 컬렉션에 지정된 샤드 키에 대한 적절한 인덱스가 아직 없는 경우 MongoDB는 지원 인덱스를 생성합니다. 샤드 키 인덱스를 참조하세요.
샤드 키 전략
샤드 키 선택은 샤딩된 클러스터의 성능, 효율성 및 확장성에 영향을 줍니다. 최상의 하드웨어와 인프라를 갖춘 클러스터도 샤드 키 선택에 따라 병목 현상이 발생할 수 있습니다. 샤드 키와 그 백업 인덱스의 선택은 클러스터가 사용할 수 있는 샤딩 전략에도 영향을 줄 수 있습니다.
청크
MongoDB는 샤드 데이터를 청크로 분할합니다. 각 청크에는 샤드 키에 따라 포괄적인 하위 범위와 배타적인 상위 범위가 있습니다.
밸런서 및 균일한 데이터 분산
클러스터의 모든 샤드에 데이터를 균등하게 분배하기 위해 밸런서가 백그라운드에서 실행되어 샤드 간에 범위를 마이그레이션합니다.
샤딩의 장점
읽기/쓰기
MongoDB는 샤딩된 클러스터의 샤드 전반에 읽기 및 쓰기 워크로드를 분산시켜 각 샤드가 클러스터 작업의 하위 집합을 처리할 수 있도록 합니다. 읽기 및 쓰기 워크로드는 모두 더 많은 샤드를 추가하여 클러스터 전반에서 수평으로 확장할 수 있습니다.
샤드 키 또는 복합 샤드 키의 접두사가 포함된 쿼리의 경우, mongos
가 특정 샤드 또는 샤드 세트의 쿼리를 대상으로 삼을 수 있습니다. 이러한 타겟팅된 작업은 일반적으로 클러스터의 모든 샤드에 브로드캐스트하는 것보다 더 효율적입니다.
저장 용량
샤딩은 클러스터의 샤드 전반에 데이터를 분산시켜 각 샤드가 전체 클러스터 데이터의 하위 집합을 포함하도록 합니다. 데이터가 증가함에 따라 추가 샤드로 클러스터의 저장 용량을 늘릴 수 있습니다.
고가용성
config 서버 및 샤드를 복제본 세트로 배포하면 가용성이 향상됩니다.
하나 이상의 샤드 복제본 세트를 완전히 사용할 수 없게 되더라도 샤딩된 클러스터는 부분적으로 읽기 및 쓰기를 계속 수행할 수 있습니다. 즉, 사용할 수 없는 샤드에 있는 데이터에는 액세스할 수 없지만, 사용 가능한 샤드를 대상으로 하는 읽기 또는 쓰기는 계속 성공적으로 수행할 수 있습니다.
샤딩 전 고려 사항
샤딩된 클러스터 인프라 요구 사항과 복잡성에는 신중한 계획, 실행 및 유지 관리가 필요합니다.
나중에 컬렉션을 다시 샤딩할 수는 있지만, 확장성 및 성능 관련 문제를 피하려면 샤드 키 선택을 신중하게 고려하는 것이 중요합니다.
컬렉션 샤딩에 관한 운영 요구 사항 및 제한 사항을 이해하려면 샤딩된 클러스터의 운영 제한 사항을 참조하세요.
쿼리에 샤드 키 또는 복합 샤드 키의 접두사가 포함되지 않은 경우, mongos
가 브로드캐스트 작업을 수행하여 샤딩된 클러스터의 모든 샤드에 대해 쿼리를 실시합니다. 이러한 분산/수집 쿼리는 장기간 실행되는 작업이 될 수 있습니다.
MongoDB 5.1부터 사용하여 샤드 서버를 시작, 다시 시작하거나 sh.addShard()
추가할 때 CWWC(Cluster Wide Write Concern) 를 설정해야 합니다.
0}이 CWWC
설정되어 있지 않고 기본 쓰기 우려 사항이 이 되도록 샤드가 구성된 { w : 1 }
경우, 샤드 서버는 시작 또는 추가에 실패하고 오류를 반환합니다.
기본 쓰기 관심사 계산 방법에 대한 자세한 내용은 기본 쓰기 관심사 계산을 참조하세요.
참고
MongoDB와 활성화된 지원 계약이 있는 경우, 샤딩된 클러스터 계획 및 배포에 대한 지원을 받으려면 계정 담당자에게 문의하는 것이 좋습니다.
샤드 및 비샤드 컬렉션
데이터베이스에는 샤드 컬렉션과 비샤드 컬렉션이 혼합되어 있을 수 있습니다. 샤드 컬렉션은 클러스터의 샤드에 분할되어 분산됩니다. 비샤드 컬렉션은 모든 샤드에 위치할 수 있지만, 샤드 간에 걸쳐 존재할 수는 없습니다.
샤딩된 클러스터에 연결
샤딩된 클러스터의 모든 컬렉션과 상호 작용하려면 mongos 라우터에 연결해야 합니다. 여기에는 샤드 컬렉션과 함께 비샤드 컬렉션도 포함됩니다. 클라이언트는 읽기 또는 쓰기 작업을 수행하기 위해 단일 샤드에 연결해서는 안 됩니다.
mongosh
또는 MongoDB 드라이버를 사용하여 mongod
에 연결하는 것과 같은 방법으로 mongos
에 연결할 수 있습니다.
참고
MongoDB 8.0 부터는 샤드에서 특정 명령 만 실행 수 있습니다. 샤드 에 직접 연결하려고 하고 지원되지 않는 명령을 실행 하면 MongoDB 가 오류를 반환합니다.
"You are connecting to a sharded cluster improperly by connecting directly to a shard. Please connect to the cluster via a router (mongos)."
샤드 에 대해 지원되지 않는 데이터베이스 명령 을 직접 실행 하려면 mongos
에 연결하거나 유지 관리 전용 directShardOperations
역할 이 있어야 합니다.
샤딩 전략
MongoDB는 샤딩된 클러스터 전반에 데이터를 분산하기 위한 두 가지 샤딩 전략을 지원합니다.
해시 샤딩
해시 샤딩에는 샤드 키 필드 값의 해시를 계산하는 작업이 포함됩니다. 그런 다음 각 청크에는 해시 샤드 키 값에 따라 범위가 할당됩니다.
팁
MongoDB는 해시된 인덱스를 사용하여 쿼리를 해결할 때 해시를 자동으로 계산합니다. 애플리케이션은 해시를 계산할 필요가 없습니다.
샤드 키의 범위는 'close' 일 수 있지만, 해시 값이 같은 청크에 있을 가능성은 낮습니다. 해시된 값을 기반으로 하는 데이터 분산은 특히 샤드 키가 단조롭게 변경되는 데이터 세트에서 더욱 균일한 데이터 분산을 가능하게 합니다.
그러나 해시된 분산은 샤드 키에 대한 범위 기반 쿼리가 단일 샤드를 대상으로 할 가능성이 적다는 것을 의미하며, 그 결과 클러스터 전체에 대한 브로드캐스트 작업이 증가합니다.
자세한 내용은 해시된 샤딩을 참조하세요.
범위 지정된 샤딩
범위가 지정된 샤딩에는 샤드 키 값을 기준으로 데이터를 범위로 나누는 작업이 포함됩니다. 그런 다음 샤드 키 값을 기반으로 각 청크에 범위가 할당됩니다.
값이 'close' 인 다양한 샤드 키는 동일한 청크에 존재할 가능성이 높습니다. mongos
는 필요한 데이터가 포함된 샤드로만 작업을 라우팅할 수 있으므로 타겟팅된 작업이 가능합니다.
범위가 지정된 샤딩의 효율성은 선택한 샤드 키에 따라 달라집니다. 샤드 키를 제대로 고려하지 않으면 데이터가 고르지 않게 분산되어 샤딩의 일부 이점을 무효화하거나 성능 병목 현상을 초래할 수 있습니다. 범위 기반 샤딩을 위한 샤드 키 선택을 참조하세요.
자세한 내용은 범위가 지정된 샤딩을 참조하세요.
샤딩된 클러스터 내 구역
구역은 여러 데이터 센터에 걸쳐 있는 샤딩된 클러스터의 데이터 지역성을 개선하는 데 도움이 될 수 있습니다.
샤딩된 클러스터에서는 샤드 키를 기반으로 샤드 데이터의 영역을 만들 수 있습니다. 각 영역을 클러스터에 있는 하나 이상의 샤드와 연결할 수 있습니다. 샤드는 여러 개의 영역과 연결할 수 있습니다. 균형 잡힌 클러스터에서 MongoDB는 영역에 포함된 청크를 해당 영역과 관련된 샤드로만 마이그레이션합니다.
구역은 하나 이상의 샤드 키 값 범위를 다룹니다. 구역이 포함하는 각 범위는 항상 하한선를 포함하며 상한선은 제외합니다.
포함할 구역에 대한 새 범위를 정의할 때 샤드 키에 포함된 필드를 사용해야 합니다. 복합 샤드 키를 사용하는 경우, 범위에는 샤드 키의 접두사가 포함되어야 합니다. 자세한 내용은 구역 내 샤드 키를 참조하세요.
샤드 키를 선택할 때는 향후 구역 사용 가능성을 고려해야 합니다.
팁
비어 있거나 존재하지 않는 컬렉션을 샤딩하기 전에 구역과 구역 범위를 설정하면 구역별 샤딩을 더 빠르게 설정할 수 있습니다.
자세한 내용은 구역을 참조하세요.
샤딩 중 데이터 정렬
기본 데이터 정렬이 있는 컬렉션을 샤딩하려면 shardCollection
명령과 collation :
{ locale : "simple" }
옵션을 함께 사용하세요. 성공적인 샤딩을 위해서는 다음 사항이 필요합니다.
컬렉션에는 접두사가 샤드 키인 인덱스가 있어야 합니다.
인덱스는 다음 데이터 정렬을 보유해야 합니다.
{ locale: "simple" }
데이터 정렬을 사용하여 새 컬렉션을 생성하는 경우, 컬렉션을 샤딩하기 전에 이러한 조건이 충족되는지 확인하세요.
참고
샤드 컬렉션에 대한 쿼리는 컬렉션에 대해 구성된 기본 데이터 정렬을 계속 사용합니다. 샤드 키 인덱스의 simple
데이터 정렬을 사용하려면 쿼리의 데이터 정렬 문서에서 {locale : "simple"}
를 지정합니다.
샤딩 및 데이터 정렬에 대한 자세한 내용은 shardCollection
를 참조하세요.
변경 스트림
변경 스트림 은 복제본 세트와 샤딩된 클러스터에 사용할 수 있습니다. 변경 스트림을 사용하면 애플리케이션이 oplog 를 테일링하는 복잡성과 위험 없이 실시간 데이터 변경 사항에 액세스 수 있습니다. 애플리케이션은 변경 스트림을 사용하여 하나 이상의 컬렉션 에 대한 모든 데이터 변경 사항을 구독 할 수 있습니다.
트랜잭션
분산 트랜잭션이 도입됨에 따라 샤딩된 클러스터에서 다중 문서 트랜잭션을 사용할 수 있습니다.
트랜잭션이 커밋될 때까지 트랜잭션에서 변경된 데이터는 트랜잭션 외부에 표시되지 않습니다.
그러나 트랜잭션이 여러 샤드에 쓰기를 수행하는 경우, 모든 외부 읽기 작업이 커밋된 트랜잭션의 결과가 샤드 전체에 표시될 때까지 기다릴 필요는 없습니다. 예를 들어, 트랜잭션이 커밋되고 쓰기 1이 샤드 A에 표시되지만 쓰기 2가 샤드 B에 아직 표시되지 않는 경우, 읽기 고려 "local"
의 외부 읽기는 쓰기 2를 보지 않고 쓰기 1의 결과를 읽을 수 있습니다.
자세히 알아보기
실용적인 MongoDB 집계(전자책)
샤딩이 집계와 함께 작동하는 방식에 대한 자세한 내용은 실용적인 MongoDB 집계 전자책에서 샤딩 장을 읽어보세요.