Skip to content

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

즉, 원본 데이터는 master의 데이터베이스에 저장하고 하나 이상의 slaves를 만들어 각 slave의 데이터베이스에 master의 데이터를 복제하는 것입니다.

다음 그림은 클라이언트 어플리케이션과 Master-Slave 간 관계를 설명한 것입니다.

[그림 1.] 클라이언트 어플리케이션-master(Primary)-slave(Secondary) 간 데이터 관계.

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

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

Master 및 Slave 서버 구동하기

Master로 MongoDB 서버를 구동하려면 mongod 명령에 --master 옵션을 붙이면 됩니다. 우선 로컬에서 master와 slave 서버를 구동해 보겠습니다. 이를 위해서는 master와 slave의 서로 다른 포트번호를 지정해야 하며, 각각에 대한 데이터 디렉터리를 따로 만들어야 합니다.

Master와 slave에 대한 디렉터리 생성이 끝났으면 다음과 같이 입력하여 master 서버를 구동합니다:

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

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

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

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

만약 master 서버의 IP가 192.168.10.100이라면 다음과 같이 입력하여 리모트 slave 서버를 구동합니다:

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

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

  • 커맨드라인 툴

    $ mongod --dbpath [SLAVE_DATA_PATH]

  • MongoDB 쉘

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

단순히 master 데이터 디렉터리로 지정된 경우와 slave 데이터 디렉터리로 지정된 경우의 컬렉션 내용만 비교하면 될 것입니다.


유용한 옵션들

Master-Slave 복제를 위한 서버 구동과 관련하여 몇가지 유용한 옵션들에 대하여 살펴보겠습니다.

  • --only

    하나의 데이터베이스만 복제하도록 slave 노드에 지정합니다. 디폴트는 모든 데이터베이스를 복제하는 것입니다.

  • --slavedelay

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

  • --fastsync

    Master 노드의 스냅샷으로부터 slave를 구동합니다.

  • --autoresync

    만약 slave가 master의 동기화로부터 빠져나올 경우 자동으로 전체 재동기화를 수행합니다.

  • --oplogSize

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