04-29 02:46
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[MongoDB] Replication / Master-Slave Replication 본문

Data Science/MongoDB

[MongoDB] Replication / Master-Slave Replication

cinema4dr12 2014. 3. 26. 22:05

by Geol Choi | 

데이터베이스의 관리자 역할 중 가장 중요한 것 중 하나는 아마도 데이터를 안전하게 지키는 것이다. 이를 위해 가장 기본적인 일은 원본 데이터를 실시간에 가깝게 끊임없이 복제 데이터를 만드는 것이며, 마스터-슬레이브 복제(Master-Slave Replication) 모델이 이러한 기능을 수행하는 것이다. 즉, 원본 데이터는 마스터의 데이터베이스에 저장하고 하나 이상의 슬레이브를 만들어 각 슬레이브의 데이터베이스에 마스터의 데이터를 복제하는 것이다.

다음 그림은 클라이언트 어플리케이션과 마스터-슬레이브 간 관계를 설명한 것이다.


[그림 1.] 클라이언트 어플리케이션-마스터(Primary)-슬레이브(Secondary) 간 데이터 관계.


마스터-슬레이브 복제 모델은 연결이 끊기거나 전원공급 중단 등에 의한 패일오버(Failover) 또는 데이터 통합을 위한 것이지만, 보다 다양한 용도로 사용될 수 있다. 이들에 대한 자세한 내용은 추후에 다루도록 하겠다.

[그림 2.] 패일오버에 따른 마스터 자동 선택. 마스터가 10초 이상 응답하지 않을 경우 MongoDB는 슬레이브 중 하나를 마스터로 자동으로 지정한다.


마스터 및 슬레이브 서버 구동하기

마스터로 MongoDB 서버를 구동하려면 mongod 명령에 --master 옵션을 붙이면 된다. 우선 로컬에서 마스터와 슬레이브로 서버를 구동해 보자. 이를 위해서는 마스터와 슬레이브의 서로 다른 포트번호를 지정해야 하며, 각각에 대한 데이터 디렉터리를 따로 만들어야 한다.

마스터와 슬레이브에 대한 디렉터리 생성이 끝났으면 다음과 같이 입력하여 마스터 서버를 구동한다:

$ mongod -dbpath [MASTER_DATA_PATH] -port 3000 --master

마스터의 포트번호는 3000번으로 지정하였다. 슬레이브 서버 구동도 마찬가지로 --slave 옵션을 붙이는 방법이지만 추가적으로 무엇을 마스터로 할 것인지에 대한 소스를 명시해야 한다:

$ mongod --dbpath [SLAVE_DATA_PATH] --port 3001 --slave --source localhost:3000

이제 로컬이 아닌 다른 머쉰에서 슬레이브를 하나 더 추가해보록 하자. 방식은 동일하며, 다만 localhost 대신 마스터의 IP를 입력하면 된다. 마스터의 IP를 확인하려면 마스터 서버가 구동되는 머쉰에서 Mac OS의 경우 "네트워크 유틸리티"를, Windows에서는 커맨드라인툴("cmd")에서 ipconfig를 입력한다.

만약 마스터 서버의 IP가 192.168.10.100이라면 다음과 같이 입력하여 리모트 슬레이브 서버를 구동한다:

$ mongod --dbpath [SLAVE_DATA_PATH] --port 3001 --slave --source 192.168.10.100:3000

그렇다면 마스터에서 슬레이브로 정말 데이터가 복제되었는지 궁금하지 않은가? 이를 확인하기 위해, 마스터 서버를 셧다운하고 --dbpath 옵션에 슬레이브 데이터 디렉터리를 지정한 후 db 내용을 살펴보도록 한다:

커맨드라인 툴

$ mongod --dbpath [SLAVE_DATA_PATH]

MongoDB 쉘

> db.getCollectionNames()
[ "notes", "system.indexes", "users" ]

단순히 마스터 데이터 디렉터리로 지정된 경우와 슬레이브 데이터 디렉터리로 지정된 경우의 컬렉션 내용만 비교하면 될 것이다.


유용한 옵션들

마스터-슬레이브 복제를 위한 서버 구동과 관련하여 몇가지 유용한 옵션들에 대하여 살펴보겠다.

--only

하나의 데이터베이스만 복제하도록 슬레이브 노드에 지정한다. 디폴트는 모든 데이터베이스를 복제하는 것이다.

--slavedelay

마스터 노드에서 연산 적용 시 초 단위로 딜레이 시간을 슬레이브 노드에 지정한다. 이것은 사용자가 실수로 중요한 데이터를 삭제하거나 안 좋은 데이터를 저장하는 것에 대비할 때 유용하게 쓰일 수 있는 옵션이다.

--fastsync

마스터 노드의 스냅샷으로부터 슬레이브를 구동한다. 

--autoresync

만약 슬레이브가 마스터의 동기화로부터 빠져나올 경우 자동으로 전체 재동기화를 수행한다.

--oplogSize

마스터의 oplog에 대한 메가바이트 단위의 사이즈를 지정한다. oplog에 대해서는 차후 설명하도록 하겠다.

Comments