티스토리 뷰

MongoDB Installation Guide.

일단 설치하기전에 간단히 MongoDB에 대해 소개를 해보자 합니다.

MongoDB는 NoSQL의 한 종류이며 NoSQL 기본적으로 distributed processing ( sharding ) 및 Replication 을 지원합니다.

당연히 MongoDB도 NoSQL이기 때문에 Sharding과 Replication을 지원합니다.

일단 설치에 앞서 서버 구성에대하여 설명하도록 하겠습니다.

 

[그림 1]   서버 구성

서버 두대를 이용하여 Sharding & Replication Set을 셋팅합니다.

Server architecture는 아래와 같습니다.

 

[그림 2] 서버 Architecture

 

MongoDB 설치 환경

Server1

OS : Ubuntu11_10 x64 ( x2 )

CPU : Intel(R) Pentium(R) Dual  CPU  T2410  @ 2.00GHz 

Memory : 2GB

MongoDB : mongodb-linux-i686-static-2.0.4.tgz

Server2 ( VM OS )

OS : Ubuntu11_10 x64 ( x2 )

CPU : Intel(R) Core(TM) i5-2500 CPU @ 3.30GHz  ( X2 ) 

Memory : 2GB

MongoDB : mongodb-linux-i686-static-2.0.4.tgz


 Download URL

http://www.mongodb.org/downloads

Installation Guide

http://www.mongodb.org/display/DOCS/Quickstart+Unix

 

1. MongoDB 설치

ubuntu에 MongoDB 서버와 client를 설치한다.

Step1. apt-get 을 이용한 패키지 설치

apt-get을 이용하여 DB를 설치합니다. ( Server1, Server2 )

$ sudo apt-get install mongodb

 

2.ReplSet 을 위한 셋팅

ReplSet이란 MongoDB의 복제셋을 생성하는 기능으로 Master장비가 죽었을경우 생성된 복제셋이 존재하여 복구하기 때문에 시스템의 가용성을 높일 수 있습니다.

Step1. DB 저장 디렉토리 생성

DB데이터 저장공간과 replication & log 저장 공간을 생성합니다. ( Server1, Server2 )

$ sudo mkdir -p /data/db

$ sudo mkdir /data/db/first 

$ sudo mkdir /data/db/log

 

Step2. Replication Daemon 실행

ReplSet (복제셋) 생성을 위한 데몬을 실행합니다. ( Server1, Server2 )

 $ mongod --dbpath /data/db/first --port 10001 --replSet first > /data/db/log/first.log &

 

Step3. ReplSet 설정

MongoDB에 접속하여 ReplSet설정을 합니다. ( Server1 )

 $ mongo localhost:10001/admin

> db.runCommand({"replSetInitiate" : {"_id" : "first", "members" : [{"_id" : 1, "host" : "server1:10001"}, {"_id" : 2, "host" : "server2:10001"}]}})
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}

 

Step4. TEST 데이터 삽입

MongoDB에 접속한 상태에서 아래의 명령을 실행합니다. ( Server1 )

 > use test

 switched to db test

first:PRIMARY> people = ["Marc", "Bill", "George", "Eliot", "Matt", "Trey", "Tracy", "Greg", "Steve", "Kristina", "Katie", "Jeff"];

first:PRIMARY> for(var i=0; i<1000000; i++){
name = people[Math.floor(Math.random()*people.length)];
user_id = i;
boolean = [true, false][Math.floor(Math.random()*2)];
added_at = new Date();
number = Math.floor(Math.random()*10001);
db.test_collection.save({"name":name, "user_id":user_id, "boolean": boolean, "added_at":added_at, "number":number });
}

 

3.Config Server 셋팅

Config Server는 각 서버에 대한 샤딩정보등을 담고있는 서버이다. Config Server는 1대 아니면 3대를 추천합니다. (몽고디비에서 추천)

Step1. DB 저장 디렉토리 생성

config 데이터를 저장할 디렉토리를 생성합니다.  ( Server1 )

mkdir /data/db/config1

mkdir /data/db/config2

mkdir /data/db/config3

 

Step2. Config Server Daemon 실행

Config Server  Daemon을 실행합니다. ( Server1 )

$ mongod --configsvr --dbpath /data/db/config1 --port 20001 > /data/db/log/config1.log &

$ mongod --configsvr --dbpath /data/db/config2 --port 20002 > /data/db/log/config2.log &

$ mongod --configsvr --dbpath /data/db/config3 --port 20003 > /data/db/log/config3.log & 

 

4. Sharding 설정

Sharding은 NoSQL을 사용하는 궁극의 목적이라 볼 수 있습니다. Sharding설정을 통하여 데이터 Chunk사이즈를 조절하여 데이터를 테이블단위로 나누어 분산저장을 할 수 있습니다.

Step1. MonogS 설정

Mongos를 이용하여 Sharding을 위한Routing 서버를 셋팅합니다.   chunkSize 1 (1M) 는 테스트에서만 추가하는 것으로 실제서비스에서는 이 옵션을 생략합니다. (기본 64M)     ( Server1 )

$ mongos --configdb server1:20001,server1:20002,server1:20003 -chunkSize 1 > /data/db/mongos.log &

 

Step2. Sharding 설정

이제 first ReplSet에 대한 샤딩을 설정합니다. mongo server1/admon 으로 접속을 하게되면 자동으로 현재 살아있는 config server로 접속하게 됩니다.  ( Server1 )

$ mongo server1/admin

> db.runCommand( { addshard : "first/server1:10001,server2:10001"})

