MongoDB 3.0 is the newest and most significant release of the world’s fastest growing database. The version radically expands the use cases for MongoDB, allowing you to use it for the vast majority of all new applications. By improving performance by 7x - 10x, reducing storage needs by up to 80%, and lowering operations overhead by up to 95%, MongoDB 3.0 also dramatically increases your ability to deliver apps to market faster and more efficiently than ever before.

Download the white paper to learn about the latest features in 3.0:

  • Pluggable storage engines, including WiredTiger
  • Higher performance & efficiency
  • Simplified operations through Ops Manager
  • End-to-end auditing
  • Enhanced Query Language and Tools

몽고DB 3.2부터 wiredtiger 스토리지 엔진이 디폴트로 채용할 수도 있을 것이라는 얘기가 있다.

Support for the new WiredTiger storage engine will come later, most likely with the release of MongoDB 3.2, where it is expected to become the default storage engine for MongoDB. 

관련 자료 링크

MongoDB World 2015 - A Technical Introduction to WiredTiger from WiredTiger

개발 사례 

FIFA 온라인 3의 MongoDB 사용기 from Jongwon Kim

몽고 3.0.6 을 사용하여 서비스 해봄, 로그 파일 

2015-09-22T11:01:04.925+0900 I CONTROL  ***** SERVER RESTARTED *****

2015-09-22T11:01:04.948+0900 I STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=3G,session_max=20000,eviction=(threads_max=4),statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0),

2015-09-22T11:01:05.084+0900 I CONTROL  [initandlisten] MongoDB starting : pid=15084 port=27017 dbpath=/data/db 64-bit host=alpha-mongo1

2015-09-22T11:01:05.084+0900 I CONTROL  [initandlisten]

2015-09-22T11:01:05.084+0900 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 31394 processes, 1024000 files. Number of processes should be at least 512000 : 0.5 times number of files.

2015-09-22T11:01:05.084+0900 I CONTROL  [initandlisten] db version v3.0.6

2015-09-22T11:01:05.084+0900 I CONTROL  [initandlisten] git version: 1ef45a23a4c5e3480ac919b28afcba3c615488f2

2015-09-22T11:01:05.084+0900 I CONTROL  [initandlisten] build info: Linux ip-10-67-194-123 2.6.32-220.el6.x86_64 #1 SMP Wed Nov 9 08:03:13 EST 2011 x86_64 BOOST_LIB_VERSION=1_49

2015-09-22T11:01:05.084+0900 I CONTROL  [initandlisten] allocator: tcmalloc

2015-09-22T11:01:05.084+0900 I CONTROL  [initandlisten] options: { config: "/etc/mongod.conf", net: { bindIp: "", port: 27017, unixDomainSocket: { enabled: true }, wireObjectCheck: false }, processManagement: { fork: true, pidFilePath: "/var/run/mongodb/" }, replication: { oplogSizeMB: 10240, replSetName: "rs0" }, storage: { dbPath: "/data/db", directoryPerDB: true, engine: "wiredTiger", journal: { enabled: true } }, systemLog: { destination: "file", logAppend: true, path: "/var/log/mongodb/mongod.log" } }

2015-09-22T11:01:05.094+0900 I REPL     [initandlisten] Did not find local replica set configuration document at startup;  NoMatchingDocument Did not find replica set configuration document in local.system.replset

2015-09-22T11:01:05.101+0900 I NETWORK  [initandlisten] waiting for connections on port 27017

설정 파일 

$ cat /etc/mongod.conf


  destination: file

  logAppend: true

  path: /var/log/mongodb/mongod.log


  engine: wiredTiger

  dbPath: /data/db

  directoryPerDB: true


    enabled: true


  fork: true

  pidFilePath: /var/run/mongodb/



  port: 27017

  wireObjectCheck : false


    enabled : true


  oplogSizeMB: 10240

  replSetName: "rs0"

Posted by 김용환 '김용환'

mongodb 3.0의 mongod 명령어의 주요 디폴트 설정을 확인해본다. (리눅스 기준)

--dbpath <path>  :  /data/db

--storageEngine string :  mmapv1

--wiredTigerCacheSizeGB number : the maximum of half of physical RAM or 1 gigabyte

--wiredTigerStatisticsLogDelaySecs <seconds> :  0

