Database/MongoDB

[MongoDB] MongoDB ReplicaSet 기본 구성

Potato_H 2024. 9. 11. 17:58
반응형

MongoDB ReplicaSet

  • Replica Set (몽고 이중화)
    • 가장 일반적인 이중화 방법, 데이터를 복제하여 장애 복구
    • 몽고디비를 사용하면 레플리카셋을 생성함으로써 레플리카를 설정할 수 있음
    • 레플리카셋은 클라이언트 요청을 처리하는 프라이머리 서버 한 대와, 프라이머리 데이터의 복사본을 갖는 세컨더리 서버 여러대로 이루어짐
    • 프라이머리 서버에 장애가 발생하면 세컨더리 서버를 자신들 중에서 새로운 프라이머리 서버를 선출할 수 있음
    • 복제를 사용하는 상태에서 서버가 다운되면, 복제 셋에 있는 다른 서버를 통해 데이터에 접근할 수 있음
    • 서버상의 데이터가 손상되거나 접근할 수 없는 상태라면 복제 셋의 다른 멤버로부터 새로운 복제 데이터를 만들 수 있음

Replica Set 설계 방법

  • 복제 셋을 설계하기에 앞서 과반수 개념을 알아둬야함
  • 프라이머리를 선출하려면 멤버의 과반수 이상이 필요하고, 프라이머리는 과반수 이상이어야만 프라이머리 자격을 유지할 수 있음
  • 과반수는 복제 셋의 구성에 따라 산정되므로, 얼마나 많은 멤버가 다운되거나 사용할 수 없는 상태인지는 중요하지 않음
  • ex) 다섯 멤버 중 세개가 다운되면 과반수에 미치지 않으므로 프라이머리를 선출할 수 없음

어떻게 선출하는가?

  • 세컨더리가 프라이머리가 되지 못하면 다른 멤버들에 이를 알리고 자신을 프라이머리로 선출할 것을 요청
  • 요청 받은 멤버들은 검사를 수행 -> 요청받은 멤버가(선출되고자 하는 멤버가 도달할 수 없는) 프라이머리에 도달할 수 있는가? / 선출되고자 하는 멤버의 복제 데이터가 최신인가? / 대신 선출되어야 하는 우선순위가 더 높은 멤버는 없는가?
  • 복제셋 멤버는 2초마다 서로 하트비트를 보냄, 10초 이내에 멤버가 하트비트가 반환하지 않으면, 다른 멤버가 그 불량 멤버를 접근할 수 없음으로 표시
  • 노드의 종류
    1. Primary Node : 클라이언트 요청을 처리하고 데이터를 기록하는 주요 노드 / Read/Write를 수행
    2. Secondary Node : Primary의 데이터를 복제하여 백업 역할 수행. Primary 장애 시 새로운 Primary로 승격 가능 / Read에 대한 분산처리를 수행
    3. Arbiter Node : 투표권만 가지고 데이터를 저장하지 않으며, Primary 선출에 참여

  • P-S-S 방식과 P-S-A 방식
    • P-S-S : 만약 Primary 노드가 장애가 발생하면, 투표를 통해 새로운 Primary를 선출하여 고가용성을 확보
    • P-S-A : P-S-S와 같지만, 추가로 Arbiter 노드가 별도로 존재, Arbiter 노드의 경우 데이터를 가지고 있지 않고 새로운 노드를 선출하는 투표만 진행
    • 차이점 : Arbiter(컨트롤러와 유사)의 유무와 이에 따른 데이터 저장 여부인 리소스 소비의 차이가 있음
  • 용어 정리
    • Election : primary node가 이용 불가능한 상태에 빠졌을 때, secondary node들 중에서 primary node를 하나 정하는 과정을 의미
    • Heartbeat : Replica set 내의 모든 노드들은 정해진 초(second)마다 서로에게 heartbeat(일종의 ping)를 보냄, Heartbeat가 특정 초 동안 수신되지 않으면 다른 node들이 Election을 준비
    • Failover 지원 : Primary 노드에 장애가 발생하면 Secondary 노드 중 하나가 자동으로 Primary로 승격
    • 읽기 전용 부하 분산 : Secondary 노드에서 읽기 작업을 처리하여 Primary 부하 분산 가능

구성 예시

  • 프라이머리인 몽고디비에 데이터를 동기화함과 동시에 세컨더리에도 데이터가 복제
  • 해당 예시의 Replica Set은 한 서버 안에서 테스트한 형태이므로, 실제 Replica Set 구성 시에는 서버와 서버로 DB를 분리하여 저장하면 됨

서버 2대로 구성한다고 가정했을 때,
ex1) Primary + Secondary + Arbiter
서버 1: Primary + Arbiter
서버 2: Secondary

ex2) Primary + Secondary + Secondary
서버 1: Primary
서버 2: Secondary + Secondary

Replica Set 세팅 (Primary + Secondary + Secondary)

  • 서버 하나로 테스트 구성
    # 서버에서 각 노드(Primary, Secondary, Arbiter)를 실행
    

Primary 컨테이너 실행

docker run -d
--name mongodb_primary
-p 27017:27017
-v /data/db_primary:/data/db
--hostname mongodb_primary
mongo:latest --replSet myReplicaSet

Secondary 컨테이너 1 실행

docker run -d
--name mongodb_secondary1
-p 27018:27017
-v /data/db_secondary1:/data/db
--hostname mongodb_secondary1
mongo:latest --replSet myReplicaSet

Secondary 컨테이너 2 실행

docker run -d
--name mongodb_secondary2
-p 27019:27017
-v /data/db_secondary2:/data/db
--hostname mongodb_secondary2
mongo:latest --replSet myReplicaSet

Replica Set 초기화

Primary에 접속

docker exec -it mongodb_primary mongosh
#Replica Set 초기화
rs.initiate({
_id: "myReplicaSet",
members: [
{ _id: 0, host: "localhost:27017" }, // Primary
]
});
#Secondary 1 추가
rs.add("localhost:27018");
#Secondary 2 추가
rs.add("localhost:27019");
#Replica Set 상태 확인
rs.status();
```
반응형