Mongo DB madvirusmadvirus net No SQL 3 No
Mongo. DB 소개 최 범 균 (madvirus@madvirus. net)
No. SQL 3
No. SQL is a movement promoting a loosely defined class of non-relational data stores that break with a long history of relational databases. These data stores may not require fixed table schemas, usually avoid join operations and typically scale horizontally. - WIKIPEDIA 4
No. SQL • 주요 특징 – – – schema-free replication 간단한 API no relation / no join eventually consistency (not ACID) scalable / distributed • No. SQL의 종류 – Document store • Mongo. DB, Couch. DB, Jackrabbit, Lotus Notes – Key/Value store • Amazon Simple. DB, Memcache. DB, … – Column 기반 • Hadoop/HBase, Cassandra, Hypertable, … – Graph DB • Neo 4 j, Hyper. Graph. DB, … 5
Document DB & Mongo. DB 7
Document 8
Document: Self-Contained 9
Document: Schema Free 10
Document 예시 { } ts : “ 20100415110001. 001”, user : { nickname: “madvirus”, id: 12345 }, site : { domain: “cc 2. wemade. com”, uri: “/main” } { } ts : “ 20100415110001. 005”, user : { nickname: “wemade”, id: 1 }, site : { domain: “cc 2. wemade. com”, uri: “/main” }, referer: { domain: “www. wemade. com”, uri: “/main” } 12
Mongo. DB • humongous DB – 현재 버전: 1. 4. 0 • 특징 – Document-oriented storage – index 지원 • geospacial 인덱스 지원, multikey – – – 빠른 업데이트 (no row lock, no table block) Replication Sharding (alpha) Map. Reduce 바이너리 데이터에 대한 효과적인 저장 • 파일, 이미지 등 – 쉬운 설치, 압축만 풀면 땡! – 언어별 드라이버 제공 • 공식 지원: C, C++, Java, Perl, PHP, Python, Ruby • 커뮤니티 지원: C#/. NET, Erlang, Go, Groovy/Scala/Clojure 13
mongo. DB 사용 15
Mongo. DB의 구성요소 - Collection, Document • Database • Collection – RDBMS의 Table과 유사 – Document를 포함 • Document – RDBMS의 Row와 유사 – Schema Free – 문서마다 고유 키 값을 가짐 (“_id”) • 지정하지 않을 경우 mongo. DB가 자동 생성 16
설치 및 실행 • http: //www. mongodb. org 에서 다운로드 • 서버 시작 – 기본DB경로: /data/db (c: datadb), 포트: 27017 $ mongod --dbpath /wemade/db --port 90912 $ mongod –fork –logpath /wemade/log/db/mongodb. log • 서버 중지 – mongo 콘솔 접속후 shutdown. Server() 실행 $ mongo > db. shutdown. Server() – Ctrl+C, kill -2 PID, kill -15 PID • kill -9 PID 사용시 데이터 깨질 수 있음 17
콘솔을 이용한 접근 • bin/mongo 콘솔 프로그램 이용 – 자바스크립트 코드를 이용 $ mongo > use weblog switched to db weblog > db. pageview_minute. find(); { "_id" : Object. Id("4 bbc 3512831900001984"), "hour" : "201004071632", "pageviews" : 4000, "site" : "funpc. wemade. com" } { "_id" : Object. Id("4 bbc 355 d 831900001985"), "hour" : "201004071633", "pageviews" : 601, "site" : "funpc. wemade. com" } { "_id" : Object. Id("4 bbc 3568831900001986"), "hour" : "201004071634", "pageviews" : 3194, "site" : "funpc. wemade. com" } { "_id" : Object. Id("4 bbc 35 a 4831900001987"), "hour" : "201004071635", "pageviews" : 3210, "site" : "funpc. wemade. com" } { "_id" : Object. Id("4 bbc 35 e 0831900001988"), "hour" : "201004071636", "pageviews" : 2142, "site" : "funpc. wemade. com" } { "_id" : Object. Id("4 bbc 361 c 831900001989"), "hour" : "201004071637", "pageviews" : 853, "site" : "funpc. wemade. com" } { "_id" : Object. Id("4 bbc 374083190000198 a"), "hour" : "201004071641", "pageviews" : 1026, "site" : "funpc. wemade. com" } { "_id" : Object. Id("4 bbc 374883190000198 b"), "hour" : "201004071642", "pageviews" : 7979, "site" : "funpc. wemade. com" } { "_id" : Object. Id("4 bbc 378483190000198 c"), "hour" : "201004071643", "pageviews" : 995, "site" : "funpc. wemade. com" } > 18
드라이버를 이용한 접근 • 각 언어별로 제공되는 드라이버 이용 Mongo mongo = new Mongo("localhost", 27017); DB db = mongo. get. DB("weblog"); DBCollection collection = db. get. Collection("pageview_minute"); Basic. DBObject q = new Basic. DBObject(); Simple. Date. Format format = new Simple. Date. Format("yyyy. MMdd. HHmm"); q. put("hour", format(time)); q. put("site", site); Basic. DBObject o = new Basic. DBObject(); Basic. DBObject inc. Val = new Basic. DBObject(); inc. Val. put("pageviews", new Integer(1)); o. put("$inc", inc. Val); collection. update(q, o, true); 19
문서 관련 기본 API • 문서 삽입 – db. coll. Name. save( {name: “mongo”} ); • 문서 조회 – – – db. coll. Name. find() db. coll. Name. find( {name: “mongo”} ) db. coll. Name. find( {…}, {name: 1, ssn: 1} ) db. coll. Name. find( … ). sort( {userid: 1} ) db. coll. Name. find( {}, 10, 20); db. coll. Name. count() • 문서 수정 – db. coll. Name. update( {userid: “madvirus”}, { lastupts: val}, false ); • 문서 삭제 – db. coll. Name. remove( {} ) – db. coll. Name. remove( {userid: “madvirus”} ) • 인덱스 생성 – db. collection. Name. ensure. Index( {userid: 1, regts: 1} ) • 기타 – group(), min(), max(), $in, $where (or 연산), 21
Mongo. DB가 끌린 이유 • • • Replication Sharding Map. Reduce Atomic 값 증분 Capped Collection Geospacial Index 23
Replication • 서버 간 Replication 지원 – High Availability (Failover) – Read Throughput 증대 • 구성 Master-Slave Replica Pair Master 24
Map. Reduce 동작 방식 발췌: http: //www. slideshare. net/spirosd/mapreduce-distributed-computing-on-large-commodity-clusters 27
Map. Reduce 예 • 태그 개수 구하기 {tags: [‘dog’, ‘cat’] } [‘mouse’, ‘cat’, ‘dog’] } [] } {‘dog’: [1, 1] } {‘cat’: [1, 1, 1] } {‘mouse’: [1] } { "_id" : "cat", "value" : 3 } { "_id" : "dog", "value" : 2 } { "_id" : "mouse", "value" : 1 } map = function() { this. tags. for. Each( function(tag) { emit( tag, 1 ); }; reduce = function( key , values ){ var total = 0; for ( var i=0; i < values. length ; i++ ) { total += values[i]; } return total; }; 28
Atomic 값 증분 • upsert와 $inc를 이용한 Atomic 값 증분 – 실시간 통계 데이터 생성에 적합 • 시간 당 접속자, 10분당 PV, 분당 회원 가입 수 c. update( { hour : "20100415100001”, site : "abc" }, { $inc : { pageviews: 1} }, { upsert : true } ) 데이터 삽입 {hour: “ 2010041510001”, site: “abc”, pageviews: 1 } c. update( { hour : "20100415100001”, site : "abc" }, { $inc : { pageviews: 1} }, { upsert : true } ) pageviews 값 증가 {hour: “ 2010041510001”, site: “abc”, pageviews: 2 } c. update( { hour : "20100415100001”, site : "abc" }, { $inc : { pageviews: 1} }, { upsert : true } ) pageviews 값 증가 {hour: “ 2010041510001”, site: “abc”, pageviews: 3 } c. update( { hour : "20100415100002”, site : "abc" }, { $inc : { pageviews: 1} }, { upsert : true } ) 데이터 삽입 {hour: “ 2010041510002”, site: “abc”, pageviews: 1 } 30
Geospacial Index • 2 D 기반의 인덱스 32
맺으며… • No. SQL DB에 대한 관심 필요 • Document 중심 사고 – No Relation, No Join, No SQL, Schema Free • Map. Reduce 이해 – 병렬 처리, no group by • RDBMS와 Document DB의 알맞은 사용 36
참고자료 • Map. Reduce • No. SQL • Mongo. DB 관련 문서 – Wikipedia: http: //en. wikipedia. org/wiki/Map. Reduce – Map. Reduce: distributed computing on large commodity clusters: http: //www. slideshare. net/spirosd/mapreduce-distributed-computing-on-largecommodity-clusters – No. SQL 정의 : http: //en. wikipedia. org/wiki/No. SQL – Mongo. DB 매뉴얼: http: //www. mongodb. org/display/DOCS/Developer+Zone – Fast Updates with Mongo. DB: http: //blog. mongodb. org/post/248614779/fast-updates-with-mongodb-update-inplace – Mongo. DB is Fatastic for Logging: http: //blog. mongodb. org/post/172254834/mongodb-is-fantastic-for-logging – Using Mongo. DB for Real-time Analytics: – http: //blog. mongodb. org/post/171353301/using-mongodb-for-real-time-analytics 37
Q&A 38
- Slides: 38