- 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초를 추가하면 안된다고 한다.
- 이는 프라이머리를
사용 불가로 표시하고, 투표를 호출 및 완료하는 데 필요한 시간을 포함한 것이다.
트리거 되는 상황
- 새로운 노드를 replica set에 추가한 경우
- replica set이 새로 만들어지는 경우
rs.stepDown() 혹은 rs.reconfig()를 통해 수동으로 트리거
- Secondary node가 Primary와 10초 이상 통신할 수 없을 때, 트리거
투표에 영향을 미치는 조건
- 노드의 우선순위(priority)
- 각 노드는 우선순위(priority) 속성을 가질 수 있다. 우선순위가 높은 노드는 선거에서 더 많은 투표를 받을 가능성이 크며,
Primary로 선출될 가능성이 높은 것이다.
- 우선순위 값이 0인 노드는
Primary가 될 수 없다.
- 하트비트(Heartbeat)
- 복제본 세트의 모든 노드는
2초마다 핑(ping) 신호를 보내어 서로의 상태를 확인하는데, 만약 10초 이내에 응답이 없으면 다른 노드는 해당 노드를 액세스 할 수 없는 것으로 표시한다.
- 데이터 센터 분포
- 여러 데이터 센터에 분산된 복제본 세트의 경우, 특정 데이터 센터가 손실되면 다른 데이터 센터에 있는 노드가 새로운 Primary로 선출된다.
- 네트워크 파티션
네트워크 파티션으로 인해 일부 노드가 서로 통신할 수 없는 경우, Primary는 자신이 소수의 노드와만 연결되어 있으면 Primary 역할을 중단하고 Secondary로 전환된다.
- 반면, 네트워크 파티션에서 다수의 노드와 연결된 노드는 새로운 Primary로 선출 될 수 있다.
Write Concern for replica sets

w: "majority"로 설정된 쓰기 우선순위는, 데이터 저장 및 투표 가능한 멤버 중 과반수에 해당하는 멤버들이 쓰기 작업을 영구적으로 커밋했음을 확인받아야 한다.
w: 1로 설정된 쓰기 우선순위는, Primary member로 부터 쓰기 작업이 성공적으로 수행되었음을 확인 받으면, 쓰기 작업을 완료하였음을 반환한다.
w: 1보다 크게 설정된 우선순위는 지정된 숫자만큼의 멤버가 쓰기 작업을 성공적으로 수행했음을 확인 받아야 한다.
- 이때 투표 가능한 멤버가 아니여도 상관이 없다.
Read Preference
- 읽기 작업은 기본적으로
Primary member로 라우팅 된다. 하지만 읽기 우선 순위를 지정하여 바꿀 수 있다.
Read Preference Modes
- primary
- 기본 모드로, 모든 작업은
Primary에서 읽는다.
- 이때, 프라이머리가 사용할 수 없는 경우에는 오류가 발생한다.
- primaryPreferred
- 주로 프라이머리에서 읽지만, 프라이머리가 불가능한 경우
secondary에서 읽는다.
- secondary
- 모든 작업을 secondary에서만 읽는다. 이때, secondary가 없으면 에러가 발생한다.
- secondaryPreferred
- 주로 세컨더리에서 읽지만, 없을 경우
Primary에서도 읽는다.
- nearest
- 네트워크 지연 시간을 기준으로 가장 가까운 멤버에서 읽는다.
이때 주의할 점은, Primary모드를 제외한 모든 우선순위는 지연된 데이터를 반환할 수 있다. (비동기적으로 복제하기 때문에)