--wiredTigerJournalCompressor <compressor> : snappy

--wiredTigerCollectionBlockCompressor <compressor> : snappy

--wiredTigerIndexPrefixCompression <boolean> : true

--nssize <value>  : 16

--syncdelay <value> :  60

--journalCommitInterval <value> :  100 또는 30

--oplogSize <value> : 64-bit systems, the oplog is typically 5% of available disk space.

Posted by 김용환 '김용환'

몽고DB를 mac에 설치하여 테스트를 진행하고 있다.

몽고DB를 mac에서 standalone으로 실행한다. 

$ brew install mongodb

$ sudo mkdir -p /data/db
$  sudo chown 사용자이름 /data/db
$ mongod
2015-09-17T14:36:04.358+0900 I JOURNAL  [initandlisten] journal dir=/data/db/journal
2015-09-17T14:36:04.358+0900 I JOURNAL  [initandlisten] recover : no journal files present, no recovery needed
2015-09-17T14:36:04.370+0900 I JOURNAL  [durability] Durability thread started
2015-09-17T14:36:04.371+0900 I JOURNAL  [journal writer] Journal writer thread started
2015-09-17T14:36:04.371+0900 I CONTROL  [initandlisten] MongoDB starting : pid=36980 port=27017 dbpath=/data/db 64-bit host=xxx
2015-09-17T14:36:04.371+0900 I CONTROL  [initandlisten] db version v3.0.1
2015-09-17T14:36:04.371+0900 I CONTROL  [initandlisten] git version: nogitversion
2015-09-17T14:36:04.371+0900 I CONTROL  [initandlisten] build info: Darwin mavericksvm.local 13.4.0 Darwin Kernel Version 13.4.0: Wed Dec 17 19:05:52 PST 2014; root:xnu-2422.115.10~1/RELEASE_X86_64 x86_64 BOOST_LIB_VERSION=1_49
2015-09-17T14:36:04.371+0900 I CONTROL  [initandlisten] allocator: system
2015-09-17T14:36:04.371+0900 I CONTROL  [initandlisten] options: {}
2015-09-17T14:36:04.375+0900 I INDEX    [initandlisten] allocating new ns file /data/db/local.ns, filling with zeroes...
2015-09-17T14:36:04.402+0900 I STORAGE  [FileAllocator] allocating new datafile /data/db/local.0, filling with zeroes...
2015-09-17T14:36:04.402+0900 I STORAGE  [FileAllocator] creating directory /data/db/_tmp
2015-09-17T14:36:04.492+0900 I STORAGE  [FileAllocator] done allocating datafile /data/db/local.0, size: 64MB,  took 0.089 secs

2015-09-17T14:36:04.619+0900 I NETWORK  [initandlisten] waiting for connections on port 27017

다른 터미널에서 mongo cli 실행한다. 

$ which mongo

$ mongo
MongoDB shell version: 3.0.1
connecting to: test

로컬에서 몽고db를 클러스터링셋으로 실행하기가 번거롭다. 

그래서 이를 간단히 도와주는 툴이 mtools 밑에 mlaunch 가 있다. 이를 사용하면 편리하게 mongo를 편하게 실행/종료/설정이 가능하다. mlauch외에 다양한 툴이 있으니. 확인할 수 있다.

언급된 github 주소의 github repository를 clone 한 후, 해당 디렉토리에 들어가서 mtools를 설치한다.

requirement.txt 파일에 dependency lib가 정의되어 있다. 

$ cd mtools

$ cat requirements.txt

$ sudo pip install -r requirements.txt

(설치 완료)

$ mlaunch init  --replicaset
launching: mongod on port 27017
launching: mongod on port 27018
launching: mongod on port 27019

replica set 'replset' initialized.

 $ ps -ef | grep mongo

  501 68371     1   0  6:44PM ??         1:20.89 mongod --replSet replset --dbpath /mydev/opensource/aa/data/replset/rs1/db --logpath /mydev/opensource/aa/data/replset/rs1/mongod.log --port 27017 --logappend --fork

  501 68374     1   0  6:44PM ??         1:18.71 mongod --replSet replset --dbpath /mydev/opensource/aa/data/replset/rs2/db --logpath /mydev/opensource/aa/data/replset/rs2/mongod.log --port 27018 --logappend --fork

  501 68377     1   0  6:44PM ??         1:19.19 mongod --replSet replset --dbpath /mydev/opensource/aa/data/replset/rs3/db --logpath /mydev/opensource/aa/data/replset/rs3/mongod.log --port 27019 --logappend --fork

  501 70542 68555   0  7:29PM ttys002    0:00.13 mongo --port 27018

  501 84715 58108   0  8:21AM ttys011    0:00.00 grep mongo

  501 80512 16956   0  9:38PM ttys018    0:00.09 mongo

