문서 메뉴

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

복제

이 페이지의 내용

  • 중복성 및 데이터 가용성
  • MongoDB에서의 복제
  • 비동기 복제
  • 자동 페일오버
  • 읽기 작업
  • 트랜잭션
  • 변경 스트림
  • 추가 기능

MongoDB의 복제본 세트는 동일한 데이터 세트를 유지 관리하는 mongod 프로세스 그룹입니다. 복제본 세트는 중복성과 고가용성을 제공하며 모든 프로덕션 배포의 기반이 됩니다. 이 섹션에서는 MongoDB에서의 복제와 복제본 세트의 컴포넌트 및 아키텍처를 소개합니다. 이 섹션에서는 복제본 세트와 관련된 일반적인 작업에 대한 튜토리얼도 제공합니다.

MongoDB Atlas 에서 호스팅되는 배포서버 를 위해UI에서 복제본 세트를 배포할수 있습니다.

복제는 중복성을 제공하고 데이터 가용성을 높입니다. 서로 다른 데이터베이스 서버에 여러 개의 데이터 복사본이 있는 경우, 복제는 단일 데이터베이스 서버의 손실에 대비한 내결함성 수준을 제공합니다.

일부 경우에는 클라이언트가 읽기 작업을 다른 서버로 보낼 수 있으므로 복제를 통해 읽기 용량이 증가할 수 있습니다. 여러 데이터 센터에 데이터 복제본을 유지하면 분산된 애플리케이션의 데이터 지역성과 가용성이 향상될 수 있습니다. 재해 복구, 보고 또는 백업과 같은 전용 목적을 위해 추가 복사본을 유지 관리할 수도 있습니다.

복제본 세트는 동일한 데이터 세트를 유지하는 mongod 인스턴스 그룹입니다. 복제본 세트에는 여러 개의 데이터 보유 노드와 선택적으로 하나의 중재자 노드가 포함됩니다. 데이터 보유 노드 중 단 하나의 구성원만이 프라이머리 노드로 간주되고, 다른 노드는 세컨더리 노드로 간주됩니다.

경고

각 복제본 세트 노드는 단 하나의 복제본 세트에만 속해야 합니다. 복제본 세트 노드는 둘 이상의 복제본 세트에 속할 수 없습니다.

프라이머리 노드는 모든 쓰기 작업을 수신합니다. 복제본 세트에는 { w: "majority" } 쓰기 고려로 쓰기를 확인할 수 있는 프라이머리가 하나만 있을 수 있지만, 경우에 따라 다른 mongod 인스턴스가 일시적으로 자신을 프라이머리로 간주할 수도 있습니다. [1] 프라이머리는 데이터 세트에 대한 모든 변경 사항을 작업 로그, 즉 oplog에 기록합니다. 프라이머리 노드 작업에 대한 자세한 내용은 복제본 세트 프라이머리를 참조하세요.

기본 멤버로의 읽기 및 쓰기 기본 라우팅을 나타낸 다이어그램
클릭하여 확대

세컨더리는 프라이머리의 oplog를 복제하고 작업을 데이터 세트에 적용하여 세컨더리의 데이터 세트가 프라이머리의 데이터 세트를 반영하도록 합니다. 만약 프라이머리를 사용할 수 없다면, 적격 세컨더리는 투표를 실시하여 자신을 새로운 프라이머리로 선출합니다. 세컨더리 구성원에 대한 자세한 내용은 복제본 세트 세컨더리 멤버를 참조하세요.

기본 멤버 1개와 보조 멤버 2개로 구성된 3멤버 복제본 세트 다이어그램

일부 상황(예: 프라이머리와 세컨더리를 보유 중이지만 비용 제약으로 인해 세컨더리를 추가할 수 없는 경우)에서는 복제본 세트에 mongod 인스턴스를 중재자로 추가하도록 선택할 수 있습니다. 중재자는 선거에 참여하지만 데이터를 보유하지 않습니다(즉, 데이터 중복성을 제공하지 않습니다). 중재자에 대한 자세한 내용은 복제본 세트 중재자를 참조하세요.

기본, 보조, 중재자로 구성된 복제 세트의 다이어그램입니다.

중재자는 항상 중재자 역할을 수행하지만, 선거 기간 중에는 프라이머리 후보가 물러나서 세컨더리 후보가 될 수도 있고 세컨더리 후보가 프라이머리 후보가 될 수도 있습니다.

