Skip to content

지난 포스팅에서 Replica Set을 구성하는 방법에 대해 자세하게 다뤘습니다. 지난 포스팅에서는 1대의 머쉰에서 localhost를 통해 Replica Set을 구성한 바 있습니다.

이번 포스팅에서는 여러 대의 머쉰에서 Replica Set을 구성하는 방법에 대해 알아보도록 하겠습니다.

진행은 튜토리얼 방식이며, 제시되는 OS 및 IP(IP 대신 DNS를 입력해도 무방함) 등은 예를 들어 설명하기 위함이며 각자 자신의 환경에 맞게 응용하기 바랍니다. 한 번 따라해 보면 쉽게 자신의 환경으로 설정할 수 있으리라 믿습니다.

이 예제에서는 총 2대의 머쉰을 사용하였으며, 각각 Windows와 Mac OS 환경이며, 설정되는 노드는 모두 3개(PRIMARY 1개, SECONDARY 2개)입니다.

이를 간단히 표로 정리하면 [표 1.]과 같습니다:

노드 번호 OS 데이터 디렉터리 노드 유형 IP 포트번호
노드 1 Windows node_1 PRIMARY 192.168.10.106 27017
노드 2 Windows node_2 SECONDARY 192.168.10.106 27018
노드 3 Mac OS node_3 SECONDARY 192.168.10.103 27019

[표 1.] Replica Set 구성 환경.

Replica Set 이름은 rs0이며, Windows 환경에서 설정되는 노드 1과 노드 2 Replica Set 구성부터 시작해 보겠습니다.


Windows에서 mongod 인스턴스 실행

  1. 노드 1 및 노드 2에 대한 데이터 디렉터리를 생성합니다.

    노드 1에 대해서는 node_1, 노드 2에 대해서는 node_2로 데이터 디렉터리 이름을 정하였습니다.

  2. 노드 1 및 노드 2에 대한 mongod 인스턴스를 실행합니다.

    Windows 커맨드라인 툴을 실행(Windows 키 + R > cmd)하여 노드 1과 노드 2에 대한 mongod 인스턴스를 실행합니다. 노드 1과 노드 2에 대해 각각 실행해야 하므로 커맨드라인 툴은 2개가 실행되어야 합니다.

    노드 1: $ mongod --port 27017 --dbpath [YOUR_DATA_PATH]\node_1 --replSet rs0 --smallfiles --oplogSize 128

    노드 2: $ mongod --port 27018 --dbpath [YOUR_DATA_PATH]\node_2 --replSet rs0 --smallfiles --oplogSize 128


Mac OS에서 mongod 인스턴스 실행

  1. 이제 Mac OS 환경으로 이동하여 노드 3에 대한 데이터 디렉터리를 생성합니다.

    데이터 디렉터리 이름은 node_3로 하였습니다.

  2. 노드 3에 대한 mongod 인스턴스를 실행합니다.

    Mac OS에서 Terminal(쉘)을 실행하여 mongod 인스턴스를 실행하고 다음과 같이 입력한다.

    노드 3: $ mongod --port 27019 --dbpath [YOUR_DATA_PATH]\node_3 --replSet rs0 --smallfiles --oplogSize 128

    사실 Windows의 노드 1과 노드 2와 IP가 다르기 때문에 포트번호가 겹쳐도 상관은 없으나, 혼동을 방지하기 위해 포트번호도 구분하였습니다.


