DB 시스템들은 저마다의 다중화 방법이 있다.
Replica Set은 MongoDB에서 제공하는 다중화 방법의 첫발자국이라 할 수 있겠다.
홀로 설치된 DB시스템을 Standalone,
여러 Standalone 시스템들에 role을 부여해서 그룹화 한 것을 Replica Set,
다시 Replica Set들을 그룹화 한 것을 Shard Cluster라 한다.
오늘은 이 MongoDB의 Replica Set에 대해 알아보자.
고가용성
: 메인 노드가 다운되면 대기중인 서브 노드가 자동으로 메인 역할을 대체
읽기 분산
: 서브 노드로 READ 작업 부하를 분산
데이터 복구
: 메인 노드에 장애 발생하여 데이터가 유실되어도,
서브노드에 보관된 데이터로 복구 가능
Replica Set 방법에선 3개의 노드를 최소 구성요건으로 본다.
그 이하로도 억지로 구성을 할 순 있겠지만 작업중에 에러를 맞딱뜨릴 확률이 높고, 본래의 목적인 안정성에도 부합하지 않는다.

Primary에서 발생한 변경사항을 저장하는 oplog를 통해 Secondary에 데이터가 복제된다.
Primary 노드가 모종의 이유로 중단되면,
노드들간의 투표를 통해 가장 많은 표를 받은 노드가 Primary로 선출된다.

투표는 우선순위, 데이터의 최신화정도 등에 영향을 받는다.
이 투표가 동률을 이루지 않기 위해 노드 수를 홀수로 두는 것이 권장되며,
짝수로 이루어질 경우 Arbiter 노드를 생성하여 과반수투표가 성립되도록 한다.
Replication Set 구성을 확인하는 명령어
rs.conf() 조회 결과 일부rs.conf() { _id: 5, host: '192.168.123.456:27017', arbiterOnly: false, //Arbiter 아님 buildIndexes: true, hidden: false, priority: 1, tags: {}, secondaryDelaySecs: Long('0'), votes: 1 //투표권 가짐 }
PSS
: Primary - Secondary - Secondary
Stand-by DB가 두 멤버나 있기 때문에 안정적인 구조
PSA
: Primary - Secondary - Arbiter
PSS에 비해 상대적으로 안정성이 낮지만 최소한의 구성으로 높은 가용성을 유지할 수 있다.
(Arbiter의 경우에는 data를 저장하지 않고, R/W 불가한 매우 가벼운 노드로써 시스템 자원을 많이 먹지 않는다.)
Secondary node는 자원이 허락한다면 50개까지 추가 구성할 수 있으며 그 중 7개까지만 투표권을 부여할 수 있다.
rs.status()
: 상태 확인
rs.conf()
: 구성 확인
rs.add("<ip>:<port>")
: Replica Set에 멤버 추가
ex: rs.add("192.168.123.456:27017")
rs.remove("<ip>:<port>")
: 멤버 삭제
ex: rs.remove("192.168.123.456:27017")
rs.stepDown()
: 실행한 노드가 Primary면 Secondary로 전환
rs.reconfig(config)
: Replica Set 구성 변경
rs.addArb("<ip>:<port>")
: Replica Set에 Arbiter 추가
rs.isMaster()
: 현재 노드의 역할 확인
rs.initiate({_id:})
: ReplicaSet 설정 구성
rs.printSecondaryReplicationInfo()
: Lag상태 확인
rs.printReplicationInfo()
: oplog size 확인
rs.initiate(
{
_id : "rplSet1",
members: [
{ _id : 0, host : "192.168.123.456:27017" },
{ _id : 1, host : "192.168.123.457:27018" },
{ _id : 2, host : "192.168.123.458:27019", arbiterOnly:true }
]
}
)
var config = rs.config()
config.members[2].vote=0
rs.reconfig(config)