레플리카셋 모드로 3개의 몽고 데몬이 떠있다. (oplog 테스트하려고 했었는데 완전 편하다..)

종료 할 때는 다음과 같이 실행한다.

$ mlaunch stop

3 nodes stopped.

유의할 때는 mlaunch를 실행한 디렉토리에서 실행해야 한다.. (해당 설정 파일을 디렉토리로 읽고 쓰는 구조로 되어 있다.)

replicaset 옵션으로 mongo를 실행했기 때문에 mongo cli를 쓰면 oplog를 볼 수 있고, slave로 전달했는지 확인할 수 있다. standalone에서는 oplog를 볼 수 없었다.

mtools에 대한 설명은 github wiki외에 몽고DB 공식 블로그에서도 설명되어 있으니. 참조하면 좋다.

Posted by 김용환 '김용환'

nosql 중 (TTL) expire callback event를 직접 전달받을 수 있는 스토리지는 2가지가 있는 것 같다.

(사실 다른 nosql을 써도 되지만 cron job과 같은 scheduler로 모든 데이터의 ttl expire 체크는 위험스러울 수 있어서..)

1. redis

2. couchbase

그러나 간접적으로 expire callback event를 받을 수 있는 스토리지는 1가지가 더 있다.

1. mongodb

redis의 expired item의 callback은 바로 오지 않고, get 하는 시점에 ttl expire 시간을 확인한 후, expire 된 값일 때에만 callback 이벤트를 전달한다.

(관련 내용 :

couchbase는 expire callback 을 http url로 받을 수 있다.

memcached를 들고 있는 터라 조금은 무거운 느낌이다.

(관련 내용 :

mongodb는 standalone이 아닌 clusterset으로 실행시 oplog를 받을 수 있다. document에 op가 "d"가 있고 TTL 지정한 db.collection으로 검색해 보면, TTL expire event가 발생했음을 찾을 수 있다. (expire 시간에 바로 발생하지 않고, 1분 단위로 cron 체크해서 oplog로 남기는 것 같다.)

Posted by 김용환 '김용환'

spark에 대한 정보를 잘 몰랐는데, 아래 공유된 PPT로 잘 공부했다~


Spark Summit East 2015 Advanced Devops Student Slides from Databricks

Posted by 김용환 '김용환'

[redis] keys 대신 scan

nosql 2015.07.02 15:45

redis의 keys는 모든 키의 내용을 출력하는 커맨드인데, 키가 많아지면, 키를 찾는데 시간 소요가 커질 수 있다.

이 때, redis 의 one thread 정책 특성 때문에 다른 작업을 하지 못하게 된다. 따라서 문제가 될 소지가 많은 명령어이다.

KEYS 설명에 Warning에 잘 설명되어 있다.

Warning: consider KEYS as a command that should only be used in production environments with extreme care. 

It may ruin performance when it is executed against large databases. 

This command is intended for debugging and special operations, such as changing your keyspace layout. 

Don't use KEYS in your regular application code. 

If you're looking for a way to find keys in a subset of your keyspace, consider using SCAN or sets.

따라서, key를 보려면 SCAN (이나 set를 쓰라고 되어 있다.

SCAN 명령어는 page 개념과 커서 개념이 들어가 있으니. 이에 맞는 옵션을 사용하면 된다.

간단하게 키를 검색하는 명령어는 "scan 0"이고, 페이지 단위로 넘겨야 한다. 

page 개념은 count로 되어 있다 .count는 디폴트가 10이라서, 큰 데이터가 redis에 있다면 적당하기 크게 하면 된다.

그리고, wildcard(*)를 사용하여 일치하는 redis key를 찾을 수 있다. 커서는 scan 커맨드 뒤에 붙여 사용하도록 되어 있다. 

아래 처럼 scan 명령어를 사용하면 괜찮을 것이다. 

100개씩 queue:noti 키가 있는지를 체크한다. 그 다음에 확인하려면 커서의 값인 8010을 scan 뒤에 붙여 검색하면 된다.> scan 0 match queue:noti count 100
1) "8010"
...> scan 8010 match queue:noti count 100
1) "8010"


다른 scan도 비슷하게 사용할 수 있다. 

  • SCAN iterates the set of keys in the currently selected Redis database.
  • SSCAN iterates elements of Sets types.
  • HSCAN iterates fields of Hash types and their associated values.
  • ZSCAN iterates elements of Sorted Set types and their associated scores.

개발 redis에서 keys 대신 아래 처럼 count와 패턴을 사용하는 것이 좋다.

> scan 0 count 100000000

> scan 0 match *na count 100000000

실제 구현 내용은 아래 블로그를 참조할 수 있다.

Posted by 김용환 '김용환'

redis에서 다중 키를 삭제할 때, 다음과 같이 KEYS와 xargs DEL를 사용하면 삭제할 수 있다. 

$ redis-cli KEYS "패턴" | xargs redis-cli DEL 

(integer) 100

100개의 redis 키를 삭제했다면, 결과값으로 (integer) 100을 출력한다. KEYS로 확인한 개수가 맞는 지 확인가능하다.

또한, 다른 서버에 위치한 redis 장비에 접속할 수 있다. 호스트에 대응하는 h와 포트에 대응하는 p 매개변수를 이용한다. 

-h는 호스트명, -p는 포트이다. 그리고 

예를 들어 다른 서버에 위치한 redis의 다중 키를 삭제하려면 다음과 같이 진행한다. 

$ redis-cli -h -p 6370 KEYS "xyz_*" | xargs redis-cli -h -p 6370 DEL

(integer) 7

Posted by 김용환 '김용환'

[redis] slowlog

nosql 2015.06.21 23:31

mysql처럼 Redis 의 slowlog를 볼 수 있다.  2.2.12부터 사용가능하다.

1. slowlog 설정하기

config set slowlog-log-slower-than (시간) 명령을 이용하여 

100ms 이상 소요되는 모든 쿼리 시간을 기록한다.> config set slowlog-log-slower-than 100

1) "slowlog-log-slower-than"

