몽고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
# --replSet 에 각 노드들을 묶을 수 있는 이름인 group1 이 들어갑니다.
2) 리플리카셋 초기화
각 노드들을 구동합니다.
ps -ef |grep mongod 로 프로세스가 정상적으로 떠있는지 확인하구요..
다음과 같이 한 서버에 접속합니다.
$ ./mongo localhost:40001
MongoDB shell version: 2.0.1
connecting to: localhost:40001/test
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
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
# 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
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 |