문서 메뉴

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

mongos

이 페이지의 내용

  • 라우팅 및 결과 프로세스
  • mongos 쿼리 수정자를 처리하는 방법
  • 읽기 설정 및 샤드
  • 0} 인스턴스에 연결 확인 mongos
  • 타겟팅 운영과 브로드캐스트 운영 비교
  • 샤드 클러스터 보안
  • 메타데이터 작업
  • 추가 정보

MongoDB mongos 인스턴스는 쿼리와 쓰기 작업을 샤드 클러스터의 샤드로 라우팅합니다. mongos 애플리케이션 관점에서 샤드 클러스터에 대한 유일한 인터페이스를 제공합니다. 애플리케이션이 샤드와 직접 연결하거나 통신하지 않습니다.

mongosconfig 서버에서 메타데이터를 캐싱하여 어떤 데이터가 어떤 샤드에 있는지 추적합니다. mongos 는 메타데이터를 사용하여 애플리케이션 및 클라이언트에서 mongod 인스턴스로 작업을 라우팅합니다. mongos에는 영구 상태가 없으며 최소한의 시스템 리소스를 사용합니다.

가장 일반적인 방법은 애플리케이션 서버와 동일한 시스템에서 mongos 인스턴스를 실행하는 것이지만 샤드 또는 기타 전용 리소스에서 mongos 인스턴스를 유지할 수 있습니다. mongos의 수와 분포를 참조하세요.

mongos 인스턴스는 다음과 같은 방법으로 쿼리를 클러스터 로 라우팅합니다.

  1. 쿼리를 수신해야 하는 샤드 목록을 결정합니다.

  2. 모든 타겟팅된 샤드에 커서를 설정합니다.

그런 다음 mongos 은 각 대상 샤드의 데이터를 병합하고 결과 문서를 반환합니다. 정렬 과 같은 특정 쿼리 수정자는 mongos 가 결과를 검색하기 전에 각 샤드에서 수행됩니다.

여러 샤드에서 실행되는 애그리게이션 작업은 데이터베이스의 프라이머리 샤드에서 실행할 필요가 없는 경우 결과를 병합하기 위해 결과를 mongos로 다시 라우팅할 수 있습니다.

파이프라인을mongos에서 실행할 수 없는 두 가지 경우가 있습니다.

첫 번째 경우는 분할 파이프라인의 병합 부분에 반드시 프라이머리 샤드에서 실행되어야 하는 단계가 포함되어 있을 때 발생합니다. 예를 들어, $lookup이 집계를 실행하고 있는 샤드 컬렉션과 동일한 에 데이터베이스에 있는 비샤드 컬렉션에 액세스해야 하는 경우, 병합은 프라이머리 샤드에서 실행되어야 합니다.

두 번째 경우는 분할 파이프라인의 병합 부분에 임시 데이터를 디스크에 쓸 수 있는 단계(예: $group)가 포함되어 있고 클라이언트가 allowDiskUse:true를 지정한 경우에 발생합니다. 이 경우, 병합 파이프라인에 프라이머리 샤드가 필요한 다른 단계가 없다고 가정하면, 병합은 집계 대상 샤드 집합에서 임의로 선택된 샤드에서 실행됩니다.

분할된 클러스터 쿼리의 구성 요소 간에 집계 작업을 분할하는 방법에 대한 자세한 내용은 aggregate() 호출의 매개 변수로 explain:true를 사용하세요. 세 개의 JSON 객체가 반환됩니다. mergeType는 병합 단계가 발생하는 위치("primaryShard", "anyShard" 또는 "Mongo")를 보여 줍니다. splitPipeline에는 개별 샤드에서 파이프라인의 어떤 작업이 실행되었는지 표시됩니다. shards은 각 샤드가 수행한 작업을 보여줍니다.

경우에 따라, 샤드 키 또는 샤드 키의 접두사가 쿼리의 일부인 경우 mongos타겟팅된 작업 을 수행하여 쿼리를 클러스터의 샤드 하위 집합으로 라우팅합니다.

