mongodb에서 cluster를 만들려면 rs.initiate() 함수를 쓰라고 한다. 막상 mongo 커맨드를 실행하면 다음과 같이 설정이 있어야 하는지 알려준다.  


> rs.initiate()
{
    "info2" : "no configuration explicitly specified -- making one",
    "me" : "alpha.google.com:27017",
    "ok" : 1



아래 url을  참조해서 클러스터를 만든다.

https://docs.mongodb.org/master/tutorial/reconfigure-replica-set-with-unavailable-members/


아래와 같이 config 설정을 생성한 후, 초기화한다. 


> config = {
    _id : "replset",
     members : [
         {_id : 0, host : "1.1.1.1:27017"},
         {_id : 1, host : "1.1.1.2:27017"},
         {_id : 2, host : "1.1.1.3:27017"},
     ]
}

> rs.initiate(config)



만약 수정할 일이 있으면, 다음과 같이 진행한다.


> cfg = {
    _id : "replset",
     members : [
         {_id : 0, host : "1.1.1.1:27017"},
         {_id : 1, host : "1.1.1.2:27017"},
         {_id : 2, host : "1.1.1.4:27017"},
     ]
}


> rs.reconfig(cfg, {force : true})





정상적으로 레플리카 설정이 되었는지 확인하려면,  rs.conf() 또는 rs.status()를 통해 확인한다.



> rs.conf()
{
    "_id" : "replset",
    "version" : 89449,
    "members" : [
        {
            "_id" : 0,
            "host" : "1.1.1.1:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {

            },
            "slaveDelay" : 0,
            "votes" : 1
        },
        {
            "_id" : 1,
            "host" : "1.1.1.2:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {

            },
            "slaveDelay" : 0,
            "votes" : 1
        },
        {
            "_id" : 2,
            "host" : "1.1.1.3:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {

            },
            "slaveDelay" : 0,
            "votes" : 1
        }

    ],

..





> rs.status()
{
    "set" : "replset",
    "date" : ISODate("2015-09-22T07:16:41.678Z"),
    "myState" : 1,
    "members" : [
        {
            "_id" : 0,
            "name" : "1.1.1.1:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 1961,
            "optime" : Timestamp(1442904540, 1),
            "optimeDate" : ISODate("2015-09-22T06:49:00Z"),
            "electionTime" : Timestamp(1442904540, 2),
            "electionDate" : ISODate("2015-09-22T06:49:00Z"),
            "configVersion" : 89449,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "1.1.1.2:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 1338,
            "optime" : Timestamp(1442904540, 1),
            "optimeDate" : ISODate("2015-09-22T06:49:00Z"),
            "lastHeartbeat" : ISODate("2015-09-22T07:16:39.850Z"),
            "lastHeartbeatRecv" : ISODate("2015-09-22T07:16:39.849Z"),
            "pingMs" : 0,
            "configVersion" : 89449
        },
        {
            "_id" : 2,
            "name" : "1.1.1.3:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 1338,
            "optime" : Timestamp(1442904540, 1),
            "optimeDate" : ISODate("2015-09-22T06:49:00Z"),
            "lastHeartbeat" : ISODate("2015-09-22T07:16:39.850Z"),
            "lastHeartbeatRecv" : ISODate("2015-09-22T07:16:39.852Z"),
            "pingMs" : 0,
            "configVersion" : 89449
        }
    ],
    "ok" : 1

}



'mongodb' 카테고리의 다른 글

[mongodb] 레플리카 구성 요소  (0) 2015.11.02
[mongodb] master 노드 변경하기  (0) 2015.10.30
[mongodb] explain  (0) 2015.10.12
[mongodb] collection 개수 구하기  (0) 2015.10.12
[mongodb] 모니터링하기  (0) 2015.10.12
Posted by '김용환'
,

[mongodb] explain

mongodb 2015. 10. 12. 20:34


mongodb 는 explain을 제공한다.


3.0 부터 $explain은 deprecated되었고, db.collection.explain(http://docs.mongodb.org/manual/reference/method/db.collection.explain/#db.collection.explain) 또는 cursor.plain(http://docs.mongodb.org/manual/reference/method/cursor.explain/#cursor.explain)을 사용해야 한다. (3.0부터 추가)





db.collection.explain()은 디폴트로 verbose하게 정보를 전달하며, 사용법은 쉽다. 


db.collection.explain().명령어()


예)

