mongodb의 레플리카( replica set)의 slave에서 질의를 실행하려면, 에러가 난다.


변경과 같은 위험한 요소를 막기 위함이다. 


특히 레플리카(replica set) 버전 업그레이드 후 제대로 데이터가 있는지 수동 테스트를 위해서 필요하다. 



 replset:SECONDARY> show collections

2015-12-30T19:45:18.149+0900 E QUERY    Error: listCollections failed: { "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }


replset:SECONDARY> db.customer.find()

Error: error: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 }





그래도 질의를 해보려면, rs.slaveOk() 를 실행하면 커맨드로 질의할 수 있다.


replset:SECONDARY> rs.slaveOk()

replset:SECONDARY> db.customer.find()

....



Posted by '김용환'
,



mongodb 3.0부터 wiredtiger 를 사용하면 압축 옵션을 자동으로 주어진다.  (아무 생각없이 옵션을 주지 않아도 snappy와 prefix가 적용되었다.


자세한 내용은 아래 블로그 글 참조.


https://www.mongodb.com/blog/post/new-compression-options-mongodb-30


In MongoDB 3.0, WiredTiger provides three compression options for collections:

  • No compression
  • Snappy (enabled by default) – very good compression, efficient use of resources
  • zlib (similar to gzip) – excellent compression, but more resource intensive

There are two compression options for indexes:

  • No compression
  • Prefix (enabled by default) – good compression, efficient use of resources


Posted by '김용환'
,

mongodb의 용량 및 상태을 확인하려면, db.stats() 를 호출한다.


replset:PRIMARY> use <db이름>

replset:PRIMARY> db.stats()

{

"db" : "storypicker",

"collections" : 16,

"objects" : 2706554,

"avgObjSize" : 394.5955794711652,

"dataSize" : 1067994244,

"storageSize" : 659419136,

"numExtents" : 0,

"indexes" : 37,

"indexSize" : 149549056,

"ok" : 1

}




storageSize는 실제 크기이다.

dataSize는 패딩(padding)값이 포함된 크기이다. 




참고로.. mongodb 2.6.11 mmapv1와 mongodb 3.2.0-r + wiredtiger간의 크기 비교 자료가 있다.



https://blog.nodebb.org/mongodb-3-0-wiredtiger-compression-results/


mongodb 2.6.11 + mmapv1

{
        "ns" : "0.objects",
        "count" : 2668342,
        "size" : 513690384,
        "avgObjSize" : 192,
        "storageSize" : 629637120,
        "totalIndexSize" : 357896224,
        "indexSizes" : {
                "_id_" : 86583840,
                "expireAt_1" : 45654784,
                "_key_1_score_-1" : 109084192,
                "_key_1_value_-1" : 116573408
        }
}

mongodb 3.2.0-rc + wiredtiger

{
        "ns" : "0.objects",
        "count" : 2668337,
        "size" : 345978824,
        "avgObjSize" : 129,
        "storageSize" : 109842432,
        "totalIndexSize" : 97681408,
        "indexSizes" : {
                "_id_" : 24162304,
                "expireAt_1" : 10874880,
                "_key_1_score_-1" : 22380544,
                "_key_1_value_-1" : 40263680
        }
}




참조

https://docs.mongodb.org/manual/reference/command/dbStats/



Posted by '김용환'
,

[mongodb] rocksdb의 통합

mongodb 2015. 11. 20. 02:17



mongodb 가 요즘 뜨고 있다. mongodb에 rocksdb를 포팅이 가능해지면서 가능성이 점점 좋아지고 있다.


rocksdb는 facebook에 만든 db로서 구글 leveldb를 기반으로 만들어졌으며 성능이 아주 좋다. 수많은 코어를 이용하여 flash의 iops 속도를 극대화하여 성능을 높인다. 



자세한 것은 아래 링크 참조한다.


http://www.bloter.net/archives/170457

https://scontent-icn1-1.xx.fbcdn.net/hphotos-xpa1/v/t1.0-9/1441593_10151976018697200_1580274673_n.png?oh=3f1e9f8df5b42f8c3cb41f15a7a195d0&oe=56F78A82



최근 facebook 개발자 Iqor Canadi 는 rocksdb를 scale out할 수 있는 포인트를 찾으려 했고, 

mysql과 mongodb에 포팅하는 노력을 하고 있다. 또는 flash보다 저렴한 디바이스 기반에서 빠른 속도가 나올 수 있도록 노력하고 있다.


Parse.com 에서 mongodb 3.0에 rocksdb를 붙여 integration했다. (계속 쓰고 있는지는 모르겠다.)


http://blog.parse.com/announcements/mongodb-rocksdb-parse/


To run mongod with the RocksDB storage engine, just invoke mongod with the --storageEngine=rocksdb parameter.  You can add the RocksDB node to an existing replica set by using rs.Add() and performing an initial sync as you normally would.

Please treat this as work in progress. Both of those branches will keep changing as we keep improving the performance and stability.  We will release and package a “stable” version at some point in the future.




mysql과 rocksdb, mongodb와 rocksdb를 잘 integration을 진행하고 있다. 


http://rocksdb.org/blog/author/icanadi/

MyRocks

As you might know, we’re working hard to integrate RocksDB as a storage engine for MySQL. This project is pretty important for us because we’re heavy users of MySQL. We’re already getting pretty good performance results, but there is more work to be done. We need to focus on both performance and stability. The most high priority items on are list are:

  1. Reduce CPU costs of RocksDB as a MySQL storage engine
  2. Implement pessimistic concurrency control to support repeatable read isolation level in MyRocks
  3. Reduce P99 read latency, which is high mostly because of lingering tombstones
  4. Port ZSTD compression

MongoRocks

Another database that we’re working on is MongoDB. The project of integrating MongoDB with RocksDB storage engine is called MongoRocks. It’s already running in production at Parse [1] and we’re seeing surprisingly few issues. Our plans for the next half:

  1. Keep improving performance and stability, possibly reuse work done on MyRocks (workloads are pretty similar).
  2. Increase internal and external adoption.
  3. Support new MongoDB 3.2.




최근에는 오픈 소스 db 컨설팅 회사로 유명한 percona 컨퍼런스에서 관련 integration 결과에 대한 발표가 공유되었다. 지켜봐야겠지만, 자료만 봐서는 아주 훌륭하다.


https://www.percona.com/live/europe-amsterdam-2015/sessions/rocksdb-storage-engine-mysql-and-mongodb








'mongodb' 카테고리의 다른 글

[mongodb] wiredtiger 사용시 압축(compression) 자동 지원  (0) 2015.11.25
[mongodb] 용량 확인하기  (0) 2015.11.23
mongodb 3.2 특징  (0) 2015.11.10
[mongodb] 커서 (cursor)  (0) 2015.11.09
[mongodb] mongodb 검색하기  (0) 2015.11.09
Posted by '김용환'
,

mongodb 3.2 특징

mongodb 2015. 11. 10. 19:15

wiredtiger때문에 쓰고 있는 mongodb를 쓰고 있다. 




mongodb wiredtiger를 정식으로 탑재한 mongodb 3.2 를 공식 릴리즈할 예정이다.



현재 RC2니까 조만간 나올 듯 하다.

https://www.mongodb.com/blog/post/announcing-mongodb-3-2


white paper로 본 3.2 특징은 다음과 같다.


- Pluggable Engine 

 ㄴ 그동안 너무 느렸던 MMAPI 방식 대신 wiredtiger 기본 탑재(기존보다 80% 이상 부하 제거) 

 ㄴ 암호화(ssl)/inmemory storage engine 추가. 


- 검증 기능 


- 빠른 Failover 


- coordinator,consistency checking 기능이 따로 있는 형태를 replica set으로 자동 통합 (shard + config server 라는 일반적인 구조를 버림) 


- mongodb connector 지원 


- Aggregation 강화 

 ㄴ $lookup 지원(left outer join) -aggregation pipeline 

 ㄴ stream 처리 


- 검색 강화 


- 운영 툴 (Compass) 제공 


- APM api제공해서 APM 통합 가능 


- Partial Index 


- Ops Manager 강화 (사실 돈주고 사야하는 기능)

'mongodb' 카테고리의 다른 글

[mongodb] 용량 확인하기  (0) 2015.11.23
[mongodb] rocksdb의 통합  (0) 2015.11.20
[mongodb] 커서 (cursor)  (0) 2015.11.09
[mongodb] mongodb 검색하기  (0) 2015.11.09
[mongodb] _id, ObjectId  (0) 2015.11.09
Posted by '김용환'
,

[mongodb] 커서 (cursor)

mongodb 2015. 11. 9. 21:50

몽고DB에도 cursor가 있다. 커서를 순회하려면 다음과 같다. 


> var cursor = db.contents.find();

> cursor.forEach(function(x) { print(x.content); });



커서에 타임아웃이 10 분이다. 타임아웃이 없게 하려면 다음과 같이 option을 추가한다.


> var myCursor = db. contents.find().addOption(DBQuery.Option.noTimeout);


깔끔하게 처리할 수 있도록 batchSize() 와 limit()를 제공한다. 



https://docs.mongodb.org/manual/tutorial/iterate-a-cursor/

https://docs.mongodb.org/v3.0/reference/method/cursor.forEach/

https://docs.mongodb.org/manual/core/cursors/

'mongodb' 카테고리의 다른 글

[mongodb] rocksdb의 통합  (0) 2015.11.20
mongodb 3.2 특징  (0) 2015.11.10
[mongodb] mongodb 검색하기  (0) 2015.11.09
[mongodb] _id, ObjectId  (0) 2015.11.09
[mongodb] 레플리카 구성 요소  (0) 2015.11.02
Posted by '김용환'
,



findOne(), find()로 간단히 검색할 수 있다.


http://knight76.tistory.com/entry/mongodb-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0-find-findOne



Date 타입인 경우, $gte, $lte를 이용하여 시간 검색도 할 수 있다. 


> db.contents.find( {"created_at" : { "$gte":"2014-10-09T13:32:37Z", "$lte":"2014-10-09T13:32:38Z" } } )



미디어 타입이 image나 music인 것을 $in으로 검색할 수 있다.


> db.contents.find( {"media_type" : {"$in" : ["image", "music"]}})



그 반대로 image나 music이 아닌 것을 찾으려면 $nin을 사용한다.


> db.contents.find( {"media_type" : {"$nin" : ["image", "music"]}})



$ne는 not eqaul로서..

$or는 그 중의 하나를..

$not는 아닌 것을 검색할 때 쓰인다.


특정 타입($type) 또는 null 데이터를 검색할 수 있다.


> db.contents.find( { "comments" : null } )



mongodb 2.4부터는 where절을 쓸 수 있다. 부모에서만 쓸 수 있고 자식에서는 쓸 수 없다.

하나 이상의 키 값을 가지고 계산할 때 $where 절을 쓸 수 있다. 


> db.contents.find( { "$where" : "this.xxxx_count + this.aaaa_count >= 5" } )






참고

https://docs.mongodb.org/manual/reference/operator/query-comparison/


https://docs.mongodb.org/manual/reference/operator/query-logical/




'mongodb' 카테고리의 다른 글

mongodb 3.2 특징  (0) 2015.11.10
[mongodb] 커서 (cursor)  (0) 2015.11.09
[mongodb] _id, ObjectId  (0) 2015.11.09
[mongodb] 레플리카 구성 요소  (0) 2015.11.02
[mongodb] master 노드 변경하기  (0) 2015.10.30
Posted by '김용환'
,

[mongodb] _id, ObjectId

mongodb 2015. 11. 9. 21:12


mongodb의 _id는 ObjectId 타입이다. BSON이고 12바이트로 구성하였다. 기계 id, pid, 순차번호가 있어서 1 초 사이에도 uniqueness를 제공한다. 


특징적인 것은 사용자가 _id를 주지 않는다면, 서버가 아닌 클라이언트 (정확히는 driver)에서 구현하도록 되어 있다. 




참고

https://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html

https://docs.mongodb.org/manual/reference/object-id/

'mongodb' 카테고리의 다른 글

[mongodb] 커서 (cursor)  (0) 2015.11.09
[mongodb] mongodb 검색하기  (0) 2015.11.09
[mongodb] 레플리카 구성 요소  (0) 2015.11.02
[mongodb] master 노드 변경하기  (0) 2015.10.30
[mongodb] replica set 만들기  (0) 2015.10.26
Posted by '김용환'
,


1. 몽고DB 3.0 이전은 레플리카를 12개만 가질 수 있었으나, 3.0 부터는 50개를 가질 수 있지만, 투표 노드는 7개만 할 수 있다. 

2. 레플리카를 구성하려면 마스터, 슬래이브, 아비터만 구성할 수 있다. 


아비터는  몽고 DB의 특성인데, 데이터를 저장하지 않고 투표만 하는 노드이다. 그래서 쿼럼을 구성하고 투표를 진행할 수 있어서 높은 availability를 제공하는 것 같다. 


3. 레플리카 마스터 투표 중, 변수는 다음과 같다.

 heartbeat, priority 비교, 최근 oplog 중 timestamp가 가장 최신(또는 높은 값) 값, 연결 개수(품질), 네트워크 파티션등을 고려해서 결정한다. 


참조

https://docs.mongodb.org/manual/core/replica-set-members/#replica-set-arbiters

https://docs.mongodb.org/manual/reference/replica-states/

https://docs.mongodb.org/manual/core/replica-set-elections/

'mongodb' 카테고리의 다른 글

[mongodb] mongodb 검색하기  (0) 2015.11.09
[mongodb] _id, ObjectId  (0) 2015.11.09
[mongodb] master 노드 변경하기  (0) 2015.10.30
[mongodb] replica set 만들기  (0) 2015.10.26
[mongodb] explain  (0) 2015.10.12
Posted by '김용환'
,




mongodb를 replica 모드로 시작할 때, 먼저 mongdob떠서 실행되는 노드가 master이다. 그리고 rs.initiate(config)를 실행하여 replica를 실행한다.

mongodb에서 다른 노드로 master로 변경하려면 priority를 상대적으로 제일 높은 값을 주어야 변경이 된다.

 
priority는 0부터 1000까지 주어질 수 있으며, 0으로 설정하면 무조건 secondary가 되며, master가 안되게 하는 의미이다.

다시 처음으로 돌아가서 처음 mongodb를 재시작할 때, master는 처음 실행되는 master가 될 것이다.
디폴트 값은 문서에서 1로 정해져 있으나, 3.0.6으로 실행시 master는 master는 3이고, slave는 2로 설정되었다.

master를 바꾸려면 priority를 변경하면 된다.

config = rs.conf()
config.members[0].priority = 100
config.members[1].priority = 200
config.members[2].priority = 300
rs.reconfig(config)

또는 아래와 같이 실행한다. 

var config = { _id: \"replset\", members: [ { _id: 0, host: \”1.1.1.1:27017\”,priority:100 }, { _id: 1, host: \”1.1.1.2:27017\",priority:200 }, { _id: 3, host: \"1.1.1.3:27017\",priority:300 } ] }; rs.reconfig(config);


priority가 높은 노드가 master가 된다.
하지만, 각 노드에 rs.status()를 실행하면 master 여부가 나타나지 않는 부분이 존재한다. 

그래서, db.isMaster()를 호출하면 master 여부를 확인할 수 있다. 

printjson(db.isMaster())

1.1.1.1
{ isMaster: 0 }
1.1.1.2
{ isMaster: 0 }
1.1.1.3
{ isMaster: 1 }


* 참고 
https://docs.mongodb.org/manual/core/replica-set-priority-0-member/
https://docs.mongodb.org/manual/reference/command/replSetGetConfig/#replSetGetConfig.members%5Bn%5D.priority
https://docs.mongodb.org/manual/core/replica-set-primary/

https://docs.mongodb.org/manual/reference/command/isMaster/


'mongodb' 카테고리의 다른 글

[mongodb] _id, ObjectId  (0) 2015.11.09
[mongodb] 레플리카 구성 요소  (0) 2015.11.02
[mongodb] replica set 만들기  (0) 2015.10.26
[mongodb] explain  (0) 2015.10.12
[mongodb] collection 개수 구하기  (0) 2015.10.12
Posted by '김용환'
,