- 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를 하게 된다.