블로그 이미지
BJcomm
bjcomm

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
05-22 07:02
몽고db ( mongodb ) 3 - 3 노드 리플리카셋 ( 3 Node Replica Set ) - 레플리카셋,이중화,장애
3 노드 리플라카셋

1. 구성

 1) 세개의  mongodb 프로세스를 가집니다.

 2) 1개의 장애를 허용합니다.

      a,b,c 중 a 가 master 이고 b,c 가 슬레이브라면 b,c 두개 장애 시에는 물론 운영에 영향을 안받겠습니다만. master 인 a 가 먼저 죽으면 b,c 중 우선권이 높은 녀석이 master 가 됩니다.
      다시, 두번째 master 가 죽는다면 답이 없습니다.
      master 는 각 노드의 투표를 통해 과반수가 넘는 표를 받은 우선순위 높은 노드로 선출이 됩니다. 즉, 3 개의 리플리카셋 구성에서는 3 개중 하나가 장애가 발생하여 2개가 남더라도 총 2/3 이라는 과반수가 넘는 표결로 남은 2 개중에서 새로운 master 가 선출될 수 있겠지만, 남은 두개중에서 장애가 발생한다면 1/2  이므로 누가 될지 선출할 수가 없습니다.

    아 헷갈려 ㅋㅋ

 3) 데이터는 세개의 저장소를 가지며 동기화 됩니다.

      테스트로 하므로 제 맥 하나에 세개를 띄울 것이지만.. 운영상에서는 동일한 서버에 이런 구성을 가진다면 io 경합으로 성능이 현저하게 떨어지겠죠.


2. 설치 환경

 1) mac os
 2) mongodb : /app/mongodb
 3) log : /app/mongodb/log
 4) data : /app/mongodb/data1, data2, data3 ( 폴더를 생성해 놓습니다. 권한도 체크 )
 5) port : 40001,40002,40003
 6) replica-set group name : group1 ( group 이라는 말이 이해가 쉬워서 그냥 이렇게 적습니다. )


3. 설치

 1) 구동/중지 스크립트 작성

   # data1
   # start_data1.sh
   /app/mongodb/bin/mongod --replSet group1 --port 40001 --fork --logpath /app/mongodb/log/data1.log --dbpath /app/mongodb/data/data1

   # stop_data1.sh
   ps -ef |grep -v grep |grep data1.log |awk '{print $2}' |xargs kill -2

   # data2
   # start_data2.sh
   /app/mongodb/bin/mongod --replSet group1 --port 40002 --fork --logpath /app/mongodb/log/data2.log --dbpath /app/mongodb/data/data2

   # stop_data2.sh
   ps -ef |grep -v grep |grep data2.log |awk '{print $2}' |xargs kill -2

   # data3
   # start_data3.sh
   /app/mongodb/bin/mongod --replSet group1 --port 40003 --fork --logpath /app/mongodb/log/data3.log --dbpath /app/mongodb/data/data3

   # stop_data2.sh
   ps -ef |grep -v grep |grep data3.log |awk '{print $2}' |xargs kill -2

   # --replSet 에 각 노드들을 묶을 수 있는 이름인 group1 이 들어갑니다.



 2) 리플리카셋 초기화

   각 노드들을 구동합니다.
   ps -ef |grep mongod 로 프로세스가 정상적으로 떠있는지 확인하구요..

   다음과 같이 한 서버에 접속합니다.

   $ ./mongo localhost:40001
   MongoDB shell version: 2.0.1
   connecting to: localhost:40001/test
   
   > config = {_id: 'group1', members: [
            {_id: 0, host: 'localhost:40001'},
            {_id: 1, host: 'localhost:40002'},
                {_id: 2, host: 'localhost:40003'}]
            }

{
"_id" : "group1",
"members" : [
{
"_id" : 0,
"host" : "localhost:40001"
},
{
"_id" : 1,
"host" : "localhost:40002"
},
{
"_id" : 2,
"host" : "localhost:40002"
}
]
}

   > rs.initiate(config);



{
"info" : "Config now saved locally.  Should come online in about a minute.",
"ok" : 1
}

  
  3) 확인

      일단, 기본적인 시간이 들어가므로. 몇분정도 뒤에 확인을 하도록 합니다.

$ ./mongo localhost:40001
MongoDB shell version: 2.0.1
connecting to: localhost:40001/test

      우선, 해당 서버가 PRIMARY 즉, master 로 설정된 것을 확인할 수 있습니다.

PRIMARY> rs.status()

