Replica

saewoohan·2024년 12월 24일

MongoDB

목록 보기
2/2
post-thumbnail
  • Replica는 DB의 데이터들을 여러 서버에 동기화 하는 것을 의미한다.
  • 여러 서버가 모두 동일한 데이터를 가짐에 따라 하나의 서버가 다운 되더라도 서비스에 문제가 생기지 않고 운영되게 하는 것이 주된 목적이다.

구성 요소

Primary node

  • Primary는 모든 쓰기 작업을 처리하는 유일한 멤버이다. 모든 쓰기 작업은 Primary에서 수행된 후 Oplog에 기록된다.

  • 이때, Secondary 멤버들은 Primary의 Oplog를 비동기적으로 복제하여 동일한 데이터 셋을 유지한다.
  • Replica set에서 모든 노드들은 read 연산을 수행할 수 있지만, 기본적으로 application의 읽기 작업을 Primary 멤버 로 전송한다.
  • Replica set에는 최대 하나의 Primary 멤버만 존재할 수 있으며, 현재 Primary가 사용이 불가능하다면, 선거를 통해 새로운 Primary가 선출된다.

  • 네트워크 분할시에는 일부 노드가 일시적으로 서로 자신이 Primary라고 잘못 판단할 수 있다.
  • 하지만, 실제로는 { w: "majority"} 를 완료할 수 있는 노드만 Priamry로 인식된다. (과반수 이상의 Secondary노드가 oplog에 적힌 변경 사항을 영구적으로 반영했다는 것)
    • 이 경우에는 이전 Primary 노드에 연결한 어플리케이션은 primary를 요청했음에도 불구하고 오래된 데이터를 보게 되며, 이전의 primary node에 대한 쓰기는 결국 롤백된다.

Secondary node

  • Secondary는 Primary(Oplog)의 데이터를 복제하여 동일한 데이터 셋을 유지한다.
  • 쓰기 작업을 불가능 하지만, 읽기 작업은 Secondary에서도 가능하며, Read Preference를 조정하여, Secondary에서 데이터를 읽어올 수 있다.
  • 만약 Primary가 비활성화 된다면, Secondary중 하나가 선거를 통해 Primary로 승격된다.
  • Secondary는 그렇기 때문에 여러개가 될 수 있다.
  • 특정 Secondary는 설정을 통해 Primary로 승격되지 않도록 조정할 수 있으며, 목적에 맞게 히스토리 저장소 혹은, 특별한 트래픽 처리 용도로 설정할 수 있다.

Priority 0 Replica Set Members

  • primary 0멤버는 primary가 될 수 없으며, 투표를 트리거할 수 없는 멤버이다. (하지만 투표에는 참가 가능)
  • 하지만, 여전히 데이터를 복제하고 읽기 요청을 처리할 수 있다.
  • 공식문서에서 소개하는 사용 사례는, 주 데이터 센터에서 멀리 떨어진 지연 시간이 긴 데이터 센터에 배치되거나, 특정 세컨더리가 Primary로 승격되지 않도록 설정할 때 사용한다고 한다.
  • 즉, 로컬 읽기 요청은 잘 처리할 수 있지만 긴 대기시간이 소요되는 인스턴스이기에 primary 작업을 하기에는 적합하지 않는 경우 사용하는 것이다.

Hidden Replica Set Members

  • Hidden Member은 주로 백업, 분석, 로깅또는 데이터 복구와 같은 용도로 사용된다.
    • 그 이유는 애플리케이션 트래픽을 받지 않는 멤버이기 때문이다.
  • 기본적으로 Primary로 승격되지 않으며, Hidden Member는 항상 Secondary 역할만 수행하며, 데이터 복제에만 사용된다.
  • 또한, 투표권을 가지고 있으며 쓰기 작업도 승인할 수 있다.
    • w: <number> 로 실행된 쓰기 작업을 승인할 수 있고, majority를 사용하여 쓰기 작업을 승인하려면 투표권을 가지고 있어야 한다.

Delayed Replica Set Members

  • 지연 멤버는 데이터 세트의 이전 또는 지연된 상태를 반영한다.
    • 그렇기에 백업 데이터 혹은 스냅샷 용도로 사용 될 수 있으며, 다양한 종류의 복구 작업에 사용될 수 있다.
  • 필수 사항이 존재하는데
    • priorty 0 member이여야 한다. (primary가 되지 않도록 해야하기 때문에)
    • hidden member여야 한다. (애플리케이션은 지연 멤버를 알 필요도 없으며, 쿼리를 못하도록 해야하기 때문에)
    • 만약, mombers[n].votes를 1로 설정한 경우 투표권을 갖는다.
  • 또한, 쓰기 작업도 승인할 수 있다.
    • w: <number> 로 실행된 쓰기 작업을 승인할 수 있고, majority를 사용하여 쓰기 작업을 승인하려면 투표권을 가지고 있어야 한다.

Arbiter

  • Arbiter는 선거 과정에서만 참여하며 데이터를 저장하지 않는 멤버이다.
    • 데이터를 저장하지 않기 때문에 Primary로 승격할 수 없다.
  • Arbiter는 특히 비용 문제로 Secondary를 추가할 수 없을 때 사용되며, 1개의 투표권을 가지고 선거에 참여한다.

Arbiter는 Primary나 Secondary멤버와 같은 서버에서 실행해서는 안된다.

리소스를 적게 사용하기에 같은 서버에 실행해도 되지 않을까 싶지만, 서버 장애가 발생할 경우 Arbiter과 다른 멤버도 함께 사용할 수 없는 문제가 발생한다.

