향상할 수 있도록 샤딩을 지원합니다.
물론, 같은 서버에 다른 포트로 올리는것도 방법이겠지만.. 그다지 좋지는 않겠죠..
테스트해보기 위한게 아니라면 말이죠..
가장 간단한 구조로 샤딩해보겠습니다.
1. 환경
1) 구성
mongos1 - config server1 - shard server1
- shard server2
2) 서버1
- 설치 서버 : mongos1, config server1, shard server1
- mongodb 설치 경로 : /app/mongodb
- log 경로 : /app/mongodb/log
- data 경로 : /data/config1, /data/shard1
- mongos1 port : 27777
- config server1 port : 30000
- shard server1 port : 28001
3) 서버2
- 설치 서버 : shard server2
- mongodb 설치 경로 : /app/mongodb
- log 경로 : /app/mongodb/log
- data 경로 : /data/shard2
- shard server2 port : 28002
2. 세팅
1) 각 서버의 ip 를 네임 설정합니다.
$ /etc/hosts
1.1.1.1 mongodb1
1.1.1.2 mongodb2
2) 서버1 configsvr1 실행/중지 쉘
$ cd /app/mongodb/bin
$ vi start_configsvr1.sh
/app/mongodb/bin/mongod --configsvr --port 30000 --fork --logpath /app/mongodb/log/configsvr1.log --dbpath /data/config1
$ chmod +x start_configsvr1.sh
$ vi stop_configsvr1.sh
ps -ef |grep -v grep |grep configsvr1.log |awk '{print $2}' |xargs kill -2
$ chmod +x stop_configsvr1.sh
3) 서버1 mongos 실행/중지 쉘
$ vi start_mongos1.sh
/app/mongodb/bin/mongos --port 27777 --fork --logpath /app/mongodb/log/mongos1.log --configdb mongodb1:30000
$ chmod +x start_mongos1.sh
$ vi stop_mongos1.sh
ps -ef |grep -v grep |grep mongos1.log |awk '{print $2}' |xargs kill -2
$ chmod +x stop_mongos1.sh
4) 서버1 shardsvr1 실행/중지 쉘
$ vi start_shardsvr1.sh
/app/mongodb/bin/mongod --shardsvr --port 28001 --fork --logpath /app/mongodb/log/shardsvr1.log --dbpath /data/shard1
$ chmod +x start_shardsvr1.sh
$ vi stop_shardsvr1.sh
ps -ef |grep -v grep |grep shardsvr1.log |awk '{print $2}' |xargs kill -2
$ chmod +x stop_shardsvr1.sh
5) 서버2 shardsvr2 실행/중지 쉘
$ vi start_shardsvr2.sh
/app/mongodb/bin/mongod --shardsvr --port 28002 --fork --logpath /app/mongodb/log/shardsvr2.log --dbpath /data/shard1
$ chmod +x start_shardsvr2.sh
$ vi stop_shardsvr2.sh
ps -ef |grep -v grep |grep shardsvr2.log |awk '{print $2}' |xargs kill -2
$ chmod +x stop_shardsvr2.sh
6) 모든 프로세스를 실행합니다. 물론, mongos 는 마지막에 실행합니다.
7) /app/mongodb/bin/mongo mongodb1:27777/admin 를 통해 mongos에 접속합니다.
8) 다음의 스크립트를 통해 shard 를 등록합니다.
> db.runCommand({addshard:"mongodb1:28001"})
> db.runCommand({addshard:"mongodb2:28002"})
> use config
> db.shards.find()
{ "_id" : "shard1", "host" : "mongodb1:28001" }
{ "_id" : "shard2", "host" : "mongodb2:28002" }
9) 이제 특정 데이터베이스의 컬렉션을 샤딩합니다.
> use admin
> db.runCommand({"enablesharding":"myDb"})
{ "ok" : 1 }
myDb 가 샤딩이 가능해졌습니다.
myDb 의 myBook 이라는 컬렉션을 샤딩하겠습니다.
> db.runCommand({"shardcollection":"myDb.myBook", "key":{"_id":1}})
여기서 key 는 _id 가 아닌 다른 인덱스로도 선택이 가능합니다.
샤딩상태는 다음의 명령어로 확인이 가능합니다.
> printShardingStatus()
실제 데이터가 분산되서 쌓이는걸 보려면 각 shard 의 데이터 스토어
여기의 경우 /data/shard1 이 되겠네요. 여기를 보면 되는데요.
기본적으로 chunk 사이즈가 32메가인가. 64메가인가 훔.. 머 여튼..
적어도 그 사이즈가 넘어야 다른 쪽으로 분산됩니다.
현재의 구조는 장애발생시 취약한 구조입니다.
실제로 서비스에는 mongos 는 멀티로, config server 는 3개로,
각 shard server 는 리플리카셋으로 묶어서 세팅을 합니다.
다음에는 그걸 문서화 해봐야겠네요.
댓글 없음:
댓글 쓰기