{
"set" : "group1",
"date" : ISODate("2012-02-03T06:52:12Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "localhost:40001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"self" : true
},
{
"_id" : 1,
"name" : "localhost:40002",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 180,
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"lastHeartbeat" : ISODate("2012-02-03T06:52:10Z"),
"pingMs" : 0
},
{
"_id" : 2,
"name" : "localhost:40003",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 178,
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"lastHeartbeat" : ISODate("2012-02-03T06:52:10Z"),
"pingMs" : 0
}
],
"ok" : 1
}

     data2,3 가 SECONDARY 로 설정되어있는것을 확인할 수 있습니다.


 4) 장애확인

   현재 master 인 data1 을 stop_data1.sh 로 내립니다.

$ ./mongo localhost:40001

MongoDB shell version: 2.0.1
connecting to: localhost:40001/test
Fri Feb  3 15:54:16 Error: couldn't connect to server localhost:40001 shell/mongo.js:86
exception: connect failed

   물론, 접속이 안됩니다. data2로 접속을 합니다.

$ ./mongo localhost:40002
MongoDB shell version: 2.0.1
connecting to: localhost:40002/test
PRIMARY> rs.status()

{
"set" : "group1",
"date" : ISODate("2012-02-03T06:55:18Z"),
"myState" : 1,
"syncingTo" : "localhost:40001",
"members" : [
{
"_id" : 0,
"name" : "localhost:40001",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"lastHeartbeat" : ISODate("2012-02-03T06:54:08Z"),
"pingMs" : 0,
"errmsg" : "socket exception"
},
{
"_id" : 1,
"name" : "localhost:40002",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"self" : true
},
{
"_id" : 2,
"name" : "localhost:40003",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 364,
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"lastHeartbeat" : ISODate("2012-02-03T06:55:18Z"),
"pingMs" : 0
}
],
"ok" : 1
}

    위와 같이 data1 은 응답없는 상태, data2 는 새로운 master (PRIMARY)로 선출된 것을 확인할 수 있습니다.

    이제 data2 를 stop_data2.sh 를 통해 내립니다.
    남은 data3 로 접속을 합니다.

$ ./mongo localhost:40003
MongoDB shell version: 2.0.1
connecting to: localhost:40003/test
SECONDARY> rs.status()
{
"set" : "group1",
"date" : ISODate("2012-02-03T06:58:44Z"),
"myState" : 2,
"members" : [
{
"_id" : 0,
"name" : "localhost:40001",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"lastHeartbeat" : ISODate("2012-02-03T06:54:07Z"),
"pingMs" : 0,
"errmsg" : "socket exception"
},
{
"_id" : 1,
"name" : "localhost:40002",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"lastHeartbeat" : ISODate("2012-02-03T06:58:26Z"),
"pingMs" : 0,
"errmsg" : "socket exception"
},
{
"_id" : 2,
"name" : "localhost:40003",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"optime" : {
"t" : 1328251739000,
"i" : 1
},
"optimeDate" : ISODate("2012-02-03T06:48:59Z"),
"self" : true
}
],
"ok" : 1
}

    data1,data2 가 응답없는 상태입니다. 한대가 살아있지만 여전히 SECONDARY 로 남아있는것을 확인할 수 있습니다. 표수가 1개 밖에 없기 때문에 master 를 선출할 수 없기 때문입니다.

SECONDARY> show collections
Fri Feb  3 16:02:05 uncaught exception: error: { "$err" : "not master and slaveok=false", "code" : 13435 }

    정상동작하지 않는것을 확인할 수 있습니다.


 4) 자동 복구 

   다시 data1 을 구동합니다.
   그리고 data3 로 다시 접속을 합니다.

$ ./mongo localhost:40003
MongoDB shell version: 2.0.1
connecting to: localhost:40003/test
PRIMARY> rs.status()
....

   master 로 선출이 된것을 확인할 수 있습니다. data1 은  SECONDARY 로 설정이 되었을것입니다.

이것으로 3 Node ReplicaSet 의 기초적인 테스트를 완료합니다.

 

'리눅스 문서' 카테고리의 다른 글

centos에 mongodb 설치하기  (4) 2016.03.22
PHP7 MongoDB PHP Driver install  (4) 2016.03.16
리눅스에서 MongoDB(NoSQL) 설치하기  (4) 2016.02.16
Python 2.7.6 over source install  (4) 2016.02.11
MYSQL 5.7 INSTALL ( mysql 5.7.9 )  (4) 2016.02.01