세컨더리는 프라이머리의 oplog를 복제하고 해당 데이터 세트에 비동기적으로 작업을 적용합니다. 세컨더리 데이터 세트가 기본 데이터 세트를 반영하도록 하면 한 명 이상의 구성원이 장애가 발생하더라도 복제본 세트가 계속 작동할 수 있습니다.

복제 메커니즘에 대한 자세한 내용은 복제본 세트 Oplog복제본 세트 데이터 동기화를 참조하세요.

버전 4.2부터 이제 복제본 세트의 보조 멤버가 느린 연산 임계값보다 오래 걸리는 oplog 항목을 기록합니다. 이러한 느린 oplog 메시지의 특성은 다음과 같습니다.

  • diagnostic log에 세컨더리 멤버에 대해 기록합니다.

  • applied op: <oplog entry> took <num>ms 텍스트와 함께 REPL 구성 요소 아래에 기록됩니다.

  • 로그 수준(시스템 또는 구성 요소 수준)에 의존하지 않습니다.

  • 프로파일링 수준에 의존하지 않습니다.

  • slowOpSampleRate 의 영향을 받습니다.

프로파일러는 느린 oplog 항목을 캡처하지 않습니다.

복제 지연프라이머리 에서의 작업과 oplog 에서 세컨더리 로의 작업 적용 사이의 지연입니다. 약간의 지연은 허용될 수 있지만 복제 지연이 증가하면 프라이머리에 캐시 압력이 가해지는 등 심각한 문제가 발생합니다.

MongoDB 4.2부터 관리자는 majority committed 지연을 구성 가능한 최대값 flowControlTargetLagSeconds이하로 유지하는 것을 목표로 기본이 쓰기를 적용하는 속도를 제한할 수 있습니다.

기본적으로 흐름 제어는 enabled 입니다.

참고

흐름 제어가 작동하려면 복제본 세트/샤딩된 클러스터에 4.2featureCompatibilityVersion(fCV)majority enabled 읽기 우려 사항이 있어야 합니다. 즉, fCV가 4.2 가 아니거나 읽기 문제 과반수가 비활성화된 경우 활성화된 흐름 제어는 효과가 없습니다.

흐름 제어가 활성화되면 지연이 flowControlTargetLagSeconds 에 가까워짐에 따라 기본에 대한 쓰기는 쓰기를 적용하기 위해 잠금을 수행하기 전에 티켓을 얻어야 합니다. 초당 발행되는 티켓 수를 제한함으로써 흐름 제어 메커니즘은 지연을 목표 미만으로 유지하려고 시도합니다.

자세한 내용은 복제 지연 확인흐름 제어를 참조하세요.

프라이머리가 electionTimeoutMillis의 시간(기본값은 10초)을 초과하여 세트의 다른 구성원과 통신하지 않으면 적격 세컨더리가 자신을 새 프라이머리로 지명하기 위한 투표를 요청합니다. 클러스터는 새로운 프라이머리 투표를 완료하고 정상 작업을 재개하려고 시도합니다.

새로운 예비 선거의 다이어그램. 두 개의 보조가 있는 3명의 복제본 세트에서는 기본 복제본에 연결할 수 없게 됩니다. 기본 노드가 손실되면 보조 노드 중 하나가 새로운 기본 노드가 되는 선택이 촉발됩니다.
클릭하여 확대

복제본 세트는 투표가 성공적으로 완료될 때까지 쓰기 작업을 처리할 수 없습니다. 프라이머리가 오프라인인 동안 이러한 쿼리가 세컨더리에서 실행되도록 구성된 경우 복제본 세트는 읽기 쿼리를 계속 제공할 수 있습니다.

클러스터가 새 프라이머리를 선택하기 전의 시간 중앙값은 기본값 replica configuration settings 을 가정할 때 일반적으로 12 초를 초과하지 않아야 합니다. 여기에는 프라이머리를 사용 불가 로 표시하고 투표 를 호출하여 완료하는 데 필요한 시간이 포함됩니다. settings.electionTimeoutMillis 복제 구성 옵션을 수정하여 이 기간을 조정할 수 있습니다. 네트워크 지연 시간과 같은 요인으로 인해 복제본 세트 투표가 완료되는 데 필요한 시간이 연장될 수 있으며, 이는 다시 프라이머리 없이 클러스터가 작동할 수 있는 시간에 영향을 미칩니다. 이러한 요인들은 특정 클러스터 아키텍처에 따라 달라집니다.

