반응형

MongoDB 세팅을 해볼 기회가 생겨서, Auto FailOver를 지원한다는 ReplicaSet 구성부터 살펴보기로 하였다.


기본적으로 아무세팅도 건들지 않고, 서비스하는 경우 3.0버전 기준으로 Locking은 Read / Write Lock 형태로 Collection에 Lock이 걸리게 되기 때문에, 데이터 변동이 자주 일어나는 게임 서비스에는 부적합하다. 하지만, 3.0버전부터는 WiredTiger engine을 사용하여 Document 단위의 Lock을 지원하며, 현재 최신버전인 3.2버전부터는 WiredTiger engine을 기본 Storage Engine으로 제공하여, Document Lock을 지원한다.


자세한 설명은 아래 링크에 나와있다.

https://docs.mongodb.org/manual/core/storage-engines/


기본 Engine으로 제공할 정도면, 충분히 안정적이 되었다는 것이겠고, 앞으로 MongoDB는 3.2버전이상을 사용하는 것으로 하면 도움이 될 것 같다.


커널튜닝도 조금 필요하다. 

Ubuntu머신 기준으로 /sys/kernel/mm/transparent_hugepage/enabled

/sys/kernel/mm/transparent_hugepage/defrag 값이 always로 되어 있으면, Mongod데몬이 올라가면서 warning 메시지를 뱉게 된다.


Never로 세팅을 해주게 되면, 해당 Warning들이 없어지게 되며, 데이터베이스의 경우 저 옵션이 always로 되어 있는 경우에 예측하기 힘든 System Hang현상이 올 수도 있다고 한다.

아래 링크를 참고했음.

http://infoages.tistory.com/1297


여기까지 했으면, 중요하게 짚고 넘어가야할 설정에 대해서는 마무리 된 것 같고, 

다음으로 ReplicaSet에 대해 알아보자.


각 노드에서 mongod.conf (apt-get 설치 기준 default 위치 /etc/mongod.conf)를 열어서,

아래와 같은 내용을 추가한다.


replication:
   oplogSizeMB: 2048       // mysql의 binlog와 비슷한 개념으로, 데이터 복원 시 사용됨. 
                                // (숫자를 지정하지 않으면, 
                                //무한정 커지기 때문에 값을 지정해주는 것을 권장한다고 한다.)
   replSetName: rs-uvm      // replicaSet의 이름


각 노드들의 데몬을 재시작 한다.


마스터가 될 노드로 들어가서, mongo를 입력하여 command line으로 들어가서, 아래와 같은 명령어를 입력한다. (syntax만 맞다면 json 포맷이 마무리 되기 전까지 엔터를 쳐서 연결해도 문제 없다.)


# replicaSet의 정보를 config 변수에 담는다.


>  config = {
... _id: 'rs-uvm',
... members: [ {_id:0, host:'192.168.33.13:27017'},
... {_id:1, host:'192.168.33.14:27017'},
... {_id:2, host:'192.168.33.15:27017'}]}


# replicaSet을 config변수의 정보를 참조하여 start시킨다. (이때부터 각 노드의 데이터에 대해 복제가 시작됨)

> rs.initiate(config);


※ mongo에서 지원하는 replicaSet에 대한 auto FailOver의 경우 기본적으로 노드가 홀수로 구성이 되어야 한다. 그 이유는 master가 죽은 경우 나머지 노드들끼리 투표를 하여 누가 master가 될지를 정해야하는데, master를 제외한 노드가 하나밖에 없는 경우 어떤 장비가 더 적합한지 내부에서 판단하여 투표를 해서 master로 승격을 시켜야 하는데, 하나 밖에 없는 경우 그 기준이 애매하기 때문에 그렇다. 이런 경우 Arbiter노드라는 노드를 설정하여, 실제로는 데이터가 복제되지 않는 노드지만, master 장애 시 투표에 참여할 수 있게끔 구성이 가능하다. (장비가 부족하거나, 굳이 장비를 3대까지 세팅할 필요가 없는 경우에 유용)


Arbiter 노드는 위에 config 변수에 노드에 대한 정보를 넣을 때, arbiterOnly라는 element를 추가하여 true로 설정해주면 가능하다! ("arbiterOnly" : true)


아직 제대로 운영을 해본적은 없어서, 나머지 정보는 운영 후 다른 포스팅에 추가하는걸로.. 


테스트만 해보고 작성한거라, 잘못된 내용이 있을 수 있으니, 테클은 언제든 환영!

반응형

'개발 > Database' 카테고리의 다른 글

[Mysql] 5.5 패키지 설치 (CentOS 6.5)  (0) 2016.06.10
[Mysql] phpMyAdmin 여러대의 Mysql 서버관리  (0) 2016.06.10
[Mysql] local-infile  (0) 2016.06.10
[Mysql] group_concat  (0) 2016.06.10
[MongoDB] Log Rotate  (0) 2016.06.10
,