mongos 샤드 키 를 포함하지 않는 쿼리에 대해 브로드캐스트 작업 을 수행하여 쿼리를 클러스터의 모든 샤드로 라우팅합니다. 샤드 키를 포함하는 일부 쿼리는 클러스터의 데이터 분포와 쿼리의 선택성에 따라 여전히 브로드캐스트 작업이 발생할 수 있습니다.

타겟팅된 작업과 브로드캐스트 작업 에 대한 자세한 내용은 타겟팅된 작업과 브로드캐스트 작업을 참조하세요.

mongos 헤지된 읽기( hedged read )를 지원하여 지연 시간을 최소화할 수 있습니다. 자세한 내용은 헤지된 읽기( hedged read )를 참조하세요.

쿼리 결과가 정렬되지 않은 경우, mongos 인스턴스는 샤드의 모든 커서에서 "라운드 로빈" 결과를 가져오는 결과 커서를 엽니다.

쿼리가 limit() 커서 메서드를 사용하여 결과 세트의 크기를 제한하면 mongos 인스턴스는 해당 제한을 샤드에 전달한 다음 결과를 클라이언트에 반환하기 전에 결과에 제한을 다시 적용합니다.

쿼리가 skip() 커서 메서드를 사용하여 건너뛰기할 레코드 수를 지정하는 경우 mongos는 분할된 데이터베이스에 건너뛰기를 전달할 수 없지만 분할된 데이터베이스에서 건너뛰지 않은 결과를 검색하고 전체 결과를 조합할 때 적절한 수의 문서를 건너 뜁니다.

limit()을 함께 사용하면 mongos가 작업 효율성 개선을 위해 제한skip() 값을 샤드에 전달합니다.

샤드 클러스터의 경우 mongos는 샤드에서 읽을 때 읽기 설정을 적용합니다. 선택된 노드는 읽기 설정replication.localPingThresholdMs 설정의 적용을 받으며, 각 작업마다 다시 평가됩니다.

읽기 설정 및 클러스터에 대한 자세한 내용은 읽기 설정 및 샤드를 참조하세요.

mongos 인스턴스는primary 가 아닌 읽기 설정 (read preference) 을 사용하는 읽기를 헤지할 수 있습니다. 헤지된 읽기(hedged read)를 사용하면 mongos 인스턴스는 쿼리된 각 샤드당 두 개의 복제본 세트 멤버로 읽기 작업을 라우팅하고 샤드당 첫 번째 응답자로부터 결과를 반환합니다. 읽기 작업을 헤지하기 위해 전송된 추가 읽기는maxTimeMSForHedgedReadsmaxTimeMS 값을 사용합니다

다음 작업에 대해 헤지된 읽기가 지원됩니다:

헤지된 읽기는 읽기 설정의 일부로 작업별로 지정됩니다. 비-primary 읽기 설정은 헤지된 읽기를 지원합니다. 헤지된 읽기 설정항목을 참조하십시오.

읽기 설정 및 샤드 클러스터, 노드 선택에 대한 자세한 내용은 읽기 설정 및 샤드를 참조하세요.

기본적으로 mongos 인스턴스는 헤지된 읽기 사용을 지원합니다. 헤지된 읽기에 대한 mongos 인스턴스의 지원을 끄려면 readHedgingMode 매개변수를 참조하세요. 헤지된 읽기 지원이 off인 경우 mongos는 읽기 설정에 지정된 hedge 옵션에 관계없이 헤지된 읽기를 사용하지 않습니다.

serverStatus 명령과 해당 mongosh 메서드 db.serverStatus()hedgingMetrics 를 반환합니다.

클라이언트가 연결된 MongoDB 인스턴스가 mongos인지 확인하려면 hello 명령을 사용합니다. 클라이언트가 mongos에 연결하면 helloisdbgrid 문자열을 포함하는 msg 필드가 있는 문서를 반환합니다. 예를 들면 다음과 같습니다.

{
"isWritablePrimary" : true,
"msg" : "isdbgrid",
"maxBsonObjectSize" : 16777216,
"ok" : 1,
...
}

