MongoDB

MongoDB Replica-Set

macro 2011. 10. 13. 18:06
반응형

- Replica-Set

 

리플리카셋 설정이란, 마스터와 슬레이브들로 구성하는 것을 말한다.

여기서 아비터란 서버를 추가함으로써, 마스터와 슬레이브의 heartbeat를 체크하고, 마스터가 장애가 났을시 슬레이브들 중 하나를 마스터로 만든다.

 

따라서 마스터, 슬레이브들, 아비터 서버로 구성하는게 HA구성에 있어서 가장 실용적이라 생각한다.

 

마스터 : read, write를 수행함.

슬레이브들 : 마스터의 데이터를 복제하여 가지고 있음.

아비터 : 마스터와 슬레이브를 체크하고, 장애시 마스터 선출.

 

리플리카셋의 장점은 장애상황에 유연하게 대처할 수 있다는 것 뿐만 아니라,

read 의 load 를 분산시킬수 있다는 것 또한 장점이다.

 

즉, 디폴트는 마스터 만이 read, write를 수행하고, 슬레이브들은 데이터 복제하여 가지고만 있는데,

슬레이브들을 read 데이터를 처리할 수 있게 할 수 있다. (슬레이브들은 write 처리는 할수없다. write는 마스터만 가능)

 

그렇다면 다음과 같은 사항에 대해서 하나씩 구체적으로 말하겠다.

 

- 리플리카 셋 구성하기

 

* 서버 3대 - 마스터, 슬레이브, 아비터

* 아래 명령은 몽고DB가 설치된 디렉토리의 bin 디렉토리에서 실행함. (또는 몽고디비 설치된 디렉토리의 bin 디렉토리를 환경변수 Path 에 등록하여도 됨)

 

1. 각 서버에 몽고디비를 설치한 후, user 라는 리플리카셋을 만들 것이다. 즉, 리플리카셋의 이름을 원하는데로 정한다.

2. 단, 리플리카셋의 이름은, 추후 몽고디비의 쉘 접속하여 작업시 동일하게 사용됨을 잊지말길.

3. 모든 서버(마스터, 슬레이브, 아비터)에서 다음과 같이 몽고디비를 실행한다. 실행에 대해서는 이전 포스트 내용을 볼것.

mongod --rest --replSet user --port 27031 --logpath /home/imongo/mongo/logs/user_server.log --fork --dbpath /data/mongo/user

4.  이제 마스터로 사용할 서버(아무 서버나 상관없음)에서 mongo DB에 쉘로 접속한다.

5. 접속은 위에서 포트를 27031로 설정하였으니, ./mongo 마스터의IP:27031 명령을 실행한다.

6. 접속되면 > 프롬프트가 나타난다. 그러면 다음과 같이 입력하여 실제로 리플리카셋 설정을 해준다.

  > cfg = {_id:'user', members:[

     ... {_id:0, host:'마스터의IP:27031'},

     ... {_id:1, host:'슬레이브의IP:27031'},

     ... {_id:2, host:'아비터의IP:27031', arbiterOnly:true}]}

  > rs.initiate(cfg)

7. 위처럼 cfg를 설정하여 실제로 리플리카 셋 구성을 하고, rs.initiate함수를 실행하여 적용시킨다.

 

 

- 리플리카 셋 read 분산

 

슬레이브에서 read를 가능케 하여, read는 슬레이브에서 처리할 수 있게 해보자.

 

일단, 슬레이브 서버에 쉘로 접속하자. 디렉토리는 몽고디비의 bin디렉토리.

 

./mongo 슬레이브IP:27031

 

그러면 SLAVE> 라고 나올것이다.

여기서 데이터를 한번 find 해보자. 할수 없다고 나올것이다.

 

그러면 이제 >db.getMongo().setSlaveOk() 이 명령을 실행한다.

그리고 나서 데이터를 find 하면 데이터가 나올 것이다.

 

즉, 쉘에서는 위의 명령어를 사용하면 슬레이브에서도 데이터를 read 할수가 있다.

 

위는 쉘에서의 명령이지만, 실제로 우리는 PHP에서 자동으로 슬레이브에서 데이터를 읽을 수 있도록 하고싶을 것이다.

$m = new Mongo("mongodb://192.168.11.39:27031,192.168.11.36:27031", array("replicaSet" => "user"));
$m->setSlaveOkay(true);
  
$db = $m->user_info;
$collection = $db->user;

위와 같이, 리플리카 셋으로 접속이라는 것을 알리고,

슬레이브 read 가능토록 하면 된다. 위의 컬렉션을 가지고 find()를 수행하면 된다.

 

그럼 write는 어떻게 될까. 당연히 위의 컬렉션을 가지고 insert()함수를 수행하면 write된다. 단 위의 슬레이브ok라는 설정을 해 줬더라도, 실제로는 마스터에 접속하여 insert를 하게 된다.

반응형