2) "100"> config get slowlog-log-slower-than

1) "slowlog-log-slower-than"

2) "100"

config set slowlog-max-len (숫자) 명령을 이용하여

max 1000 개의 slow 로그 개수 저장한다.> config set slowlog-max-len 1000

OK> config get slowlog-max-len

1) "slowlog-max-len"

2) "1000"

2. slowlog 보기

slowlog가 점점 많아진다면, slowlog len 의 결과가 점점 많아진다.> slowlog len

(integer) 12123> slowlog len

(integer) 12130

slowlog를 보려면 slowlog get 명령어를 사용한다. 쿼리 실행시간을 체크한다.> slowlog get

1) (정수) # 고유 로그 식별자

2) (정수) # 유닉스 타임 스탬프 형식 

3) (정수) # 쿼리 실행시간

4) Array 구성 # 저장된 실제 명령어 


slowlog get 명령어는 여러 개를 보여주기 때문에, 하나만 보고 싶으면, <숫자>만 추가하면 숫자만큼 보여준다.> slowlog get 1

1) 1) (integer) 1772
2) (integer) 1434638964
3) (integer) 101857
2) "uid:69547021"
3) "-inf"
4) "-94001836743585987"

slowlog 발생하면, 다른 것으로 대체된다.> slowlog get 1
1) 1) (integer) 1773
2) (integer) 1434638966
3) (integer) 11956
4) 1) "ZRANGE"
2) "uid:71318816"
3) "0"
4) "-1"
5) "withscores"

3. slowlog 재설정> slowlog reset

Posted by 김용환 '김용환'

구글 Bigtable을 서비스로 볼 수 있다는 뉴스이다.

bigtable 은 google cloud에서 베타로 서비스되고 있다.

YCSB 벤치마크 테스트를 이용한 성능 테스트 (throughput & low latency)도 소개되었다. 

Posted by 김용환 '김용환'

분산 캐시 시스템 관련해서 기고했다. 

평범한 개발자가 작성한 분산 캐시 시스템 내용...




Posted by 김용환 '김용환'