콘텐츠로 이동

복제 셋·고가용성 (Replication)

개요

MongoDB의 replica set(복제 셋)은 같은 데이터 셋을 유지하는 여러 mongod 프로세스의 묶음이에요. 복제 셋은 중복성(redundancy)과 고가용성(high availability)을 제공하며, 모든 프로덕션 배포의 기반이 돼요. 데이터를 여러 서버에 복사해 두니 서버 하나를 잃어도 데이터를 잃지 않아요.

MongoDB에서 복제(replication)는 두 가지를 줘요. 하나는 데이터 가용성 — 여러 데이터베이스 서버에 데이터 복사본을 나눠 두어 단일 서버의 손실을 견디는 것. 다른 하나는 읽기 용량 — 클라이언트가 다른 서버로 읽기 연산을 보낼 수 있어서 읽기 부하를 분산할 수 있어요.

핵심 개념

프라이머리(Primary)와 세컨더리(Secondary)

복제 셋은 여러 노드로 이뤄져요.

  • 프라이머리(primary)모든 쓰기 연산을 받는 노드예요. 복제 셋에는 보통 하나의 프라이머리가 있어요. 프라이머리는 자신의 데이터 변경 내용을 oplog(연산 로그)에 기록해요.
  • 세컨더리(secondary) — 프라이머리의 oplog를 복제해서 자기 데이터 셋에 적용해요. 그래서 세컨더리의 데이터가 프라이머리의 데이터를 따라가요.
  • 아비터(arbiter) — 선거(election)에 참여하지만 데이터를 보관하지 않는 노드예요. 데이터 중복성을 제공하지 않아요.

각 복제 셋 노드는 하나의 복제 셋에만 속할 수 있어요.

비동기 복제

세컨더리는 프라이머리의 oplog를 비동기(asynchronously)로 복제·적용해요. 그 때문에 세컨더리에서 읽은 데이터가 프라이머리의 최신 상태를 반영하지 못할 수도 있어요. 읽기 지연(일관성)과 성능 사이의 트레이드오프를 이해해야 해요.

자동 장애 조치 (Automatic Failover)

프라이머리가 죽으면 복제 셋이 선거를 통해 새 프라이머리를 뽑아요. MongoDB는 미러링된 읽기(mirrored reads)로 선거 가능한 세컨더리의 캐시를 미리 데워서, 장애 조치 후 성능을 빠르게 복구할 수 있게 돕기도 해요.

읽기 기본 설정 (Read Preference)

세컨더리 읽기는 비동기라 최신 데이터를 보장하지 않아요. 그래서 어떤 노드에서 읽을지는 read preference로 정해요. 기본 값은 primary(프라이머리에서만 읽기)예요.

트랜잭션·변경 스트림

  • 멀티 문서 트랜잭션은 복제 셋에서 사용할 수 있어요. 트랜잭션 안의 읽기는 read preference가 primary여야 해요.
  • 변경 스트림(change streams)은 복제 셋과 샤드 클러스터에서 쓸 수 있어요. 애플리케이션이 oplog를 직접 뒤지지 않고도 실시간 데이터 변경에 접근할 수 있게 해줘요.

실제 적용 (데이터스케쳐스)

복제는 운영 환경에서 데이터를 잃지 않게 하는 기본 장치예요.

  • 고가용성 — 노드 하나가 죽어도 복제 셋이 계속 동작하게 해요. 자동 장애 조치로 새 프라이머리가 선출돼요.
  • 읽기 부하 분산 — 세컨더리로 읽기를 보내 읽기 용량을 늘릴 수 있어요. 단, 최신 데이터를 보장하지 않으니 지연이 허용되는 읽기에만 써요.
  • 변경 스트림으로 실시간 반응 — 콘텐츠가 바뀌는 걸 실시간으로 감지해야 한다면 change streams로 이벤트를 받아요.

우리는 쓰기 정합성이 중요한 데이터는 PostgreSQL이, 자유로운 콘텐츠는 MongoDB가 맡아요. MongoDB의 콘텐츠 저장소도 프로덕션 배포의 기반인 복제 셋으로 운영해 고가용성을 확보하는 게 원칙이에요.

더 알아보기