본문 바로가기
DBMS

몽고DB Replica Set 알아보기 - mongodb replication

by developer's warehouse 2023. 12. 18.

우분투 22.04에 몽고DB를 standalone으로 설치했습니다. 몇 가지 간단한 테스트를하고, 트랜잭션을 테스트 해보려하는데 에러가 나와서 확인해 보니, 몽고DB에서 트랜잭션은 분산트랜잭션만 가능하다고합니다. 결국 replica set나 sharded cluster를 설정해야만 합니다. 먼저 몽고DB의 replica set이 무엇인지 알아보겠습니다.

몽고DB Replica Set 썸네일

복제(Replication)

MongoDB의 복제 세트(Replica set)는 동일한 데이터 세트를 유지하는 mongod 프로세스 그룹입니다. 복제 세트는 중복성과 고가용성을 제공하며, 모든 프로덕션 배포의 기초가 됩니다. 이 글에서는 복제 세트의 구성 요소와 아키텍처 그리고 MongoDB의 복제에 대해 소개합니다. 

 

중복성 및 데이터 가용성(Redundancy and Data Availability)

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

경우에 따라 클라이언트가 읽기 작업을 다른 서버로 보낼 수 있으므로 복제를 통해 읽기 용량(read capacity)을 늘릴 수 있습니다. 여러 데이터 센터에 데이터 사본을 유지하면 분산된 애플리케이션의 데이터 지역성과 가용성을 높일 수 있습니다. 또한 재해 복구(DR), 보고(reporting-readonly) 또는 백업(backup)과 같은 전용 목적을 위해 추가 복사본을 유지할 수도 있습니다.

 

MongoDB의 복제(Replication in MongoDB)

복제 세트(Replica set)는 동일한 데이터 세트를 유지하는 몽고 인스턴스 그룹입니다. 복제 세트에는 여러 개의 데이터 보유 노드와 선택적으로 하나의 중재자 노드가 포함됩니다. 데이터 보유 노드 중 단 하나의 멤버만 기본 노드로 간주되고 다른 노드는 보조 노드로 간주됩니다.

몽고DB replica sets



프라이머리(primary) 노드는 모든 쓰기 작업을 수신합니다. 복제본 집합에는 { w: "majority" } write concern(쓰기 수준)로 쓰기를 확인할 수 있는 프라이머리 노드가 하나만 있을 수 있지만, 경우에 따라 다른 몽고 인스턴스가 일시적으로 자신을 프라이머리로 간주할 수도 있습니다. 프라이머리는 데이터 세트에 대한 모든 변경 사항을 작업 로그, 즉 oplog에 기록합니다.

 

세컨더리(secondaries)들은 프라이머리 데이터 집합을 반영하여 보조 데이터 집합이 주 데이터 집합을 반영하도록 주 데이터 집합의 oplog 복제하고 데이터 집합에 연산을 적용합니다. 프라이머리를 사용할 수 없는 경우 적합한 세컨더리 구성원이 투표를 실시하여 스스로 새로운 프라이머리를 선출합니다.

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

 

비동기 복제(Asynchronous Replication)

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

Slow Operations

버전 4.2부터 복제본 세트의 세컨더리 구성원은 oplog를 적용하는데 slow operation threshold보다 시간이 오래 걸리는 oplog 항목을 기록합니다.

 

  • 진단 로그의 세컨더리 구성원에 대해 기록됩니다.
  • REPL 구성 요소 아래에 적용된 op이라는 텍스트와 함께 다음 처럼 기록됩니다
    • op:: <oplog entry> took <num>ms.
  • log levels및 profiling level과 관계없이 출력됩니다.
  • MongoDB 버전에 따라 slowOpSampleRate의 영향을 받을 수 있습니다:
    • MongoDB 4.2에서는 이러한 느린 oplog 항목이 slowOpSampleRate의 영향을 받지 않습니다. MongoDB는 샘플 속도에 관계없이 모든 느린 oplog 항목을 기록합니다.
    • MongoDB 4.4 이상에서는 이러한 느린 oplog 항목이 slowOpSampleRate의 영향을 받습니다.

