mongoDB

[mongodb] case study1

고요한하늘... 2011. 3. 22. 18:44




* case1 :

하나의 config 서버를 세개로 확장하고, mongod에서 3개의 config 서버를 바라보도록 수정할려고 했으나 계속해서 fail이 발생

config디렉토리를 전부 지우고 다시 디렉토리 생성후 이전에 실행중에 3개의 config server를 전부 재실행후

comma를 구분자로 해서 mongos를 재실행

 

* case2 :

> use admin
> db.runCommand( { enablesharding:"test"})
> use test
> db.keyword.ensureIndex({"keyword":1})
> use admin
> db.runCommand( { shardcollection : "test.keyword", key : { keyword : 1} } )

 

* case3

---------------------------------------------------- 서버 1 ---------------------------------------------------- ./mongod --shardsvr --dbpath /data2/mongo/db/b --port 10001

./mongod --configsvr --dbpath /data2/mongo/db/config1 --port 20000

 

---------------------------------------------------- 서버 2 ---------------------------------------------------- ./mongod --shardsvr --dbpath /data2/mongo/db/c --port 10002

./mongod --configsvr --dbpath /data2/mongo/db/config2 --port 20001

---------------------------------------------------- 서버 3 ----------------------------------------------------

./mongod --shardsvr --dbpath /data2/mongo/db/d --port 10003

./mongod --configsvr --dbpath /data2/mongo/db/config3 --port 20002

---------------------------------------------------- 서버 4 ---------------------------------------------------- ./ use admin

db.runCommand( { addshard:"서버1:10001"})

db.runCommand( { addshard:"서버2:10002"})

db.runCommand( { addshard:"서버3:10003"})

use test

db.query.save({"keyword":"test1"})

db.query.save({"keyword":"test2"})

db.query.save({"keyword":"test3"})

db.query.ensureIndex({"keyword":1})

use admin

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

db.runCommand( { shardcollection : "test.query", key : { keyword:1 } } )

./mongos --configdb 서버1:20000,서버2:20001,서버3:20002 --port 30000


* case4

sharding server : 3 ( no replica )

input data : 2.5G ( 4 fields )

number of rows  : 44,780,243

execute insert time :

                       real    110m15.953s
                       user    55m41.522s
                       sys     6m28.142s

 

* case5

 * 입력 데이터가 크고 메모리는 작을 경우 index를 여러 filed에 대해 실행시키면 아래와 같은 메세지가 나온다.

Thu Mar 31 06:28:36 [conn50] end connection 10.10.40.70:60418

Thu Mar 31 06:29:06 [mongosMain] connection accepted from 10.10.40.70:60561 #53
can't map file memory - mongo requires 64 bit build for larger datasets


* case6 

index를 다른 필드에도 걸려고 했더니 데이터가 커서 그런지 메모리 문제로 실행에 실패했다.

그래서 추가적으로 서버 2대를 추가했다.

기대했던 동작은 데이터를 추가된 서버에 분산되고 index 명령어를 3대가 아닌 5대에서 실행됐으면 했는데

데이터 분산은 안되고 여전이 실행은 3대에서만 된다.

( sharding key 설정 실수 )

 * case7

 대용량의 데이터를 입력하는 도중 sharding server 한대를 추가시켰더니 데이터가 자동으로 분산되어 저장된다.

db.runCommand( { addshard:"추가된 서버IP:10004"})

 

 * advanced query : http://www.mongodb.org/display/DOCS/Advanced+Queries

 

모니터링 페이지 :

mongos를 실행할때 30000포트로 실행했다고 하면

해당 서버 IP에 mongos포트에 1000을 더한 포트 번호로 접속이 가능하다.

http://IP:31000

            ※ 팁 : 페이지에 여러가지 링크들이 보이는데 이 링크들이 정상적으로 동작하기 위해서는 데몬을 실행할때 rest 옵션을 주어야 한다.



※ background에서 index를 실행 시키는 명령어( 리턴이 몇초 또는 몇분있다 되지만 블락상태일때보다  indexing 속도는 느리다. 
    indexing이 완료될때까지 index를 사용할수는 없다. ) db.things.ensureIndex({x:1}, {background:true });

※ 컬렉션을 원형 큐와 같이 일정한 크기로 설정해놓고 새로운 데이터가 들어오면 가장 오래된 데이터를 삭제해서 일정한 공간을 유지할수 있는 컬렉션 (Capped coll)
  db.createCollection("mycoll", {capped:true, size:100000})

※ 일반 컬렉션을 capped collection으로 변경하는 옵션 :db.runCommand( {createCollection:"mycoll", capped:true, size:100000} )

※ tailable=True 이 옵션을 검색시(find)에 사용하기 위해서는 컬렉션이 capped collection이어야 한다.


※ save insert 함수의 차이 : save() = insert() + update() , 값이 있을때는 update()함수로 없을때는 insert()함수로 동작


※ 이미 구축된 컬렉션에  필드를 추가하고자 할 경우 

    > db.test.save({"keyword":"test1"})

    > db.test.save({"keyword":"test2"})

    > db.test.save({"keyword":"test3"})

    > db.test.update({"keyword":"test3"} ,{$set : {"docid":"1111"}})

    > db.test.find()

    { "_id" : ObjectId("4ddcb3b860192bd85b1c23ff"), "keyword" : "test1" }

    { "_id" : ObjectId("4ddcb3ba60192bd85b1c2400"), "keyword" : "test2" }

    { "_id" : ObjectId("4ddcb3bb60192bd85b1c2401"), "docid" : "1111", "keyword" : "test3" }


※  데이터를 삭제하는 방법은 두가지가 있다. 한가지는 dropdatabase() 명령어를 사용하는 것이고, 다른 하나는 remove()를 호출하는 것이다. 두 함수의 차이는

     dropdatabase()는 속도는 빠르나 Index까지 모두 삭제가 되고, remove()는 index와 같은 메타 정보는 유지가 되면서 dropdatabase()에 비해 속도가 느리다.


 * sharding not enabled for db

 ** shard collection을 설정하지 않아서 발생하는 문제( db.runCommand({enablesharding:"test"}) )



※ capped collection과 shard collection을 동시에 설정할수는 없나보나. capped collection을 설정하고 shard key를 설정하니 "can't shard capped collection"라고 뜬다.

 "ns doesn't exist" 는 mapreduce함수를 실행할때 잘못된 컬렉션명을 사용했을때 발생한다. 해당 컬렉션이 존재하는지 확인( DB명이 아님 )

※ auto sharding은 일정크기 이상의 데이터가 입력됐을때  자동으로 데이터가 분산되는것을 의미한다. 그렇기 때문에 얼마 안되는 데이터를 입력했을때는 single server에 데이터가 저장된다. sharding 된 DB에서 db.printShardingStatus() 명령을 보냈을때 min, max 값이 나타나는데 1개만 나타난다는 것은 sharding 되지 않고 local에만 데이터가 쌓였음을 의미한다.

'mongoDB' 카테고리의 다른 글

mongodb test  (0) 2011.06.22
[mongodb mapreduce] time grouping  (0) 2011.06.01
[mongodb mapreduce] add integer value  (0) 2011.04.08
[mongodb mapreduce] string concatenate  (0) 2011.04.08
[mongodb install] how to use mongodb  (0) 2011.03.22