Database/MongoDB
[MongoDB] MongoDB ReplicaSet 기본 구성
Potato_H
2024. 9. 11. 17:58
반응형
MongoDB ReplicaSet
- Replica Set (몽고 이중화)
- 가장 일반적인 이중화 방법, 데이터를 복제하여 장애 복구
- 몽고디비를 사용하면 레플리카셋을 생성함으로써 레플리카를 설정할 수 있음
- 레플리카셋은 클라이언트 요청을 처리하는 프라이머리 서버 한 대와, 프라이머리 데이터의 복사본을 갖는 세컨더리 서버 여러대로 이루어짐
- 프라이머리 서버에 장애가 발생하면 세컨더리 서버를 자신들 중에서 새로운 프라이머리 서버를 선출할 수 있음
- 복제를 사용하는 상태에서 서버가 다운되면, 복제 셋에 있는 다른 서버를 통해 데이터에 접근할 수 있음
- 서버상의 데이터가 손상되거나 접근할 수 없는 상태라면 복제 셋의 다른 멤버로부터 새로운 복제 데이터를 만들 수 있음
Replica Set 설계 방법
- 복제 셋을 설계하기에 앞서 과반수 개념을 알아둬야함
- 프라이머리를 선출하려면 멤버의 과반수 이상이 필요하고, 프라이머리는 과반수 이상이어야만 프라이머리 자격을 유지할 수 있음
- 과반수는 복제 셋의 구성에 따라 산정되므로, 얼마나 많은 멤버가 다운되거나 사용할 수 없는 상태인지는 중요하지 않음
- ex) 다섯 멤버 중 세개가 다운되면 과반수에 미치지 않으므로 프라이머리를 선출할 수 없음
어떻게 선출하는가?
- 세컨더리가 프라이머리가 되지 못하면 다른 멤버들에 이를 알리고 자신을 프라이머리로 선출할 것을 요청
- 요청 받은 멤버들은 검사를 수행 -> 요청받은 멤버가(선출되고자 하는 멤버가 도달할 수 없는) 프라이머리에 도달할 수 있는가? / 선출되고자 하는 멤버의 복제 데이터가 최신인가? / 대신 선출되어야 하는 우선순위가 더 높은 멤버는 없는가?
- 복제셋 멤버는 2초마다 서로 하트비트를 보냄, 10초 이내에 멤버가 하트비트가 반환하지 않으면, 다른 멤버가 그 불량 멤버를 접근할 수 없음으로 표시
- 노드의 종류
- Primary Node : 클라이언트 요청을 처리하고 데이터를 기록하는 주요 노드 / Read/Write를 수행
- Secondary Node : Primary의 데이터를 복제하여 백업 역할 수행. Primary 장애 시 새로운 Primary로 승격 가능 / Read에 대한 분산처리를 수행
- 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();
```
반응형