mongos
이 페이지의 내용
MongoDB mongos
인스턴스는 샤드 클러스터에서 쿼리 및 쓰기 작업을 샤드로 라우팅합니다. mongos
는 애플리케이션 관점에서 샤딩된 클러스터에 대한 유일한 인터페이스를 제공합니다. 애플리케이션이 샤드와 직접 연결하거나 통신하지 않습니다.
mongos
는 config 서버에서 메타데이터를 캐싱하여 어떤 데이터가 어떤 샤드에 있는지 추적합니다. mongos
는 메타데이터를 사용하여 애플리케이션 및 클라이언트에서 mongod
인스턴스로 작업을 라우팅합니다. mongos
에는 영구 상태가 없으며 최소한의 시스템 리소스를 사용합니다.
가장 일반적인 방법은 애플리케이션 서버와 동일한 시스템에서 mongos
인스턴스를 실행하는 것이지만 샤드 또는 기타 전용 리소스에서 mongos
인스턴스를 유지할 수 있습니다. mongos
의 수와 분포를 참조하세요.
라우팅 및 결과 프로세스
mongos
인스턴스는 다음과 같은 방법으로 쿼리를 클러스터 로 라우팅합니다.
쿼리를 수신해야 하는 샤드 목록을 결정합니다.
모든 타겟팅된 샤드에 커서를 설정합니다.
그런 다음 mongos
는 각 대상 샤드의 데이터를 병합하고 결과 문서를 반환합니다. 정렬과 같은 특정 쿼리 수정자는 mongos
가 결과를 검색하기 전에 각 샤드에서 수행됩니다.
여러 샤드에서 실행되는 집계 작업은 데이터베이스의 프라이머리 샤드에서 실행할 필요가 없는 경우 결과를 병합하기 위해 결과를 mongos
로 다시 라우팅할 수 있습니다.
파이프라인을mongos
에서 실행할 수 없는 두 가지 경우가 있습니다.
첫 번째 경우는 분할 파이프라인의 병합 부분에 반드시 프라이머리 샤드에서 실행되어야 하는 단계가 포함되어 있을 때 발생합니다. 예를 들어, $lookup
이 집계를 실행하고 있는 샤드 컬렉션과 동일한 에 데이터베이스에 있는 비샤드 컬렉션에 액세스해야 하는 경우, 병합은 프라이머리 샤드에서 실행되어야 합니다.
두 번째 경우는 분할 파이프라인의 병합 부분에 임시 데이터를 디스크에 쓸 수 있는 단계(예: $group
)가 포함되어 있고 클라이언트가 allowDiskUse:true
를 지정한 경우에 발생합니다. 이 경우, 병합 파이프라인에 프라이머리 샤드가 필요한 다른 단계가 없다고 가정하면, 병합은 집계 대상 샤드 집합에서 임의로 선택된 샤드에서 실행됩니다.
샤딩된 클러스터 쿼리의 구성 요소 간에 집계 작업을 분할하는 방법에 대한 자세한 내용은 aggregate()
호출의 매개 변수로 explain:true
를 사용하세요. 세 개의 JSON 객체가 반환됩니다. mergeType
는 병합 단계가 발생하는 위치("primaryShard", "anyShard" 또는 "mongos")를 보여 줍니다. splitPipeline
에는 개별 샤드에서 파이프라인의 어떤 작업이 실행되었는지 표시됩니다. shards
은 각 샤드가 수행한 작업을 보여줍니다.
경우에 따라, 샤드 키 또는 샤드 키의 접두사가 쿼리의 일부인 경우 mongos
는 클러스터의 샤드 하위 집합으로 쿼리를 라우팅하는 타겟팅 작업을 수행합니다.
mongos
샤드 키를 포함하지 않는 쿼리에 대해 브로드캐스트 작업을 수행하여 쿼리를 클러스터의 모든 샤드로 라우팅합니다. 샤드 키를 포함하는 일부 쿼리는 클러스터의 데이터 분포와 쿼리의 선택성에 따라 여전히 브로드캐스트 작업이 발생할 수 있습니다.
타겟팅 작업과 브로드캐스트 작업에 대한 자세한 내용은 타겟팅 작업 VS 브로드캐스트 작업을 참조하세요.
mongos
헤지된 읽기(hedged read)를 지원하여 지연 시간을 최소화할 수 있습니다. 자세한 내용은 헤지된 읽기(hedged read)를 참조하세요.
mongos
가 쿼리 수정자를 처리하는 방법
정렬
쿼리 결과가 정렬되지 않은 경우, mongos
인스턴스는 샤드의 모든 커서에서 "라운드 로빈" 결과를 가져오는 결과 커서를 엽니다.
제한
쿼리가 limit()
커서 메서드를 사용하여 결과 세트의 크기를 제한하면 mongos
인스턴스는 해당 제한을 샤드에 전달한 다음 결과를 클라이언트에 반환하기 전에 결과에 제한을 다시 적용합니다.
건너뛰기
쿼리가 skip()
커서 메서드를 사용하여 건너뛰기할 레코드 수를 지정하는 경우 mongos
는 분할된 데이터베이스에 건너뛰기를 전달할 수 없지만 분할된 데이터베이스에서 건너뛰지 않은 결과를 검색하고 전체 결과를 조합할 때 적절한 수의 문서를 건너 뜁니다.
limit()
을 함께 사용하면 mongos
가 작업 효율성 개선을 위해 제한 및 skip()
값을 샤드에 전달합니다.
읽기 설정 및 샤드
샤딩된 클러스터의 경우 mongos
는 샤드에서 읽을 때 읽기 설정을 적용합니다. 선택된 노드는 읽기 설정과 replication.localPingThresholdMs
설정의 적용을 받으며, 각 작업마다 다시 평가됩니다.
읽기 설정 및 샤딩된 클러스터에 대한 자세한 내용은 읽기 설정 및 샤드를 참조하세요.
헤지된 읽기
mongos
인스턴스는primary
이외의 읽기 설정(read preference)을 사용하는 읽기를 헤지할 수 있습니다. 헤지된 읽기(hedged read)를 사용하면 mongos
인스턴스는 쿼리된 각 샤드당 2개의 복제본 세트 멤버로 읽기 작업을 라우팅하고 샤드당 첫 번째 응답자로부터 결과를 반환합니다. 읽기 작업을 헤지하기 위해 전송된 추가 읽기는 maxTimeMSForHedgedReads
의 maxTimeMS
값을 사용합니다.
다음 작업에 대해 헤지된 읽기(hedged read)가 지원됩니다:
헤지된 읽기(hedged read) 및 읽기 설정
헤지된 읽기(hedged read)는 읽기 설정의 일부로 작업별로 지정됩니다. 비-primary
읽기 설정은 헤지된 읽기(hedged read)를 지원합니다. 헤지된 읽기(hedged read) 설정항목을 참조하십시오.
primary
이외의 읽기 설정에 대해 헤지된 읽기(hedged read)를 지정하려면 드라이버 읽기 기본 설정 API 문서를 참조하세요.읽기 설정
nearest
는 기본적으로 헤지된 읽기(hedged read) 옵션을 활성화합니다.
읽기 설정 및 샤딩된 클러스터, 노드 선택에 대한 자세한 내용은 읽기 설정 및 샤드를 참조하세요.
헤지된 읽기(hedged read)에 대한 지원 활성화/비활성화
기본적으로 mongos
인스턴스는 헤지된 읽기(hedged read) 사용을 지원합니다. 헤지된 읽기(hedged read)에 대한 mongos
인스턴스의 지원을 끄려면 readHedgingMode
매개변수를 참조하세요. 헤지된 읽기(hedged read) 지원이 off
인 경우 mongos
는 읽기 설정에 지정된 hedge
옵션에 관계없이 헤지된 읽기(hedged read)를 사용하지 않습니다.
헤지된 읽기 진단
serverStatus
명령과 해당 mongosh
메서드 db.serverStatus()
는 hedgingMetrics
를 반환합니다.
인스턴스에 대한 연결 확인 mongos
클라이언트가 연결된 MongoDB 인스턴스가 mongos
인지 확인하려면 hello
명령을 사용합니다. 클라이언트가 mongos
에 연결하면 hello
는 isdbgrid
문자열을 포함하는 msg
필드가 있는 문서를 반환합니다. 예시:
{ "isWritablePrimary" : true, "msg" : "isdbgrid", "maxBsonObjectSize" : 16777216, "ok" : 1, ... }
애플리케이션이 mongod
에 연결되어 있는 경우에는 반환되는 문서에 isdbgrid
문자열이 포함되지 않습니다.
타겟팅 운영과 브로드캐스트 운영 비교
일반적으로, 샤드 환경에서 가장 빠른 쿼리는 mongos
가 config 서버에서 샤드 키와 클러스터 메타데이터를 사용하여 단일 샤드로 라우팅하는 쿼리입니다. 이러한 대상 작업은 샤드 키 값을 사용하여 쿼리 문서를 충족하는 샤드 또는 샤드의 하위 집합을 찾습니다.
샤드 키가 포함되지 않은 쿼리의 경우 mongos
는 모든 샤드를 쿼리하고 응답을 기다린 다음 결과를 애플리케이션에 반환해야 합니다. 이러한 '분산/수집' 쿼리 작업은 오래 실행될 수 있습니다.
브로드캐스트 작업
mongos
인스턴스는 이 데이터를 저장하는 샤드 또는 샤드의 하위 집합을 확인할 수 없는 경우를 제외하고 mongos
는 컬렉션의 모든 샤드에 쿼리를 브로드캐스트합니다
mongos
가 모든 샤드에서 응답을 수신한 후 데이터를 병합하고 결과 문서를 반환합니다. 브로드캐스트 작업의 성능은 클러스터의 전체 부하뿐만 아니라 네트워크 대기 시간, 개별 샤드 로드, 샤드당 반환되는 문서 수와 같은 변수에 따라 달라집니다. 가능하면 브로드캐스트 작업을 발생시키는 작업보다 타겟팅된 작업 을 발생시키는 작업을 선호합니다.
다중 업데이트 작업은 항상 브로드캐스트 작업입니다.
updateMany()
및 deleteMany()
메서드는 쿼리 문서에서 샤드 키 전체를 지정하지 않는 한 브로드캐스트 작업입니다.
타겟팅된 작업
mongos
은(는) 샤드 키 또는 복합 샤드 키의 접두사가 포함된 쿼리를 특정 샤드 또는 샤드 집합으로 라우팅할 수 있습니다. mongos
은(는) 샤드 키 값을 사용하여 범위에 샤드 키 값이 포함된 청크를 찾고 해당 청크가 포함된 샤드에서 쿼리를 보냅니다.
예를 들어, 샤드 키가 다음과 같은 경우입니다.
{ a: 1, b: 1, c: 1 }
mongos
프로그램은 특정 샤드 또는 샤드 집합에서 전체 샤드 키 또는 다음 샤드 키 접두사 중 하나를 포함하는 쿼리를 라우팅할 수 있습니다.
{ a: 1 } { a: 1, b: 1 }
모든 insertOne()
작업은 하나의 샤드를 대상으로 합니다. insertMany()
배열의 각 문서는 단일 분할된 데이터베이스를 대상으로 하지만 배열의 모든 문서가 단일 분할된 데이터베이스에 삽입된다는 보장은 없습니다.
모든 updateOne()
, replaceOne()
및 deleteOne()
작업에는 반드시 쿼리 문서에 샤드 키 또는 _id
이(가) 포함되어야 합니다. 이러한 메서드가 샤드 키 또는 _id
없이 사용되는 경우 MongoDB는 오류를 반환합니다.
cluster 내 데이터 분포와 쿼리의 선택도에 따라 mongos
는 쿼리를 처리하고자 브로드캐스트 작업을 수행할 수 있습니다.
인덱스 사용하기
샤드는 쿼리를 수신하면 해당 쿼리를 처리하는 데 사용할 수 있는 것 중 가장 효율적인 인덱스를 사용합니다. 사용되는 인덱스는 샤드 키 인덱스 또는 샤드에 존재하는 다른 적합한 인덱스일 수 있습니다.
샤딩된 클러스터 보안
자체 관리형 내부/멤버십 인증을 사용하여 클러스터 내 보안을 시행하고 권한이 없는 클러스터 구성 요소가 클러스터에 액세스하지 못하도록 합니다. 내부 인증을 집행하려면 클러스터의 각 mongod
또는 mongos
를 적절한 보안 설정으로 시작해야 합니다.
자체 관리형 샤딩된 클러스터 배포에 대한 튜토리얼은 키파일 인증을 사용하여 클러스터 배포하기를 참조하세요.
클러스터 사용자
샤딩된 클러스터는 클러스터 데이터 및 작업에 대한 무단 액세스를 제한하기 위해 자체 관리형 배포의 Role-Based Access Control(RBAC)를 지원합니다. RBAC를 시행하려면 Config 서버를 포함하여 클러스터의 각 mongod
를 --auth
옵션과 함께 시작해야 합니다. 또는 클러스터 간 보안을 위해 자체 관리형 내부/멤버십 인증을 시행하면 RBAC를 통해 사용자 액세스를 제어할 수도 있습니다.
RBAC가 시행되면 클라이언트는 클러스터 리소스에 액세스하기 위해 mongos
연결 시 --username
, --password
및 --authenticationDatabase
를 지정해야 합니다.
각 클러스터에는 자체 클러스터 사용자가 있습니다. 이러한 사용자는 개별 샤드에 액세스하는 데 사용할 수 없습니다.
RBAC가 활성화된 MongoDB 배포에 사용자를 추가하는 방법에 대한 튜토리얼은 자체 관리 배포에서 액세스 제어 활성화를 참조하세요.
메타데이터 작업
mongos
는 샤딩된 클러스터 메타데이터에 영향을 주는 다음 작업에 대해 "majority"
개의 쓰기 고려를 사용합니다.
추가 정보
fCV 호환성
MongoDB 부터 4.0 기능 호환성 버전(fCV) 이 보다 mongod
큰 인스턴스에 연결하려고 mongos
mongos
하면 바이너리가 충돌합니다. 예를 들어, MongoDB 4 을(를) 연결할 수 없습니다.0 버전 mongos
을(를) 4 로 설정합니다.2 fCV 가 4 로 설정된 샤드 클러스터.2. 그러나 MongoDB 4 는 연결할 수 있습니다.0 버전 mongos
을(를) 4 로 설정합니다.2 fCV 가 4 으로 설정된 샤드 클러스터.0.
풀타임 진단 데이터 캡처 요구 사항
mongod
에는 MongoDB 엔지니어가 배포 문제를 해결하는 데 도움이 되는 풀타임 진단 데이터 캡처(Full Time Diagnostic Data Capture, FTDC) 메커니즘이 포함되어 있습니다. 이 스레드가 실패하면 원래 프로세스를 종료합니다. 가장 일반적인 오류를 방지하려면 프로세스를 실행하는 사용자에게 FTDC diagnostic.data
디렉토리를 생성할 권한이 있는지 확인하십시오. mongod
의 경우 이 디렉토리는 storage.dbPath
내에 있습니다. mongos
의 경우 systemLog.path
과 유사합니다.
연결 풀
MongoDB 4.2부터는 ShardingTaskExecutorPoolReplicaSetMatching
매개 변수를 추가합니다. 이 매개 변수는 mongod
/mongos
인스턴스 연결 풀의 최소 크기를 결정합니다. 인스턴스의 샤딩된 클러스터의 각 구성원에 대한 연결 풀의 최소 크기를 결정합니다. 이 값은 런타임 중에 변경될 수 있습니다.
mongod
및 mongos
는 샤딩된 클러스터의 모든 복제본 세트에 대해 각 복제본 세트에 대한 연결 풀을 보조적으로 유지합니다. 기본적으로 이러한 풀에는 기본에 대한 연결 수 이상의 연결 수가 있습니다.
클러스터와 집계 파이프라인 사용
샤딩이 집계와 함께 작동하는 방식에 대한 자세한 내용은 실용적인 MongoDB 집계 전자책에서 샤딩 장을 읽어보세요.