애플리케이션이 mongod에 연결되어 있는 경우에는 반환되는 문서에 isdbgrid 문자열이 포함되지 않습니다.

일반적으로 샤드 환경에서 가장 빠른 쿼리는 가 config 서버 의 샤드 mongos 키 와 클러스터 메타데이터를 사용하여 단일 샤드로 라우팅하는 쿼리입니다. 이러한 대상 작업 은 샤드 키 값을 사용하여 쿼리 문서를 충족하는 샤드 또는 샤드의 하위 집합을 찾습니다.

샤드 키가 포함되지 않은 쿼리의 경우 mongos는 모든 샤드를 쿼리하고 응답을 기다린 다음 결과를 애플리케이션에 반환해야 합니다. 이러한 '분산/수집' 쿼리 작업은 오래 실행될 수 있습니다.

mongos 인스턴스는 이 데이터를 저장하는 샤드 또는 샤드의 하위 집합을 확인할 수 없는 경우를 제외하고 mongos는 컬렉션의 모든 샤드에 쿼리를 브로드캐스트합니다

샤드 클러스터에 대한 읽기 작업. 쿼리 기준에는 샤드 키가 포함되지 않습니다. 쿼리 라우터 ``mongos``는 컬렉션의 모든 샤드에 쿼리를 브로드캐스트해야 합니다.

mongos 가 모든 샤드로부터 응답을 수신한 후 데이터를 병합하고 결과 문서를 반환합니다. 브로드캐스트 작업의 성능은 클러스터의 전체 로드뿐만 아니라 네트워크 지연 시간, 개별 샤드 로드, 샤드당 반환되는 문서 수와 같은 변수에 따라 달라집니다. 가능하면 브로드캐스트 작업을 발생시키는 작업보다 타겟팅 된 작업을 발생시키는 작업을 선호합니다.

다중 업데이트 작업은 항상 브로드캐스트 작업입니다.

updateMany()deleteMany() 메서드는 쿼리 문서에서 샤드 키 전체를 지정하지 않는 한 브로드캐스트 작업입니다.

mongos은(는) 샤드 키 또는 복합 샤드 키의 접두사가 포함된 쿼리를 특정 샤드 또는 샤드 집합으로 라우팅할 수 있습니다. mongos 은(는) 샤드 키 값을 사용하여 범위에 샤드 키 값이 포함된 청크를 찾고 해당 청크가 포함된 샤드에서 쿼리를 보냅니다.

샤드 클러스터에 대한 읽기 작업. 쿼리 기준에는 샤드 키가 포함됩니다. 쿼리 라우터 ``mongos``는 쿼리를 적절한 샤드 또는 샤드들로 지정할 수 있습니다.

예를 들어, 샤드 키가 다음과 같은 경우입니다.

{ a: 1, b: 1, c: 1 }

mongos 프로그램은 특정 샤드 또는 샤드 집합에서 전체 샤드 키 또는 다음 샤드 키 접두사 중 하나를 포함하는 쿼리를 라우팅할 수 있습니다.

{ a: 1 }
{ a: 1, b: 1 }

모든 insertOne() 작업은 하나의 샤드를 대상으로 합니다. insertMany() 배열의 각 문서는 단일 분할된 데이터베이스를 대상으로 하지만 배열의 모든 문서가 단일 분할된 데이터베이스에 삽입된다는 보장은 없습니다.

모든 updateOne(), replaceOne()deleteOne() 작업에는 반드시 쿼리 문서에 샤드 키 또는 _id이(가) 포함되어야 합니다. 이러한 메서드가 샤드 키 또는 _id 없이 사용되는 경우 MongoDB는 오류를 반환합니다.

클러스터의 데이터 분포와 쿼리의 선택성에 따라 mongos 는 이러한 쿼리를 수행하기 위해 여전히 브로드캐스트 작업 을 수행할 수 있습니다.

샤드는 쿼리를 수신하면 해당 쿼리를 처리하는 데 사용할 수 있는 것 중 가장 효율적인 인덱스를 사용합니다. 사용되는 인덱스는 샤드 키 인덱스 또는 샤드에 존재하는 다른 적합한 인덱스일 수 있습니다.