{ "shardAdded" : "first", "ok" : 1 }


5. Second ReplSet 설정

두번째 복제셋을 생성

Step1. mongod 실행

위에서 first ReplSet을 설정한 바와 같이 second ReplSet을 설정합니다. ( Server1, Server2 )

$ mkdir /data/db/second

$ mongod --dbpath /data/db/second --port 10002 --replSet second > /data/db/log/second.log &

 

Step2. ReplSet 설정

second 노드를 복제셋으로 묶어줍니다. ( Server1 )

$ mongo server1:10002/admin

> db.runCommand({"replSetInitiate" : {"_id" : "second", "members" : [{"_id" : 1, "host" : "server1:10002"},{"_id":2,"host":"server2:10002"}]}})
{
        "info" : "Config now saved locally.  Should come online in about a minute.",
        "ok" : 1
}

 

6. Sharding 설정 (Second Node) 및 지정

first와 마찬가지로 second node도 Sharding을 추가합니다.

Step1. Sharding 추가

mongos (config)로 로그인하여 Sharding을 추가합니다. ( Server1, Server2  무관 )

$  mongo server1/admin

> use admin

switched to db admin

 > db.runCommand( { addshard : "second/server1:10002,server2:10002"})
{ "shardAdded" : "second", "ok" : 1 }

 

Step2. Test

Sharding이 제대로 설정되었는지 확인해봅니다. ( Sever1, Server2 무관 )

> db.runCommand({listshards:1})

{
        "shards" : [
                {
                        "_id" : "first",
                        "host" : "first/server1:10001,server2:10001"
                },
                {
                        "_id" : "second",
                        "host" : "second/server1:10002,server2:10002"
                }
        ],
        "ok" : 1
}

 

Step3. Sharding할 DB 지정

위 까지 Sharding에대한 설정을 하였다면 이제 직접적으로 Sharding 할 DB를 지정해 줌으로 실질적인 Sharding을 하게 됩니다. ( Sever1, Server2 무관 )

> db.runCommand( { enablesharding : "test" } )

{ "ok" : 1 }

 

Step4. Sharding Key 지정

샤딩 키를 바탕으로 샤드들이 정렬되며 분산되기 때문에 샤딩키를 적절히 정해주어야 합니다. (중요)  인덱스 개념이라고 보시면 됩니다. ( Sever1, Server2 무관 )

mongos> use test

switched to db test

mongos> db.test_collection.ensureIndex({number:1})

 

Step5. Index 지정

test 디비에 test_collection 이라는 컬렉션에서 number 라는 컬럼을 인덱스로 지정해 줍니다. ( Server1, Server2 무관 )

> use admin

switched to db admin

> db.runCommand( { shardcollection : "test.test_collection", key : {"number":1} })

{ "collectionsharded" : "test.test_collection", "ok" : 1 }

 

Step6. DB Status 확인

지금까지의 설정이 제대로 되었는지 확인합니다. ( Server1, Server2 무관 )

> db.status()

{
        "raw" : {
                "first/server1:10001,server2:10001" : {
                        "db" : "test",
                        "collections" : 3,
                        "objects" : 984347,
                        "avgObjSize" : 100.33353685234984,
                        "dataSize" : 98763016,
                        "storageSize" : 132950528,
                        "numExtents" : 16,
                        "indexes" : 2,
                        "indexSize" : 74948608,
                        "fileSize" : 520093696,
                        "ok" : 1
                },
                "second/server1:10002,server2:10002" : {
                        "db" : "test",
                        "collections" : 3,
                        "objects" : 15665,
                        "avgObjSize" : 100.32786466645388,
                        "dataSize" : 1571636,
                        "storageSize" : 2800128,
                        "numExtents" : 7,
                        "indexes" : 2,
                        "indexSize" : 1638400,
                        "fileSize" : 201326592,
                        "ok" : 1
                }
        },
        "objects" : 1000012,
        "avgObjSize" : 100.33344799862401,
        "dataSize" : 100334652,
        "storageSize" : 135750656,
        "numExtents" : 23,
        "indexes" : 4,
        "indexSize" : 76587008,
        "fileSize" : 721420288,
        "ok" : 1
}
 

 

Step7. Sharding Status 확인

현재 입력한 데이터가 제대로 분산이 되고있는지 확인합니다.

> db.printShardingStatus()
--- Sharding Status ---
  sharding version: { "_id" : 1, "version" : 3 }
  shards:
      { "_id" : "first", "host" : "first/server1:10001,server2:10001" }
      { "_id" : "second", "host" : "second/server1:10002,server2:10002" }
  databases:
        { "_id" : "admin", "partitioned" : false, "primary" : "config" }
        { "_id" : "test", "partitioned" : true, "primary" : "first" }
                test.test_collection chunks:
                                second  6
                                first   185
                        too many chunksn to print, use verbose if you want to force print

(빨간 표시의 수치가 현재 Sharding의 chunk 수를 나타냅니다.  시간이 지난후 확인해보시면 균등히 분산되어있는걸 확인 할 수 있습니다. )

 

이상 MongoDB Replication & Sharding 관련 테스트를 마치도록 하겠습니다.

참조 원문 : http://crazia.tistory.com/search/mongo

 

.by rocksea


'Developer' 카테고리의 다른 글

SSH Local Tunneling  (0) 2012.04.18
redmine1.3.2 mylyn-connector 설치  (0) 2012.04.17
Media WIKI 설치  (0) 2012.03.28
redmine  (0) 2012.03.26
Jboss Clustering  (0) 2012.03.19
댓글