[mongoDB] 주-보조 복제 역할 변경 Computer Tip

이제는 RDB가 아니라 NoSQL인 mongoDB를 이용하는 것이
자연스러운 일 처럼 되었습니다.

mongoDB를 이용하는 여러 가지 이유 중에 하나는
샤딩이나 replica Set 등을 이용한 분산 환경이 적합하다는 점을 들 수 있습니다.

그런데 이전에 MS-SQL 서버의 병합 복제환경으로 구성되어 있는 것을
mongoDB에서 유사하게 해 보려고 하였습니다.

ReplicaSet을 이용할 수도 있겠지만 주, 보조 방식의 복제를 해 보도록 하였습니다.

우선 A, B 서버가 있다고 가정합니다.


1) A가 주(마스터), B가 보조(슬레이브)로 동작을 시켜봅니다.


A에서 /etc/mongodb.conf 파일에

master = true

내용을 넣습니다.
(마지막 부분에 # 코멘트를 제거하면 됩니다)

또한 B에서 /etc/mongodb.conf 파일에

slave = true
source = mongo-master

라고 넣습니다.
이때 /etc/hosts에 mongo-master 이름으로 A의 ip 주소를 넣습니다.

A, B 모두 다음의 명령으로 mongodb를 재시작 합니다.

sudo stop mongodb
sudo start mongodb

A의 mongo 쉘에서

> db.isMaster()
{ "ismaster" : true, "maxBsonObjectSize" : 16777216, "ok" : 1 }

라고 마스터라고 보입니다.

B의 mongo 쉘에서는
> db.isMaster()
{ "ismaster" : false, "maxBsonObjectSize" : 16777216, "ok" : 1 }

라는 식으로 보입니다.
또한 

> db.printSlaveReplicationInfo()
source:   mongo-master
syncedTo: Fri Jan 09 2015 16:07:51 GMT+0900 (KST)
= 14 secs ago (0hrs)

라고 현재 복제 상태를 확인할 수 있습니다.

몽고 DB입장에서는 이런 복제 정보가
local db에 가지고 있습니다.

A 마스터 쉘에서 확인해 보면

> use local
switched to db local
> show collections
oplog.$main
slaves
system.indexes

위와 같이 마스터는 local 이름의 db에 slaves 컬렉션에 슬레이브 정보를 가지고 있고,
oplog.$main 에는 현재 작업되고 있는 db operation이 기술되고 이것이 슬레이브로 복제됩니다.

한편 B 슬레이브 쉘에서는

> use local
switched to db local
> show collections
me
sources
system.indexes

와 같이 local 이라는 동일한 db 이름을 가지지만 이번에는 어느 마스터 소스 (souces 컬렉션)를
가지고 복제할 정보를 가지고 있습니다.

주의할 점은 슬레이브는 Read Only 로서 추가 변경 삭제가 안되고 오직 마스터로부터
복제를 합니다.

테스트해 보았더니 A에 새로운 DB, 컬렉션에 다큐먼트를 저장하거나 수정할 때마다
B로 복제가 됨을 알 수 있었습니다.


2) B가 주(마스터), A가 보조(슬레이브)로 동작을 시켜봅니다.

B는 최신 동기화가 되어 있었고, 마스터 A가 죽었다고 가정해 봅니다.
이제는 B의 mongoDB가 슬레이브에서 마스터로 동작시켜야 합니다.


2.1) B의 mongoDB 멈춤
sudo stop mongodb


2.2) B의 local db 삭제
/etc/mongodb.conf 에 지정한 dbpath (예 /var/lib/mongodb)에 local.로 시작하는 파일 삭제

sudo rm /var/lib/mongodb/local.*


2.3) B의 /etc/mongodb.conf 설정 변경

slave = true
source = mongo-master
대신 

master = true
라고 지정합니다.


2.3) B의 mongoDB 시작
sudo start mongodb


2.4) A 시스템 복구

2.5) A의 mongoDB 멈춤
sudo stop mongodb


2.6) A의 local db 삭제
/etc/mongodb.conf 에 지정한 dbpath (예 /var/lib/mongodb)에 local.로 시작하는 파일 삭제

sudo rm /var/lib/mongodb/local.*


2.7) A의 /etc/mongodb.conf 설정 변경

master = true
대신 

slave = true
source = mongo-master
라고 지정합니다.

/etc/hosts 에 mongo-master 라는 호스트명으로 B의 ip를 지정합니다.


2.8) A의 mongoDB 시작
sudo start mongodb


이렇게 하면 서로의 역할이 변경되어 동작합니다.

local db를 삭제하는 이유는 처음 설명드린 것과 같이
해당 복제 정보를 담고 있기 때문입니다.

만약 다시 원복하려면 A, B만 바꾸어 다시 2의 과정을 반복하면 됩니다.


어느 분께는 도움이 되셨기를....

덧글

댓글 입력 영역

구글애드텍스트