db.collection.explain().find()

db.collection.explain().find({})

db.collection.explain().count()




특정 결과는 다음과 같다. 최적화 관련 내용인 queryPlanner와 server 정보를 보여준다.


replset:PRIMARY> db.times.explain().find({'sid':1})

{

"queryPlanner" : {

"plannerVersion" : 1,

"namespace" : "google.times",

"indexFilterSet" : false,

"parsedQuery" : {

"sid" : {

"$eq" : 1

}

},

"winningPlan" : {

"stage" : "FETCH",

"inputStage" : {

"stage" : "IXSCAN",

"keyPattern" : {

"profileId" : 1

},

"indexName" : "sid_1",

"isMultiKey" : false,

"direction" : "forward",

"indexBounds" : {

"sid" : [

"[1.0, 1.0]"

]

}

}

},

"rejectedPlans" : [ ]

},

"serverInfo" : {

"host" : "google056",

"port" : 27017,

"version" : "3.0.6",

"gitVersion" : "1234"

},

"ok" : 1

}

'mongodb' 카테고리의 다른 글

[mongodb] master 노드 변경하기  (0) 2015.10.30
[mongodb] replica set 만들기  (0) 2015.10.26
[mongodb] collection 개수 구하기  (0) 2015.10.12
[mongodb] 모니터링하기  (0) 2015.10.12
[mongodb] 3.0부터 ensureIndex는 deprecated됨  (0) 2015.10.12
Posted by '김용환'
,




mongodb의 collection을 구하려면 다음과 같이 3가지 방식으로 collection 개수를 구할 수 있다.


replset:PRIMARY> db.realtimes.count()

93873

replset:PRIMARY> db.realtimes.find().count()

93927

replset:PRIMARY> db.realtimes.find({}).count()

93995




'mongodb' 카테고리의 다른 글

[mongodb] replica set 만들기  (0) 2015.10.26
[mongodb] explain  (0) 2015.10.12
[mongodb] 모니터링하기  (0) 2015.10.12
[mongodb] 3.0부터 ensureIndex는 deprecated됨  (0) 2015.10.12
[mongodb] insert와 save의 차이점  (0) 2015.10.11
Posted by '김용환'
,



mongodb모니터링하기



1. mongotop 


read/write/total i/o 정보를 보여준다.

http://docs.mongodb.org/manual/reference/program/mongotop/#bin.mongotop



 특정 콜렉션의 성능이 떨어지는 것을 눈으로 확인할 수 있다. 

$ mongotop


                     ns                  total     read    write    2015-10-12T19:31:39+09:00

       abc.times               528ms    222ms    306ms

      abc.vips                     8ms      8ms      0ms

        local.oplog.rs          2ms      2ms      0ms



특정 콜렉션이 느려져서 색인이 안되었있는 것을 확인했고 색인을 추가했다. 


> db.realtimes.createIndex( { 'profileId': 1 }, { background: true } )


백그라운드로 색인 작업하도록 했고, 10초안으로 색인이 완료되었고, 5ms이하로 read/write io가 떨어졌다.



30초에 한 번씩 출력하고 싶다면 매개변수를 30을 추가한다. 누적으로 보여주기 때문에, 유용하다.


$ mongotop 30




어느 db의 lock의 상황이 안 좋은지를 확인할 수 있다. 

$  mongotop --locks

2015-10-12T20:03:16.773+0900 connected to: 127.0.0.1


        db    total    read    write    2015-10-12T20:03:17+09:00

Collection      0ms     0ms      0ms

  Database      0ms     0ms      0ms

    Global      0ms     0ms      0ms

  Metadata      0ms     0ms      0ms

     oplog      0ms     0ms      0ms






2. mongostat


1초에 한번씩 mongod, mongos 성능을 측정한다.

http://docs.mongodb.org/manual/reference/program/mongostat/



$ mongostat

insert query update delete getmore command % dirty % used flushes vsize    res qr|qw ar|aw netIn netOut conn     set repl     time

     1    25     15     *0      56    19|0     0.5    3.8       0  1.1G 383.0M   0|0   1|1   19k    49k   44 replset  PRI 19:30:29

    *0    27     14     *0      63    32|0     0.5    3.8       0  1.1G 383.0M   0|0   1|1   21k    55k   44 replset  PRI 19:30:30

    *0    27     14     *0      63    25|0     0.5    3.8       0  1.1G 383.0M   0|0   1|0   21k    54k   44 replset  PRI 19:30:31