electionTimeoutMillis 복제 구성 옵션을 기본값 10000(10초)에서 낮추면 프라이머리 실패를 더 신속하게 탐지할 수 있습니다. 그러나 클러스터는 프라이머리가 정상적으로 작동하더라도 일시 네트워크 지연과 같은 요인으로 인해 투표를 더 자주 호출할 수 있습니다. 이로 인해 w : 1 쓰기 작업의 롤백이 증가할 수 있습니다.

애플리케이션 연결 로직에는 자동 페일오버 및 후속 투표에 대한 허용 범위가 포함되어야 합니다. MongoDB 드라이버는 프라이머리의 손실을 감지하고 특정 쓰기 작업을 한 번만 자동으로 재시도할 수 있으며, 자동 페일오버 및 투표에 대한 추가 기본 처리 기능을 제공합니다.

호환 가능한 드라이버는 기본적으로 재시도 가능 쓰기를 허용

MongoDB는 가장 최근에 액세스한 데이터로 투표 가능한 세컨더리 멤버의 캐시를 미리 워밍하기 위해 미러링된 읽기 를 제공합니다. 세컨더리의 캐시를 미리 워밍업하면 투표 후 성능을 더 빠르게 복원하는 데 도움이 될 수 있습니다.

MongoDB의 페일오버 프로세스에 대해 자세히 알아보려면 다음을 참조하세요.

기본적으로 클라이언트는 프라이머리[1]에서 읽지만, 클라이언트는 읽기 설정을 지정하여 읽기 작업을 세컨더리로 보낼 수 있습니다.

읽기 설정 세컨더리를 사용하는 애플리케이션의 다이어그램입니다.
클릭하여 확대

세컨더리에 대한 비동기 복제 는 세컨더리에서 읽기가 프라이머리의 데이터 상태를 반영하지 않는 데이터를 반환할 수 있음을 의미합니다.

분산 트랜잭션 에 포함된 읽기 작업은 primary로 읽기 설정을 사용해야 합니다. 특정 트랜잭션의 모든 작업은 동일한 노드로 라우팅되어야 합니다.

복제본 세트에서의 읽기에 관한 자세한 내용은 읽기 설정을 참조하세요.

읽기 고려에 따라 클라이언트는 쓰기가 지속형이 되기 전에 쓰기 결과를 확인할 수 있습니다.

  • 쓰기의 쓰기 고려와 관계없이 "local" 또는 "available" 읽기 고려를 사용하는 다른 클라이언트는 쓰기 작업이 실행 클라이언트에 승인되기 전에 쓰기 작업의 결과를 볼 수 있습니다.

  • "local" 또는 "available" 읽기 고려를 사용하는 클라이언트는 복제본 세트 장애 조치 중에 나중에 롤백될 수 있는 데이터를 읽을 수 있습니다.

다중 문서 트랜잭션 트랜잭션이 커밋되면 트랜잭션에서 이루어진 모든 데이터 변경 사항이 저장되고 트랜잭션 외부에서 볼 수 있습니다. 즉, 트랜잭션은 다른 트랜잭션을 롤백하는 동안 일부 변경 사항을 커밋하지 않습니다.

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

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

MongoDB의 읽기 격리, 일관성 및 최신성에 대한 자세한 내용은 읽기 격리, 일관성 및 최신성을 참조하세요.

미러링된 읽기는 운영 중단이나 계획된 유지 보수에 따른 프라이머리 투표의 영향을 줄여줍니다. 복제본 세트의 페일오버 조치 후, 새 프라이머리로 인계받은 세컨더리에서는 새 쿼리가 들어올 때 캐시를 업데이트합니다. 캐시가 워밍업하는 동안 성능에 영향을 미칠 수 있습니다.

미러링된 읽기는 electable 세컨더리 복제본 세트 멤버의 캐시를 미리 워밍업합니다. 투표 가능한 세컨더리의 캐시를 미리 워밍업하기 위해 프라이머리는 수신하는 지원되는 작업 의 샘플을 세컨더리로 미러링합니다.

미러링된 읽기를 수신하는 electable 세컨더리 복제본 세트 멤버의 하위 집합의 크기는 mirrorReads 매개 변수를 사용하여 구성할 수 있습니다. 자세한 내용 은 미러링된 읽기에 대한 지원 활성화/비활성화를 참조하세요.

