[컴][db] mongodb, replica set

 몽고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

  1. How to Set Up a MongoDB Cluster | MongoDB
  2. 쿠...sal: [컴][DB] MongoDB 에서 master-master 설정이 가능할까?, 2015-08

Reference

  1. MongoDB Clusters | MongoDB

댓글 없음:

댓글 쓰기