-
ReplicaSetDatabase/MongoDB 2023. 2. 2. 22:49
ReplicaSet 구성
Primary : 메인 DB
Secondary : Primary DB 정보를 동기화 ( Primary 절체시 Primary로 동작 )
Arbiter : 데이터 동기화 하지 않으며, 절체시 다음 Primary를 선정하는데 사용
성능규격상에는 천대이상이 하나의 ReplicaSet으로 구성될 경우 성능상 이슈가 있을 수 있으며,
각 ReplicaSet을 구성하는 서버들은 같은 장비에 구성하지 않는 것을 권고합니다.Primary
레플리카 셋에서 프라이머리 노드는 단 하나만 존재 할 수 있습니다. 프라이머리만이 직접적으로 클라이언트와 정보를 주고 받기 때문에 프라이머리가 장애가 발생하거나 네트워크에 문제가 발생하면 실제 레플리카셋이 구성되어 있더라도 세컨더리가 프라이머리로 올라오는 동안 실제 데이터를 읽고 쓰는 것이 일시적으로 중단될 수 있습니다.
Secondary
세컨더리의 가장 중요한 역할은 프라이머리 노드로부터 데이터를 동기화 하고, 장애시 프라이머리로의 역할 전환에 있습니다.
두번째, 프라이머리의 장애 상황에서 어떤 세컨더리 노드를 프라이머리로 올릴것인지 투표권을 가지고 있습니다.
세번째, 클라이언트의 읽기 작업을 분담할 수 있습니다.
이 것은 여타 다른 오픈소스 DBMS들 역시 가지고 있는 기능인데, DB의 작업들이 대부분 읽기에서 많이 발생하기 때문에 읽기 작업을 복제노드로 분산시켜 DB의 읽기 부하를 줄이는 역할을 합니다.
하지만 프라이머리와 세컨더리의 동기화 시간을 즉각적이지 않기 때문에 실시간 반영이 필요한 부분에서는 적용하기가 다소 어려운 부분이 있고, 실시간 반영이 필요하지 않는 부분에 있어서는 읽기 작업에 대한 역할을 세컨더리에 분산시켜 부하를 줄일수 있습니다.마지막으로는 지연된 읽기 복제 기능입니다. 실제 프라이머리에 쓰기 작업을 발생하여 데이터가 생성되어도 일정시간 간격을 두고 복제를 진행하기 때문에 사람의 실수를 방지하고, 패치나 배치 작업 이후 DB를 되돌려야 하는 상황이 발생 했을때 지연된 시간만큼 원래 데이터로 복구가 가능해 집니다. 또 지연된 복제 기능으로 구성된 세컨더리 노드는 투표권이 없고, 장애 발생시 세컨더리 노드가 가지는 기능인 예비 프라이머리 노드의 역할을 하지 않습니다. 오로지 수동으로만 프라이머리로 승격이 가능합니다.
Arbiter
아비터 노드의 역할은 위에서 설명했듯이 투표권만을 가지고 레플리카 셋을 모니터링하는 역할을 합니다. 레플리카셋을 3대 이상의 홀수로 구성할 수 없을시, 아비터 없이도 구성가능합니다.
설정
vi /etc/mongod.conf replication: replSetName: "rs0" net: bindIp: 0.0.0.0
$ mongo > rs.initiate( { _id : "rs0", members: [ { _id: 0, host: "mongodb01:27017" }, { _id: 1, host: "mongodb02:27017" }, { _id: 2, host: "mongodb03:27017" } ] }) { "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1609920364, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1609920364, 1) } > rs.add("ip:port") // Add Member > rs.conf() > db.isMaster() 혹은 rs.isMaster() // Secondary 의 경우 shell 사용을 위해 아래명령어 입력 > rs.secondaryOk()
ARBITER ARBITER 멤버의 수는 짝수여야 한다. 만약 홀수로 지정되면 PRIMARY 선출 시 동일 득표를 얻는 일이 발생할 수 있다. replica set의 PRIMARY 또는 SECONDARY 멤버를 호스팅하는 동일한 시스템에서 ARBITER를 구동하면 절대 안 된다! $ mongod --port 30000 --dbpath [DATA_PATH] --replSet rs0 mongo --host primary > rs.addArb("ip:30000")
ARBITER 없이 절체간 우선순위 지정동작 $ mongo > cfg = rs.conf() //(A, B) 2개의 DB 중 B 가 1번째라고 하자 A 가 0번째 > cfg.members[1].priority = 0 > rs.reconfig(cfg) > exit $ systemctl restart mongod
'Database > MongoDB' 카테고리의 다른 글
ReadConcern & WriteConcern (1) 2023.02.02 Transaction (0) 2023.02.02 2대의 서버로 구성하는 개발용 Shard Cluster (1) 2023.02.02 Sharding & Cluster (1) 2023.02.02 View (0) 2023.02.02