내부/구성원 인증을 사용하여 클러스터 내 보안을 집행하고 승인되지 않은 클러스터 구성 요소가 클러스터에 액세스하지 못하도록 방지합니다. 내부 인증을 집행하려면 클러스터의 각 mongod 또는 mongos를 적절한 보안 설정으로 시작해야 합니다.

MongoDB 5.3부터는 SCRAM-SHA-1을 클러스터 내 인증에 사용할 수 없습니다. SCRAM-SHA-256만 지원됩니다.

이전 MongoDB 버전에서는 SCRAM이 명시적으로 사용하도록 설정되어 있지 않더라도 SCRAM-SHA-1과 SCRAM-SHA-256을 모두 클러스터 내 인증에 사용할 수 있습니다.

보안 샤드 클러스터 배포에 대한 튜토리얼은 키파일 인증을 사용하여 클러스터 배포하기를 참조하세요.

샤드 클러스터는 클러스터 데이터 및 작업에 대한 무단 액세스를 제한하기 위해 역할 기반 액세스 제어 (RBAC)를 지원합니다. RBAC를 시행하려면 config 서버를 포함하여 클러스터의 각 mongod 을(를) --auth 옵션과 함께 시작해야 합니다. 또는 클러스터 간 보안을 위해 내부/멤버십 인증을 시행하면 RBAC를 통해 사용자 액세스를 제어할 수도 있습니다.

RBAC가 시행되면 클라이언트는 클러스터 리소스에 액세스하기 mongos 위해 에 연결할 --authenticationDatabase --username--password , 및 를 지정해야 합니다.

각 클러스터에는 자체 클러스터 사용자가 있습니다. 이러한 사용자는 개별 샤드에 액세스하는 데 사용할 수 없습니다.

RBAC가 활성화된 MongoDB 배포에 사용자를 추가하는 방법에 대한 튜토리얼은 액세스 제어 활성화를 참조하세요.

mongos는 샤딩된 클러스터 메타데이터에 영향을 주는 다음 작업에 대해 "majority"개의 쓰기 고려를 사용합니다.

명령
메서드
참고
addShard
MongoDB 3.6에서 변경된 사항

mongos 바이너리는 기능 호환성 버전(fCV)mongos보다 큰 mongod 인스턴스에 연결할 수 없습니다. 예를 들면 fCV가 4.2로 설정된 4.2 샤드 클러스터에 MongoDB 4.0 버전 mongos를 연결할 수 없습니다. 그러나 fCV가 4.0으로 설정된 4.2 샤드 클러스터에는 MongoDB 4.0 버전 mongos를 연결할 수 있습니다.

mongod에는 MongoDB 엔지니어가 배포 문제를 해결하는 데 도움이 되는 풀타임 진단 데이터 캡처(Full Time Diagnostic Data Capture, FTDC) 메커니즘이 포함되어 있습니다. 이 스레드가 실패하면 원래 프로세스를 종료합니다. 가장 일반적인 오류를 방지하려면 프로세스를 실행하는 사용자에게 FTDC diagnostic.data 디렉토리를 생성할 권한이 있는지 확인하십시오. mongod의 경우 이 디렉토리는 storage.dbPath 내에 있습니다. mongos의 경우 systemLog.path과 유사합니다.

MongoDB 4.2부터는 ShardingTaskExecutorPoolReplicaSetMatching 매개 변수를 추가합니다. 이 매개 변수는 mongod/mongos 인스턴스 연결 풀의 최소 크기를 결정합니다. 인스턴스의 샤딩된 클러스터의 각 구성원에 대한 연결 풀의 최소 크기를 결정합니다. 이 값은 런타임 중에 변경될 수 있습니다.

mongodmongos는 샤딩된 클러스터의 모든 복제본 세트에 대해 각 복제본 세트에 대한 연결 풀을 보조적으로 유지합니다. 기본적으로 이러한 풀에는 기본에 대한 연결 수 이상의 연결 수가 있습니다.

수정하려면 ShardingTaskExecutorPoolReplicaSetMatching 참조하세요.

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

← Config 서버