30 초에 한번씩 mongo stat 정보를 보고 싶다면, 다음을 실행한다.


$ mongostat 30



sar 명령어와 비슷하게 주기와 개수를 넣을 수 있다. 1초 동안 체크하고 20번 출력 후 종료하고 싶다면 다음을 실행한다.


$ mongostat --rowcount 20 1

$ mongostat -n 20 1


'mongodb' 카테고리의 다른 글

[mongodb] explain  (0) 2015.10.12
[mongodb] collection 개수 구하기  (0) 2015.10.12
[mongodb] 3.0부터 ensureIndex는 deprecated됨  (0) 2015.10.12
[mongodb] insert와 save의 차이점  (0) 2015.10.11
[mongodb] 검색하기- find(), findOne()  (0) 2015.10.11
Posted by '김용환'
,


mongodb의 db.collection.ensureIndex()는 특정 collection의 특정 필드를 색인할 수 있었다.


> db.user.name.ensureIndex( {KEY:1} )
{
    "createdCollectionAutomatically" : true,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1

}



3.0.0 부터 db.collection.ensureIndex는 deprecated되었고, db.collection.createIndex로 쓰도록 권고하고 있다.


Deprecated since version 3.0.0: db.collection.ensureIndex() is now an alias fordb.collection.createIndex().

http://docs.mongodb.org/manual/reference/method/db.collection.ensureIndex/




3.0.0 부터는 db.collection.createIndex()를 사용한다. 관련 옵션은 기존의 ensureIndex와 동일하지만 dropDups는 제외되었다. 


http://docs.mongodb.org/manual/reference/method/db.collection.createIndex/#ensureindex-options



중요한 매개변수 중 주요 매개변수를 설명한다.


- background : 색인 생성시 너무 많은 부하를 발생하지 않도록 background로 실행하도록 한다.

- unique : 중복 금지

- expireAfterSeconds : TTL 설정시 유효한 값



이전 예시를 다음과 같이 표현할 수 있다.


> db.user.name.createIndex( {name:"text"} );

{

"createdCollectionAutomatically" : true,

"numIndexesBefore" : 1,

"numIndexesAfter" : 2,

"ok" : 1

}




'mongodb' 카테고리의 다른 글

[mongodb] collection 개수 구하기  (0) 2015.10.12
[mongodb] 모니터링하기  (0) 2015.10.12
[mongodb] insert와 save의 차이점  (0) 2015.10.11
[mongodb] 검색하기- find(), findOne()  (0) 2015.10.11
[mongodb] index (색인) 속성  (0) 2015.10.09
Posted by '김용환'
,


mongodb의 insert()는 id의 duplicate 체크를 진행하지만, save()는 동일 id값이 들어오면 update를 한다. 그리고 save() 함수 변경시 변경/추가 여부를 결과값으로 알려준다.



part에 staf오타를 쳐서 staff로 수정하는 예제이다. 


> db.user.insert({ "_id" : 4, "name" : "jackson", "part" : "staf", "title" : "lab" })

WriteResult({ "nInserted" : 1 })

> db.user.insert({ "_id" : 4, "name" : "jackson", "part" : "staff", "title" : "lab" })

WriteResult({

"nInserted" : 0,

"writeError" : {

"code" : 11000,

"errmsg" : "E11000 duplicate key error index: test.user.$_id_ dup key: { : 4.0 }"

}

})




> db.user.save({ "_id" : 5, "name" : "matt", "part" : "staf", "title" : "lab" })

WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 5 })

> db.user.save({ "_id" : 5, "name" : "matt", "part" : "staff", "title" : "lab" })

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })




결과 확인 


> db.user.find()

{ "_id" : 4, "name" : "jackson", "part" : "staf", "title" : "lab" }

{ "_id" : 5, "name" : "matt", "part" : "staff", "title" : "lab" }

Posted by '김용환'
,


mongodb 검색하는 예제이다.


입력은 3건으로 한다.


> db.user.insert({_id:1,name:'samuel',part:'server',title:'developer'})

> db.user.insert({_id:2,name:'jason',part:'server',title:'developer'})

> db.user.insert({_id:3,name:'kaley',part:'client',title:'developer'})



