몽고db / 몽고디비 / replica set 의 장점 / cluster / 클러스터 / mongo replicaset/ replica / $merge 하면 어떤 노드로 / $merge 하면 secondary / slave
mongodb, replica set
ref. 1 의 내용을 정리했다.
replica set 의 이점
- fault tolerance
- read operation 의 capacity 를 늘려줌
mongodb cluster 는 primary node 와 replica set 이 될 secondary node 의 set 이 필요
- primary node
- seconday node들
secondary node 의 역할
- primary node 의 operation log 를 복사하고
- data set들이 primary node 의 data set 을 정확하게 반영한다.
primary node 의 operation log(oplog) 가 secondary 들로 복사되는 것은 비동기적으로 일어난다. 이렇게 비동기적으로 처리를 하는 덕분에 replica set 이 한개이상의 member 의 잠재적인 실패를 해도 지속적으로 동기화가 되게 해준다.
primary node 가 죽는 경우
현재의 primary node 가 갑자기 죽으면, election(투표)이 일어나서 새로운 primary node 를 뽑게 된다. 위 그림처럼 2개의 secondary node 를 갖는 시나리오에서는 2개의 secondary node 중 하나가 primary node가 된다.
arbiter
만약 1개의 secondary node 가 존재하면, arbiter 라고 불리는 특별한 instance 가 replica set 에 추가될 수 있다.
이 arbiter(결정권자) 는 primary 로 부터 oplog 를 복사하지 않고, 단순히 replica set election 들에만 참여할 수 있다.
arbiter 의 특징
- data redundancy 를 제공할 수 없다
- 항상 arbiter 이다. primary 또는 secondary node 가 될 수 없다. 참고로, prmary node 는 secondary node 가 될 수 있고, secondary node 가 primary node 가 될 수도 있다.
replica set에서 read operation
client 에서 read operation 이 오면 기본적으로 모두 primary 로 가게 되어 있다. 그런데, read preference 를 설정해서 특정 secondary 로 보낼 수 있다.
여러개의 read preference 가 있다.
- secondary : replica set의 secondary 에서 read 를 한다.
- nearest : network latency 가 작은쪽의 node 에서 read 를 하는 option
그런데, asynchronous replication 때문에 이 option 은 잠재적으로 오래된 data(stale data) 를 사용하게 될 수 있다.
대안으로, primary preferred
또는 secondary preferred
를 사용하면 된다.
이 mode 들은 read operation 이 replica set 의 어떤 node 로 갈지 정할 때 maxStalenessSeconds
라는 속성을 사용한다.
read operation 이 non-primary node 로 갈 경우가 있는 모든 상황에서 그 data 를 사용하는 application 이 stale data 를 사용해도 괜찮은지를 항상 고려해야 한다.
write
mongodb replica set 에 write를 할 때 cluster 전체에 성공적으로 write 이 진행되게 하기 위해서 추가적인 option들을 포함할 수 있다.
이것은 insert operation 과 함께 write concern 속성을 추가하는 것이다.
“write concern” 은 cluster 로 부터 갖기를 바라는 ack 의 level 이다. 이것은 다음과 같이 구성되어 있다.
{ w: <value>, j: <boolean>, wtimeout: <number> }
아래처럼 사용할 수 있다.
db.products.insert(
{ item: "envelopes", qty: 100, type: "Clasp"},
{ writeConcern: { w: "majority", wtimeout: 5000 }}
)
write concern option 들
w
- 0: no write ack(acknowledgement) 가 필요하다.
- 1: 기본값, primary node의 ack 가 필요하다는 뜻
- x(x>=1) : 1 개의 primary node 의 ack 와 x-1 개의 secondary node 의 ack 가 필요
- 4 : 1개의 primary ack 와 3개의 secondary 들의 ack 신호가 필요하다.
- “majority” : 5 node 가 있으면, majority 는 3개의 node 를 뜻한다.
j
journal에 쓰였는지 여부, 이 journal 은 갑자기 죽었을 때(hard shutdown), mongodb 가 recovery 목적으로 사용한다. enable 이 default 이다.
wtimeout
- millisecond 값이다.
- 1 보다 큰 값이어야 한다.
- 이 값은 result 를 언제까지 기다릴지를 정하는 값이다.(wait timeout 으로 생각하면 될 듯)
- 이 값이 정의되지 않으면, 실제적인 write 이 network 이슈등에 의해 처리가 안되면 command 가 계속 block 된 채로 있게 된다. 그래서 이값을 set 하는 것이 좋다.
replica set의 수가 홀수가 좋은 이유
replica set 은 primary mongod process 와 secondary process 들로 이뤄졌다.
총 process들의 수는 ’홀수’로 하는 것이 좋다. 그래야 majority 의 수가 명확해진다. 이 majority 는 master 가 fail 되고, 새로운 master 가 할당되어야 할 때 사용된다.
$merge
aggregation 에서 $merge
를 사용하는 경우, $merge 이전 stage 들을 secondary node 에서 수행하고, $merge 부분만 primary 에서 수행된다고 한다. 다만 driver 가 지원을 안하는 경우도 있으니 확인이 필요하다고 한다.
Read operations of the $merge statement are sent to secondary nodes, while the write operations occur only on the primary node.
Not all driver versions support targeting of $merge operations to replica set secondary nodes. Check your driver documentation to see when your driver added support for $merge read operations running on secondary nodes.
See Also
- How to Set Up a MongoDB Cluster | MongoDB
- 쿠...sal: [컴][DB] MongoDB 에서 master-master 설정이 가능할까?, 2015-08
댓글 없음:
댓글 쓰기