지난 포스팅에서 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 및 노드 2에 대한 데이터 디렉터리를 생성합니다.
노드 1에 대해서는
node_1
, 노드 2에 대해서는node_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 인스턴스 실행
-
이제 Mac OS 환경으로 이동하여 노드 3에 대한 데이터 디렉터리를 생성합니다.
데이터 디렉터리 이름은
node_3
로 하였습니다. -
노드 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 구성
-
Windows에서 mongo 쉘 실행하여 mongo 쉘로 이동합니다.
PRIMARY 노드(노드 1)에 대한 mongod 인스턴스는 현재 Windows 상에서 구동되고 있습니다. 커맨드라인 툴을 하나 열고 다음과 같이 입력합니다:
$ mongo --port 27017
-
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을 갖습니다. -
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에 대한 것입니다. -
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 }
데이터 동기화 확인하기
-
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 노드에서 입력했던 도큐먼트의 내용과 정확히 일치하는 것을 확인할 수 있을 것입니다.