읽기 기본 설정은 MongoDB 클라이언트가 복제본 세트 노드에 읽기 작업을 어떻게 라우팅하는지 설명합니다.
기본적으로 애플리케이션은 읽기 작업을 복제본 세트의 프라이머리 멤버(즉, 읽기 설정 모드 'primary')로 지시합니다. 하지만 클라이언트는 읽기 작업을 세컨더리로 전송하도록 읽기 설정을 지정할 수 있습니다.
읽기 설정은 읽기 설정 모드와 선택적으로 태그 세트 목록 및 maxStalenessSeconds 옵션으로 구성됩니다.
읽기 설정 모드
다음 표에는 읽기 설정 (read preference) 모드가 요약되어 있습니다.
읽기 설정 모드 | 설명 |
|---|---|
기본 모드. 작업은 현재 복제본 세트 프라이머리 에서 읽습니다. 읽기 작업이 포함된 트랜잭션 은 읽기 설정 (read preference) | |
작업은 사용 가능한 경우 프라이머리 에서 읽습니다. 그렇지 않은 경우 자격 있는 세컨더리 멤버로부터 읽습니다. | |
작업은 복제본 세트 의 적격 세컨더리 멤버에서 읽습니다. | |
작업은 프라이머리 또는 세컨더리 여부에 관계없이 지연 시간 창 내에 네트워크 지연 시간 있는 적격 멤버로부터 읽습니다. |
모든 모드에서 멤버는 네트워크를 통해 연결할 수 있고 요청에 응답할 수 있는지 확인하는 클라이언트의 정기적인 모니터링 검사에 응답할 때 사용할 수 있습니다.
primary를 제외한 모든 모드에서 멤버가 읽기 설정의 maxStalenessSeconds 옵션과 지정된 태그 세트 목록을 충족하는 경우 자격이 있습니다.primary를 제외한 모든 모드에서localThresholdMS연결 문자열 옵션은 클라이언트 적격 멤버 중에서 선택할 때 지연 시간 창 계산하는 데 사용하는 로컬 임계값을 설정합니다.
중요
읽기 설정 모드는 작업의 성공을 보장하지 않습니다. 가용성과 자격에 따라 클라이언트 고려하는 멤버가 결정되지만, 선택한 멤버는 부하가 걸리는 경우 등 작업을 거부할 수 있습니다.
읽기 환경설정 모드에 대한 자세한 설명은 읽기 설정 모드를 참조하세요.
행동
All read preference modes except
primarymay return stale data because secondaries replicate operations from the primary in an asynchronous process. [1] Ensure that your application can tolerate stale data if you choose to use a non-primarymode.읽기 기본 설정은 데이터의 가시성에 영향을 주지 않습니다. 클라이언트는 쓰기 결과가 확인되거나 과반수의 복제본 세트 노드에 전파되기 전에 쓰기 결과를 볼 수 있습니다. 자세한 내용은 격리, 일관성 및 최신성(Recency) 읽기를 참조하세요.
읽기 설정은 인과적 일관성에 영향을 미치지 않습니다.
"majority"읽기 고려가 있는 읽기 작업과"majority"쓰기 고려가 쓰기 작업에 대해 인과적으로 일관성이 있는 세션을 제공하는 인과적 일관성 보장은 MongoDB deployment의 모든 멤버에 걸쳐 유지됩니다.
경고
MongoDB 버전 8.2부터는 청크 마이그레이션 후 고아 문서 삭제되기 전에 샤딩된 클러스터 에서 장기 세컨더리 읽기가 자동으로 종료될 수 있습니다.
terminateSecondaryReadsOnOrphanCleanup 매개변수는 이 동작을 제어합니다. 장기 실행 세컨더리 읽기를 처리하는 방법에 대해 자세히 학습하려면 샤드 클러스터에서 장기 실행 세컨더리 읽기를 참조하세요.
읽기 설정 모드
primaryAll read operations use only the current replica set primary. [1] This is the default read mode. If the primary is unavailable, read operations produce an error or throw an exception.
primary읽기 설정 모드는 태그 세트 목록이나 maxStalenessSeconds를 사용하는 읽기 설정 모드와 호환되지 않습니다. 태그 세트 목록 또는maxStalenessSeconds값을primary로 지정하면 드라이버는 오류를 발생시킬 것입니다.읽기 작업이 포함된 트랜잭션 은 읽기 설정 (read preference)
primary를 사용해야 합니다. 특정 트랜잭션 의 모든 작업은 동일한 노드로 라우팅되어야 합니다.
primaryPreferred작업은 사용 가능한 경우 설정하다 의 프라이머리 멤버에서 읽습니다. 페일오버 상황과 같이 프라이머리 사용할 수 없는 경우, 읽기 설정의
maxStalenessSeconds및 태그 세트 목록을 충족하는 세컨더리 멤버에서 작업을 읽습니다.primaryPreferred읽기 설정에 maxStalenessSeconds 값이 포함되어 있고 읽어올 프라이머리가 없는 경우, 클라이언트는 세컨더리의 마지막 쓰기를 가장 최근 쓰기가 있는 세컨더리의 마지막 쓰기와 비교하여 각 세컨더리가 얼마나 오래 되었는지 추정합니다. 그런 다음 클라이언트는 예상 지연이maxStalenessSeconds이하인 세컨더리에 읽기 작업을 지시합니다.읽기 설정에 태그 세트 목록 (태그 세트의 배열)이 포함되어 있고 읽을 수 있는 프라이머리 멤버가 없는 경우, 클라이언트는 일치하는 태그가 있는 세컨더리 멤버를 찾으려고 시도합니다 (일치하는 태그가 발견될 때까지 태그 세트를 차례로 시도합니다). 일치하는 세컨더리 멤버가 발견되면 클라이언트는 일치하는 세컨더리 멤버의 가장 가까운 그룹에서 무작위로 세컨더리를 선택합니다. 일치하는 태그를 가진 세컨더리 멤버가 없는 경우, 읽기 작업은 오류를 발생시킵니다.
읽기 기본 설정에
maxStalenessSeconds값 과 태그 세트 목록이 포함되어 있는 경우, 클라이언트는 먼저 오래된 정도에 따라 필터링한 다음 지정된 태그를 기준으로 필터링합니다.primaryPreferred모드를 사용한 읽기 작업은 오래된 데이터를 반환할 수 있습니다.maxStalenessSeconds옵션을 사용하면 클라이언트가 너무 오래되었다고 추정하는 세컨더리에서 데이터를 읽지 않도록 할 수 있습니다.수신 요청 속도 제한기를 활성화 샤딩된 클러스터에서 부하를 분산하는 샤드 노드는
SystemOverloadedError레이블이 지정된 오류를 반환할 수 있습니다.overloadAwareServerSelectionEnabled가true로 설정하다 클러스터의 경우, 프라이머리 가SystemOverloadedError레이블이 지정된 재시도 가능 오류로 응답하면 라우터는 과부하된 서버 대신 적합한 세컨더리로 읽기를 일시적으로 라우팅할 수 있습니다. 이는 여러 서버를 선택할 수 있는 모든 읽기 설정 (read preference) 에 적용됩니다. 기본값 으로overloadAwareServerSelectionEnabled는false로 설정하다 됩니다.
secondary작업은 세트의 오직 세컨더리로부터만 읽습니다.사용 가능한 세컨더리 멤버가 없으면 이 읽기 작업에서 오류나 예외가 발생합니다.
대부분의 복제본 세트에는 하나 이상의 세컨더리 있지만 사용 가능한 세컨더리 없는 상황이 있을 수 있습니다. 예시 를 들어, 프라이머리, 세컨더리 및 중재자 있는 복제본 세트 에서 멤버가 복구 중 상태 이거나 사용할 수 없는 경우 세컨더리 멤버가 없을 수 있습니다.
secondary읽기 설정에 maxStalenessSeconds 값이 포함된 경우 클라이언트는 세컨더리의 마지막 쓰기를 프라이머리의 마지막 쓰기와 비교하여 각 세컨더리의 부실 정도를 추정합니다. 그런 다음 클라이언트는 예상 지연이maxStalenessSeconds이하인 세컨더리에 읽기 작업을 지시합니다. 프라이머리가 없으면 클라이언트는 비교를 위해 가장 최근에 쓴 세컨더리를 사용합니다.읽기 설정에 태그 세트 목록 (태그 세트의 배열)이 포함된 경우 클라이언트는 일치하는 태그가 있는 세컨더리 구성원을 찾으려고 시도합니다 (일치하는 태그가 발견될 때까지 태그 세트을 순서대로 시도). 일치하는 세컨더리가 발견되면 클라이언트는 일치하는 세컨더리 멤버 중 가장 가까운 그룹에서 무작위로 세컨더리를 선택합니다. 일치하는 태그를 가진 세컨터리 멤버가 없는 경우, 읽기 작업은 오류를 발생시킵니다.
읽기 기본 설정에
maxStalenessSeconds값 과 태그 세트 목록이 포함되어 있는 경우, 클라이언트는 먼저 오래된 정도에 따라 필터링한 다음 지정된 태그를 기준으로 필터링합니다.secondary모드를 사용한 읽기 작업은 오래된 데이터를 반환할 수 있습니다.maxStalenessSeconds옵션을 사용하면 클라이언트가 너무 오래되었다고 추정하는 세컨더리에서 데이터를 읽지 않도록 할 수 있습니다.
secondaryPreferred작업은 복제본 세트 의 적격 세컨더리 멤버로부터 데이터를 읽습니다. 사용 가능한 적격 세컨더리 멤버가 없는 경우 작업은 프라이머리 멤버에서 읽습니다.
secondaryPreferred읽기 설정(read preference)에 maxStalenessSeconds 값이 포함된 경우 클라이언트는 세컨더리의 마지막 쓰기를 프라이머리의 마지막 쓰기와 비교하여 각 세컨더리의 부실 정도를 추정합니다. 그런 다음 클라이언트는 예상 지연이maxStalenessSeconds이하인 세컨더리에 읽기 작업을 지시합니다. 프라이머리가 없으면 클라이언트는 비교를 위해 가장 최근에 쓴 세컨더리를 사용합니다. 예상 지연 시간이maxStalenessSeconds이하인 세컨더리가 없는 경우 클라이언트는 읽기 작업을 복제본 세트의 프라이머리로 보냅니다.읽기 환경 설정에 태그 세트 목록(태그 세트의 배열)이 포함된 경우 클라이언트는 일치하는 태그가 있는 세컨더리 멤버를 찾으려고 시도합니다(일치하는 태그가 발견될 때까지 태그 세트을 순서대로 시도). 일치하는 세컨더리가 발견되면 클라이언트는 일치하는 세컨더리의 가장 가까운 그룹에서 무작위로 세컨더리를 선택합니다. 일치하는 태그를 가진 세컨더리가 없는 경우, 클라이언트는 태그를 무시하고 프라이머리에서 읽습니다.
읽기 기본 설정에
maxStalenessSeconds값 과 태그 세트 목록이 포함되어 있는 경우, 클라이언트는 먼저 오래된 정도에 따라 필터링한 다음 지정된 태그를 기준으로 필터링합니다.secondaryPreferred모드를 사용한 읽기 작업은 오래된 데이터를 반환할 수 있습니다.maxStalenessSeconds옵션을 사용하면 클라이언트가 너무 오래되었다고 추정하는 세컨더리에서 데이터를 읽지 않도록 할 수 있습니다.
nearest운전자 네트워크 지연 시간 허용 가능한 지연 시간 창 내에 있는 멤버로부터 읽습니다.
nearest모드 에서의 읽기는 읽기 작업을 라우팅할 때 멤버가 프라이머리 멤버인지 세컨더리 인지를 고려하지 않습니다: 프라이머리 멤버와 세컨더리 멤버는 동등하게 취급됩니다.이 모드를 설정하면 현재 데이터나 오래된 데이터를 선호하지 않고 네트워크 지연 시간이 읽기 작업에 미치는 영향을 최소화할 수 있습니다.
읽기 설정에 MaxStalenessSeconds 값이 포함된 경우 가능하다면 클라이언트는 세컨더리의 마지막 쓰기를 프라이머리의 마지막 쓰기 작업과 비교하고, 프라이머리가 없는 경우 가장 최근에 쓴 세컨더리와 비교하여 각 세컨더리가 얼마나 오래 되었는지 추정합니다. 그런 다음 클라이언트는 예상 지연이
maxStalenessSeconds보다 큰 세컨더리를 필터링하고 네트워크 지연이 허용 가능한 지연 시간 내에 있는 나머지 멤버 (프라이머리 또는 세컨더리)에게 무작위로 읽기를 지시합니다.태그 세트 목록을 지정하면 클라이언트는 지정된 태그 세트 목록과 일치하는 복제본 세트 멤버을 찾으려고 시도하고, 가장 가까운 그룹 중에서 임의의 멤버에게 읽기를 지시합니다.
읽기 설정에
maxStalenessSeconds값과 태그 세트 목록이 포함되어 있는 경우 클라이언트는 먼저 오래된 정도에 따라 필터링한 다음 지정된 태그를 기준으로 필터링합니다. 나머지mongod인스턴스에서 클라이언트는 허용 가능한 지연 시간 범위 내에 있는 인스턴스로 읽기를 임의로 지시합니다. 읽기 설정 멤버 선택 문서에 이 프로세스에 대한 자세한 설명이 나와 있습니다.nearest모드를 사용한 읽기 작업은 오래된 데이터를 반환할 수 있습니다.maxStalenessSeconds옵션을 사용하면 클라이언트가 너무 오래되었다고 추정하는 세컨더리에서 데이터를 읽지 않도록 할 수 있습니다.
팁
특정 읽기 설정의 사용 사례에 대해 알아보려면 읽기 환경 설정 사용 사례를 참조하세요.
읽기 환경설정 구성
MongoDB 드라이버를 사용하는 경우 드라이버의 읽기 설정 API를 사용하여 읽기 설정을 지정할 수 있습니다. 자세한 내용은 드라이버 API 문서를 참조하세요. 복제본 세트 또는 샤딩된 클러스터에 연결할 때 읽기 기본 설정을 지정할 수도 있습니다. 예시는 연결 문자열에서 확인할 수 있습니다.
주어진 읽기 설정에 대해 MongoDB 드라이버는 동일한 노드 선택 로직을 사용합니다.
mongosh 사용 시 cursor.readPref() 및 Mongo.setReadPref()를 참조합니다.
읽기 환경설정 및 트랜젝션
읽기 작업이 포함된 트랜잭션 은 읽기 설정 (read preference) primary를 사용해야 합니다. 특정 트랜잭션 의 모든 작업은 동일한 노드로 라우팅되어야 합니다.
추가 고려 사항
집계 파이프라인에서 $merge 또는 $out 단계를 사용할 때는 다음 사항을 고려하세요.
MongoDB 5.0부터
$merge단계가 있는 파이프라인은 클러스터의 모든 노드에서 featureCompatibilityVersion이5.0이상으로 설정되어 있고 읽기 설정이 세컨더리 읽기를 허용하는 경우 복제본 세트 세컨더리 노드에서 실행될 수 있습니다.이전 MongoDB 버전에서는
$out또는$merge단계가 있는 파이프라인은 항상 기본 노드에서 실행되며 읽기 기본 설정은 고려되지 않았습니다.
mapReduce 작업의 경우 "inline" 데이터를 쓰기 (write) 않는mapReduce 작업은 읽기 설정 (read preference) 지원 . 그렇지 않으면 mapReduce 작업이 프라이머리 멤버에서 실행 .
| [1] | (1, 2) 일부 상황에서는 복제본 세트의 두 노드가 일시적으로 자신이 주 노드라고 생각할 수 있지만, |