전체 목록을 보려면 find()로 검색한다.


> db.user.find()

{ "_id" : 1, "name" : "samuel", "part" : "server", "title" : "developer" }

{ "_id" : 2, "name" : "jason", "part" : "server", "title" : "developer" }

{ "_id" : 3, "name" : "kaley", "part" : "client", "title" : "developer" }




{}을 넣으면 all document를 의미한다.


> db.user.find({})

{ "_id" : 1, "name" : "samuel", "part" : "server", "title" : "developer" }

{ "_id" : 2, "name" : "jason", "part" : "server", "title" : "developer" }

{ "_id" : 3, "name" : "kaley", "part" : "client", "title" : "developer" }




최근에 입력한 순서대록 목록을 보려면 find()에 sort() 를 이용한다.


> db.user.find().sort( { _id: -1 } )

{ "_id" : 3, "name" : "kaley", "part" : "client", "title" : "developer" }

{ "_id" : 2, "name" : "jason", "part" : "server", "title" : "developer" }

{ "_id" : 1, "name" : "samuel", "part" : "server", "title" : "developer" }



첫번째 요소만 보려면 findOne()을 실행한다.


> db.user.findOne()

{ "_id" : 1, "name" : "samuel", "part" : "server", "title" : "developer" }




find()에 조건을 사용할 수 있다. 


> db.user.find({_id:1})

{ "_id" : 1, "name" : "samuel", "part" : "server", "title" : "developer" }


> db.user.find({part:'server'})

{ "_id" : 1, "name" : "samuel", "part" : "server", "title" : "developer" }

{ "_id" : 2, "name" : "jason", "part" : "server", "title" : "developer" }




만약 조건에 동일한 필드로 검색하면, 가장 뒤에 정의한 필드로 조건 검색을 진행한다.


> db.user.find({part:'server', part:'client'})

{ "_id" : 3, "name" : "kaley", "part" : "client", "title" : "developer" }




범위를 지정해서 검색할 수 있다. 수치 뿐 아니라 문자열도 검색 가능하다.


> db.user.find({ name: { $gt:'k', $lt:'l' } })

{ "_id" : 3, "name" : "kaley", "part" : "client", "title" : "developer" }





서로 다른 필드를 이용하여 AND 이용하기


> db.user.find({part:'server', name:'samuel'})

{ "_id" : 1, "name" : "samuel", "part" : "server", "title" : "developer" }





서로 다른 필드를 이용하여 OR을 사용하려면 $or 구문을 사용한다.


> db.user.find({ $or:[ {part:'server', title:'developer'} ] })

{ "_id" : 1, "name" : "samuel", "part" : "server", "title" : "developer" }

{ "_id" : 2, "name" : "jason", "part" : "server", "title" : "developer" }




질의를 풀어쓰면 이렇다.

> db.user.find(

 { 

   $or: [ 

      {part:'server', title:'developer'} 

    ] 

 }

)




OR 문 사용시 필드명을 여러번 쓰면, 맨 뒤에것만 적용된다.


> db.user.find({ $or:[ {part:'server', part:'client'} ] })

{ "_id" : 3, "name" : "kaley", "part" : "client", "title" : "developer" }




AND와 OR를 같이 쓸 수 있다. 

> db.user.find({ name:'samuel', $or:[ {part:'server', title:'developer'} ] })

{ "_id" : 1, "name" : "samuel", "part" : "server", "title" : "developer" }



find(), findOne() 함수는 projection이라는 매개변수를 더 받을 수 있다.

함수원형을 보면 다음과 같다.


db.collection.findOne(queryprojection)

db.collection.find(queryprojection)




특정 범위의 값을 검색하고 나서 특정 필드(name)을 제외한 나머지(id, part, title)은 모주 제외하고 싶다면 사용할 수 있다.


> db.user.find({ name: { $gt:'k', $lt:'l' } }, {_id:0, part:0, title:0})

{ "name" : "kaley" }




다중 결과가 나오더라도 하나의 결과만 보고 싶다면, limit()함수를 사용한다.


> db.user.find({ name: { $gt:'a', $lt:'z' } }, {_id:0, part:0, title:0})

{ "name" : "samuel" }

{ "name" : "jason" }

{ "name" : "kaley" }

> db.user.find({ name: { $gt:'a', $lt:'z' } }, {_id:0, part:0, title:0}).limit(1)

