12-18 14:29
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[MongoDB] Replication / Replica Sets Part 2. 본문

Data Science/MongoDB

[MongoDB] Replication / Replica Sets Part 2.

cinema4dr12 2014. 3. 29. 19:45

by Geol Choi | 

지난 글에서 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 인스턴스 실행

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

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


4. 노드 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 구성

5. Windows에서 mongo 쉘 실행하여 mongo 쉘로 이동한다.

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

$ mongo --port 27017


6. "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을 갖는다.


7. 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에 대한 것이다.


8. 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
}


데이터 동기화 확인하기

9. 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 노드에서 입력했던 도큐먼트의 내용과 정확히 일치하는 것을 확인할 수 있을 것이다.

Comments