참고

미러링된 읽기는 클라이언트에 대한 프라이머리의 응답에 영향을 주지 않습니다. 프라이머리가 세컨더리로 미러링하는 읽기는 '파이어 앤 포겟(fire-and-forget)' 작업입니다. 프라이머리는 응답을 기다리지 않습니다.

미러링된 읽기는 다음 작업을 지원합니다.

미러링된 읽기는 기본적으로 활성화되며 0.01 의 기본 sampling rate 를 사용합니다. 미러링된 읽기를 비활성화하려면 mirrorReads 매개변수를 { samplingRate: 0.0 } 로 설정합니다.

db.adminCommand( {
setParameter: 1,
mirrorReads: { samplingRate: 0.0 }
} )

샘플링 속도가 0.0 보다 큰 경우 프라이머리는 지원되는 읽기electable 세컨더리의 하위 집합으로 미러링합니다. 샘플링 속도가 0.01 인 경우 프라이머리는 수신하는 지원되는 읽기의 1%를 투표 가능한 세컨더리에 미러링합니다.

예를 들어 하나의 프라이머리와 두 개의 투표 가능한 세컨더리로 구성된 복제본 세트를 생각해 보세요. 프라이머리가 미러링될 수 있는 1000개의 작업을 수신하고 샘플링 속도가 0.01인 경우, 프라이머리는 약 10개의 지원된 읽기를 투표 가능한 세컨더리로 미러링합니다. 투표 가능한 각 세컨더리는 10개의 읽기 중 일부만 수신합니다. 프라이머리는 미러링된 각 읽기를 무작위로 선택된 비어 있지 않은 투표 가능한 세컨더리로 보냅니다.

미러링된 읽기의 샘플링 속도를 변경하려면 mirrorReads 매개 변수를 0.0에서 1.0 사이의 숫자로 설정합니다.

  • 샘플링 속도가 0.0이면 미러링된 읽기가 비활성화됩니다.

  • 샘플링 속도가 0.0 에서 1.0 사이의 숫자이면 프라이머리가 지정된 샘플링 속도로 지원되는 읽기 의 무작위 샘플을 투표 가능한 세컨더리로 전달합니다.

  • 샘플링 속도가 1.0 이면 프라이머리 가 지원되는 모든 읽기 를 투표 가능한 세컨더리로 전달합니다.

자세한 내용은 mirrorReads를 참조하세요.

작업에서 필드를 지정하는 경우 serverStatus 명령 및 db.serverStatus() shell 메서드는 mirroredReads 지표를 반환합니다.

db.serverStatus( { mirroredReads: 1 } )

MongoDB 4.0부터는 복제본 세트에 대해 다중 문서 트랜잭션을 사용할 수 있습니다.

분산 트랜잭션 에 포함된 읽기 작업은 primary로 읽기 설정을 사용해야 합니다. 특정 트랜잭션의 모든 작업은 동일한 노드로 라우팅되어야 합니다.

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

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

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

복제본 세트는 애플리케이션 요구 사항을 지원하기 위한 다양한 옵션을 제공합니다. 예를 들어, 여러 데이터 센터에 멤버가 있는 복제본 세트를 배포하거나 일부 멤버의 members[n].priority를 조정하여 투표 결과를 제어할 수 있습니다. 복제본 세트는 보고, 재해 복구 또는 백업 기능을 위한 전용 구성원도 지원합니다.

자세한 내용은 우선 순위가 0인 복제본 세트 멤버, 숨겨진 복제본 세트 멤버지연된 복제본 세트 멤버를 참조하세요.

[1](1, 2) 경우에 따라 복제본 세트의 두 노드가 일시적으로 자신이 프라이머리 노드라고 생각할 수 있지만, 이 중 최대 하나만 { w: "majority" } 쓰기 고려로 쓰기를 완료 수 있습니다. { w: "majority" } 쓰기를 완료할 수 있는 노드는 현재 프라이머리 노드이고, 다른 노드는 일반적으로 네트워크 파티션으로 인해 아직 강등을 인식하지 못한 이전 프라이머리 노드입니다. 이 경우 이전 프라이머리 노드에 연결한 클라이언트는 읽기 기본 설정 primary를 요청했음에도 불구하고 오래된 데이터를 보게 되며, 이전의 프라이머리 노드에 대한 새로운 쓰기는 결국 롤백됩니다.
← 데이터베이스 참조