{ "name" : "samuel" }




limit 결과에서 여러 값을 skip해서 다른 정보를 더 볼 수 있다. 


> db.user.find({ name: { $gt:'a', $lt:'z' } }, {_id:0, part:0, title:0}).limit(1).skip(1)

{ "name" : "jason" }

> db.user.find({ name: { $gt:'a', $lt:'z' } }, {_id:0, part:0, title:0}).limit(1).skip(2)

{ "name" : "kaley" }

> db.user.find({ name: { $gt:'a', $lt:'z' } }, {_id:0, part:0, title:0}).limit(1).skip(3)







Posted by '김용환'
,

mongodb 3.0 기준으로, 색인 속성을 살펴보았다.


  • TTL Index : 2가지 방법
    • 콜렉션에 ttl을 주는 방법
      • db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )
    • 콜렌션 대신 다큐먼트에 ttl을 주는 방법
      • db.log_events.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } )
  • Unique Index
    • 색인 키가 중복된 것은 insert되지 않는다. 색인 키가 없으면 에러 발생한다.
      • db. log_events.createIndex( { "locationId": 1 }, { unique: true } )
      • uniqne의 기본값은 false이다.
  • Sparse Index
    • unique index의 특징 중, 색인 키가 없으면 에러 발생하는 부분을 회피한다. 즉, 색인 키가 없어도 에러를 발생하지 않는다. 대신 색인을 타는 sort시, 해당 색인 값이 null이면 제외한다. find()하면 결과가 나온다.
      • db. log_events.createIndex( { "locationId": 1 }, { sparse: true } )




Posted by '김용환'
,


mongodb 3.0 기준으로 색인 타입(index type)이 무엇이 있는지 살펴보았다.


  • 한 필드 색인 (Single Field Index)
    • _id 라는 주요 식별자로 색인
      { "_id" : ObjectId(...),
        "name" : "Alice",
        "age" : 27
      }
  • 복합 색인 (Compound Index)
    • DB에서의 _id 외 여러 필드로 색인하는 형태, 여러 개의 키로 색인

      {
       "_id": ObjectId(...),
       "item": "Banana",
       "category": ["food", "produce", "grocery"],
       "location": "4th Street Store",
       "stock": 4,
       "type": "cases",
       "arrival": Date(...)
      }
  • db.products.createIndex( { "item": 1, "stock": 1 } )
  • 멀티키 색인(Multikey Index)
    • 배열에 색인을 사용하도록 함. 스칼라(integer, string) 타입 또는 내장 타입 사용 가능
      db.coll.createIndex( { <field>: < 1 or -1 > } )
  • 장소 색인 (Geospatial Indexes and Queries)
    • 여러 장소 타입(flat, 2dsphere 등등)을 저장할 수 있고, 검색 가능

      db.places.insert( { loc : { type: "Point", coordinates: [ -73.97, 40.77 ] }, name: "Central Park", category : "Parks" } )

      db.places.createIndex( { loc : "2dsphere" } )
  • 본문 색인 (Text Indexes)
    • 본문 검색을 위해 사용한다.

      db.reviews.createIndex( { comments: "text" } )

      db.collection.createIndex( { "$**": "text" } )
  • 해시 색인 (Hashed Index)
    • 해시 색인을 생성한다.

      db.active.createIndex( { a: "hashed" } )



출처 : 

http://docs.mongodb.org/manual/core/index-types/

Posted by '김용환'
,



mongodb에서 특정 collection의 다큐먼트를 삭제하려면 다음 명령어를 사용한다.


 db.location.remove( {_id:"1" })




sql의 truncate()와 같이 모든 다큐먼트를 삭제하려고 db.location.remove() 를 사용하면 에러가 난다.

빈 json을 쓴다.  db.location.remove({}) 을 써야 한다.



replset:PRIMARY> db.location.remove()

2015-10-02T14:24:31.941+0900 E QUERY    Error: remove needs a query

    at Error (<anonymous>)

    at DBCollection._parseRemove (src/mongo/shell/collection.js:305:32)

    at DBCollection.remove (src/mongo/shell/collection.js:328:23)

    at (shell):1:17 at src/mongo/shell/collection.js:305

replset:PRIMARY> db.location.remove({})

WriteResult({ "nRemoved" : 7 })










Posted by '김용환'
,