2012년 1월 3일 화요일

몽고db ( mongodb ) 2 - 샤딩 ( sharding )

mongodb 는 대용량의 데이터를 물리적으로 다른 서버에 분산하여 성능을
향상할 수 있도록 샤딩을 지원합니다.

물론, 같은 서버에 다른 포트로 올리는것도 방법이겠지만.. 그다지 좋지는 않겠죠..
테스트해보기 위한게 아니라면 말이죠..

가장 간단한 구조로 샤딩해보겠습니다.

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 는 리플리카셋으로 묶어서 세팅을 합니다.
다음에는 그걸 문서화 해봐야겠네요. 

  

댓글 없음:

댓글 쓰기