Windows에서 Replica Set 구성

  1. Windows에서 mongo 쉘 실행하여 mongo 쉘로 이동합니다.

    PRIMARY 노드(노드 1)에 대한 mongod 인스턴스는 현재 Windows 상에서 구동되고 있습니다. 커맨드라인 툴을 하나 열고 다음과 같이 입력합니다:

    $ mongo --port 27017

  2. rsconf 변수에 Replica Set 환경설정 정보를 구성하고, Replica Set을 초기화합니다.

    5번에서 실행한 mongo 쉘에 다음과 입력하여 reconf 변수에 Replica Set 환경설정 정보를 저장합니다:

    (주의! IP는 반드시 자신의 머쉰에 해당하는 것으로 입력하여야 합니다. 192.168.10.106은 단지 하나의 예에 불과합니다.)

    > rsconf = {_id: "rs0", members: [{_id: 0, host: "192.168.10.106:27017"}]}
    {
            "_id" : "rs0",
            "members" : [
                    {
                            "_id" : 0,
                            "host" : "192.168.10.106:27017"
                    }
            ]
    }
    

    Replica Set을 초기화 합니다:

    > rs.initiate( rsconf )
    {
            "info" : "Config now saved locally.  Should come online in about a minute.",
            "ok" : 1
    }
    

    초기화에 성공하면 위와 같이 ok가 값 1을 갖습니다.

  3. SECONDARY 노드들을 Replica Set에 추가합니다.

    5번에서 실행된 mongo 쉘에 다음과 같이 입력하여 노드들을 추가합니다:

    (주의! IP 및 포트번호는 자신이 구성하고자 하는 환경에 맞추어 입력하도록 합니다.)

    ``` rs0:PRIMARY> rs.add("192.168.10.106:27018") { "ok" : 1 } rs0:PRIMARY> rs.add("192.168.10.103:27019") { "ok" : 1 } ````

    192.168.10.106:27018은 Windows 상에서 구동되고 있는 노드 2에 대한 것이며, 192.168.10.103:27019는 Mac OS 상에서 구동되고 있는 노드 3에 대한 것입니다.

  4. Replica Set 구성 상태를 확인합니다.

    mongo 쉘에서 다음을 입력하면 Replica Set 구성 상태를 확인할 수 있습니다:

    rs0:PRIMARY> rs.status()
    {
            "set" : "rs0",
            "date" : ISODate("2014-03-29T11:29:58Z"),
            "myState" : 1,
            "members" : [
                    {
                            "_id" : 0,
                            "name" : "192.168.10.106:27017",
                            "health" : 1,
                            "state" : 1,
                            "stateStr" : "PRIMARY",
                            "uptime" : 1737,
                            "optime" : Timestamp(1396092399, 1),
                            "optimeDate" : ISODate("2014-03-29T11:26:39Z"),
                            "self" : true
                    },
                    {
                            "_id" : 1,
                            "name" : "192.168.10.106:27018",
                            "health" : 1,
                            "state" : 2,
                            "stateStr" : "SECONDARY",
                            "uptime" : 226,
                            "optime" : Timestamp(1396092399, 1),
                            "optimeDate" : ISODate("2014-03-29T11:26:39Z"),
                            "lastHeartbeat" : ISODate("2014-03-29T11:29:58Z"),
                            "lastHeartbeatRecv" : ISODate("2014-03-29T11:29:58Z"),
                            "pingMs" : 0,
                            "syncingTo" : "192.168.10.106:27017"
                    },
                    {
                            "_id" : 2,
                            "name" : "192.168.10.103:27019",
                            "health" : 1,
                            "state" : 2,
                            "stateStr" : "SECONDARY",
                            "uptime" : 199,
                            "optime" : Timestamp(1396092399, 1),
                            "optimeDate" : ISODate("2014-03-29T11:26:39Z"),
                            "lastHeartbeat" : ISODate("2014-03-29T11:29:56Z"),
                            "lastHeartbeatRecv" : ISODate("2014-03-29T11:29:56Z"),
                            "pingMs" : 2,
                            "syncingTo" : "192.168.10.106:27017"
                    }
            ],
            "ok" : 1
    }
    

데이터 동기화 확인하기

  1. PRIMARY 노드에 데이터를 입력합니다.

    PRIMARY 노드(노드 1)에 데이터를 저장하고, SECONDARY 노드(노드2, 노드 3)에서 데이터가 동기화 되었는지 확인하는 절차입니다:

    rs0:PRIMARY> show dbs
    local   0.28125GB
    rs0:PRIMARY> use test
    switched to db test
    rs0:PRIMARY> db.tmp.insert({user: "gchoi", pwd: 1234})
    rs0:PRIMARY> db.tmp.find().pretty()
    {
            "_id" : ObjectId("5336b00001d94e4b144f7b46"),
            "user" : "gchoi",
            "pwd" : 1234
    }
    

    이제 Windows와 Mac OS에 구동 중인 모든 mongod 인스턴스와 mongo 쉘을 닫습니다.

    Mac OS에서 설정되었던 노드 3에 대해 데이터를 확인해 보도록 하겠습니다 (노드 2에 대해서도 동일하게 확인해 볼 수 있다).

    Mac OS에서 Terminal을 열고 다음과 같이 입력하여 mongod 인스턴스를 실행합니다:

    $ mongod --dbpath [YOUR_DATA_PATH]/node_3 --port 27019

    Terminal을 하나 더 열고 다음과 같이 입력하여 mongo 쉘을 실행합니다:

    $ mongo --port 27019

    현재 db의 목록을 확인해 보면:

    > show dbs
    local   0.28125GB
    test    0.0625GB
    

    과 같이 PRIMARY 노드에서 생성했던 test가 있는 것을 확인할 수 있으며, test로 이동하여:

    > use test
    switched to db test
    

    컬렉션 항목을 확인해 보면:

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

    PRIMARY 노드에서 생성했던 tmp 컬렉션이 있는 것을 확인할 수 있습니다. tmp 컬렉션의 내용을 확인해 보면:

    > db.tmp.find().pretty()
    {
            "_id" : ObjectId("5336b00001d94e4b144f7b46"),
            "user" : "gchoi",
            "pwd" : 1234
    }
    

    역시 PRIMARY 노드에서 입력했던 도큐먼트의 내용과 정확히 일치하는 것을 확인할 수 있을 것입니다.