또한 선거 결과에 영향을 끼칠 수 있다고 한다.

3 node replica sets

  • MongoDB에서 replica set을 구성하기 위한 최소 세트 멤버 수는 3개이다.
  • 이때, 3개의 데이터를 보유하는 멤버를 가지는 경우 (Primary-Secondary-Secondary)
  • 혹은, 비용 등의 이유를 3번째 데이터 보유 멤버 없이 중재자를 추가하는 경우이다. (Primary-Secondary-Arbiter)

P-S-S

  • 하나의 Primary와 두 개의 Secondary로 이루어진 구조이다.
  • 이때 두 Secondary모두 투표를 통해 Primary로 승급이 가능하다.
  • 이러한 아키텍처에서는 기본 복사본 외에도 완전한 두 복사본을 가지고 있기에, 기본을 사용할 수 없는 경우 투표를 통해 Primary로 올라갈 node를 선출한다.
    • 중요한 점은, Secondary가 하나만 남았을 때에는 투표가 불가능하다. 그렇기에 Primary는 선출되지 않으며 쓰기작업은 불가능해진다.

P-S-A

  • 하나의 프라이머리와, 하나의 Secondary, 하나의 Arbiter로 이루어진 아키텍처이다.
  • 이때, Arbiter는 투표권만 가지고 있고 실제 데이터는 가지고 있지 않기에 투표시에 Secondary가 Primary로 선출되는 구조이다.

선거

  • 선거는 MongoDB Replica Set에서 Primary노드가 더이상 사용될 수 없을 때, 새로운 Primary를 결정하기 위해 트리거되는 프로세스이다.
  • Replica Set은 투표가 성공적으로 완료될 때까지 Primary가 존재하지 않기에 쓰기 작업을 처리할 수 없다.
  • 또한, 새 Primary를 선택하기까지의 시간 중앙값은 일반적으로 12초를 추가하면 안된다고 한다.
    • 이는 프라이머리를 사용 불가로 표시하고, 투표를 호출 및 완료하는 데 필요한 시간을 포함한 것이다.

트리거 되는 상황

  1. 새로운 노드를 replica set에 추가한 경우
  2. replica set이 새로 만들어지는 경우
  3. rs.stepDown() 혹은 rs.reconfig()를 통해 수동으로 트리거
  4. Secondary node가 Primary와 10초 이상 통신할 수 없을 때, 트리거

투표에 영향을 미치는 조건

  1. 노드의 우선순위(priority)
    • 각 노드는 우선순위(priority) 속성을 가질 수 있다. 우선순위가 높은 노드는 선거에서 더 많은 투표를 받을 가능성이 크며, Primary로 선출될 가능성이 높은 것이다.
    • 우선순위 값이 0인 노드는 Primary가 될 수 없다.
  2. 하트비트(Heartbeat)
    • 복제본 세트의 모든 노드는 2초마다 핑(ping) 신호를 보내어 서로의 상태를 확인하는데, 만약 10초 이내에 응답이 없으면 다른 노드는 해당 노드를 액세스 할 수 없는 것으로 표시한다.
  3. 데이터 센터 분포
    • 여러 데이터 센터에 분산된 복제본 세트의 경우, 특정 데이터 센터가 손실되면 다른 데이터 센터에 있는 노드가 새로운 Primary로 선출된다.
  4. 네트워크 파티션
    • 네트워크 파티션으로 인해 일부 노드가 서로 통신할 수 없는 경우, Primary는 자신이 소수의 노드와만 연결되어 있으면 Primary 역할을 중단하고 Secondary로 전환된다.
    • 반면, 네트워크 파티션에서 다수의 노드와 연결된 노드는 새로운 Primary로 선출 될 수 있다.

Write Concern for replica sets

  • w: "majority"로 설정된 쓰기 우선순위는, 데이터 저장 및 투표 가능한 멤버 중 과반수에 해당하는 멤버들이 쓰기 작업을 영구적으로 커밋했음을 확인받아야 한다.
  • w: 1로 설정된 쓰기 우선순위는, Primary member로 부터 쓰기 작업이 성공적으로 수행되었음을 확인 받으면, 쓰기 작업을 완료하였음을 반환한다.
  • w: 1보다 크게 설정된 우선순위는 지정된 숫자만큼의 멤버가 쓰기 작업을 성공적으로 수행했음을 확인 받아야 한다.
    • 이때 투표 가능한 멤버가 아니여도 상관이 없다.

Read Preference

  • 읽기 작업은 기본적으로 Primary member로 라우팅 된다. 하지만 읽기 우선 순위를 지정하여 바꿀 수 있다.

Read Preference Modes

  1. primary
    • 기본 모드로, 모든 작업은 Primary에서 읽는다.
    • 이때, 프라이머리가 사용할 수 없는 경우에는 오류가 발생한다.
  2. primaryPreferred
    • 주로 프라이머리에서 읽지만, 프라이머리가 불가능한 경우 secondary에서 읽는다.
  3. secondary
    • 모든 작업을 secondary에서만 읽는다. 이때, secondary가 없으면 에러가 발생한다.
  4. secondaryPreferred
    • 주로 세컨더리에서 읽지만, 없을 경우 Primary에서도 읽는다.
  5. nearest
    • 네트워크 지연 시간을 기준으로 가장 가까운 멤버에서 읽는다.

이때 주의할 점은, Primary모드를 제외한 모든 우선순위는 지연된 데이터를 반환할 수 있다. (비동기적으로 복제하기 때문에)

0개의 댓글