Automatic Failover

프라이머리 구성원이 구성된 electionTimeoutMillis(기본값 10초) 동안 집합의 다른 구성원과 통신하지 않으면, 자격을 가진 보조 구성원이 자신을 새 기본 구성원으로 지명하기 위해 선거를 요청합니다. 클러스터는 새 주체의 선출을 완료하고 정상 작동을 재개하려고 시도합니다.

몽고DB의 Replica Set는 선거가 성공적으로 완료될 때까지 쓰기 작업을 처리할 수 없습니다. 프라이머리에서 수행되는 쿼리가 오프라인 상태인 동안 세컨더리에서 실행되도록 구성된 경우 Replica set는 읽기 쿼리를 계속 처리할 수 있습니다.

 

클러스터가 새 프라이머리를 선택하기까지의 평균 시간은 기본 복제본 구성 설정을 가정할 때 일반적으로 12초를 초과하지 않아야 합니다. 여기에는 프라이머리를 사용할 수 없음으로 표시하고 선거를 완료하는 데 필요한 시간이 포함됩니다. settings.electionTimeoutMillis 복제 구성 옵션을 수정하여 이 기간을 조정할 수 있습니다. 네트워크 대기 시간과 같은 요인으로 인해 Replica set 선거가 완료되는 데 필요한 시간이 연장될 수 있으며, 이는 다시 클러스터가 프라이머리 없이 작동할 수 있는 시간에 영향을 줍니다.

 

기본값인 10000(10초)에서 electionTimeoutMillis 복제 구성 옵션을 낮추면 프라이머리 장애를 더 빨리 감지할 수 있습니다. 그러나 프라이머리가 정상적으로 작동하더라도 일시적인 네트워크 대기 시간 등의 요인으로 인해 클러스터에서 선거를 더 자주 호출할 수 있습니다. 이로 인해 w : 1 쓰기 작업에 대한 롤백이 증가할 수 있습니다.

w:1 쓰기 작업
쓰기 작업이 독립형 몽고드 또는 복제본 세트의 프라이머리에 전파되었다는 확인을 요청합니다. 쓰기 작업이 보조 서버에 복제되기 전에 기본 서버가 다운되면 데이터를 롤백할 수 있습니다.

 

애플리케이션 연결 로직에는 자동 페일오버 및 후속 선택에 대한 허용 로직이 포함되어야 합니다. MongoDB 드라이버는 기본값의 손실을 감지하고 특정 쓰기 작업을 한 번만 자동으로 재시도할 수 있습니다. 1회 시도하는 자동 장애 조치 및 선택에 대한 추가적인 내장 처리 기능을 제공합니다:

호환되는 드라이버는 기본적으로 쓰기 재시도를 활성화합니다.

버전 4.4부터 MongoDB는 다음을 제공합니다.
미러링 읽기
를 제공하여 선출 가능한 보조 구성원의 캐시를 가장 최근에 액세스한 데이터로 미리 워밍업합니다. 보조 구성원의 캐시를 미리 워밍업하면 선거 후 성능을 더 빠르게 복원하는 데 도움이 될 수 있습니다.

 

Transactions

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

읽기 작업이 포함된 분산 트랜잭션은 읽기 작업 시에 프라이머리(primary) 설정을 기본으로 사용해야 합니다. ( Distributed transactions that contain read operations must use read preference primary.)

특정 트랜잭션의 모든 작업은 동일한 멤버로 라우팅되어야 합니다.

트랜잭션이 커밋될 때까지는 트랜잭션에서 변경된 데이터는 트랜잭션 외부에서 볼 수 없습니다.

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

 

참고자료

Replication — MongoDB Manual

facebook twitter kakaoTalk kakaostory naver band shareLink