SlideShare a Scribd company logo
MongoDB 소개최 범 균 (madvirus@madvirus.net)
2공통점?
3NoSQL
4NoSQL 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 maynot require fixed table schemas, usually avoid join operations and typically scale horizontally.- WIKIPEDIA
NoSQL주요 특징schema-freereplication간단한 APIno relation / no joineventually consistency (not ACID)scalable / distributedNoSQL의 종류Document storeMongoDB, CouchDB, Jackrabbit, Lotus NotesKey/Value storeAmazon SimpleDB, MemcacheDB, …Column 기반Hadoop/HBase, Cassandra, Hypertable, …Graph DBNeo4j, HyperGraphDB, …5
오늘의 주제: MongoDB세미나의 목적MongoDB의 주요 기능 & 활용 방안 소개TOCDocument DB와 MongoDB왜 MongoDB?MongoDB 쓰임새6
Document DB & MongoDB7
Document8
Document: Self-Contained9
Document: Schema Free10
Document DB문서 저장소주요 특징<key, value> 형식으로 문서 저장대부분 JSON 형식 이용No JoinSchema FreeNo SQL싼 장비, 대량 데이터, HA (replication), 분산 처리주요 제품MongoDB, CouchDB, Riak, ...11
Document 예시{    ts : “20100415110001.001”,    user : {        nickname: “madvirus”,        id: 12345    },    site : {        domain: “cc2.wemade.com”,        uri: “/main/main”    }}{    ts : “20100415110001.005”,    user : {        nickname: “wemade”,        id: 1    },    site : {        domain: “cc2.wemade.com”,        uri: “/main/main”    },    referer: {        domain: “www.wemade.com”,        uri: “/main/main”    }}12
MongoDBhumongous DB현재 버전:1.4.0특징Document-oriented storageindex 지원geospacial 인덱스 지원, multikey빠른 업데이트 (no row lock, no table block)ReplicationSharding (alpha)MapReduce바이너리 데이터에 대한 효과적인 저장파일, 이미지 등쉬운 설치, 압축만 풀면 땡!언어별 드라이버 제공공식 지원: C, C++, Java, Perl, PHP, Python, Ruby커뮤니티 지원: C#/.NET, Erlang, Go, Groovy/Scala/Clojure13
MongoDB 레퍼런스피딩 시스템의 캐시내부 리포팅 어플리케이션프론트 페이지, 프로젝트의백엔드 스토리지댓글 시스템의 백엔드 스토리지사이트 데이터, 포스트, 댓글, 이미지 스토리지서버 모니터링 솔루션실시간 로그 처리&분석14
mongoDB 사용15
MongoDB의 구성요소 - Collection, DocumentDatabaseCollectionRDBMS의 Table과 유사Document를 포함DocumentRDBMS의 Row와 유사Schema Free문서마다 고유 키 값을 가짐 (“_id”)지정하지 않을 경우 mongoDB가 자동 생성16
설치 및 실행http://www.mongodb.org 에서 다운로드서버 시작기본DB경로: /data/db (c:\data\db), 포트: 27017서버 중지mongo 콘솔 접속후 shutdownServer() 실행Ctrl+C, kill -2 PID, kill -15 PIDkill -9 PID 사용시 데이터 깨질 수 있음$ mongod$ mongod --dbpath /wemade/db --port 90912$ mongod –fork –logpath /wemade/log/db/mongodb.log$ mongo> db.shutdownServer()17
콘솔을 이용한 접근bin/mongo 콘솔 프로그램 이용자바스크립트 코드를 이용$ mongo> use weblogswitched to db weblog> db.pageview_minute.find();{ "_id" : ObjectId("4bbc35128319000000001984"), "hour" : "201004071632", "pageviews" : 4000, "site" : "funpc.wemade.com" }{ "_id" : ObjectId("4bbc355d8319000000001985"), "hour" : "201004071633", "pageviews" : 601, "site" : "funpc.wemade.com" }{ "_id" : ObjectId("4bbc35688319000000001986"), "hour" : "201004071634", "pageviews" : 3194, "site" : "funpc.wemade.com" }{ "_id" : ObjectId("4bbc35a48319000000001987"), "hour" : "201004071635", "pageviews" : 3210, "site" : "funpc.wemade.com" }{ "_id" : ObjectId("4bbc35e08319000000001988"), "hour" : "201004071636", "pageviews" : 2142, "site" : "funpc.wemade.com" }{ "_id" : ObjectId("4bbc361c8319000000001989"), "hour" : "201004071637", "pageviews" : 853, "site" : "funpc.wemade.com" }{ "_id" : ObjectId("4bbc3740831900000000198a"), "hour" : "201004071641", "pageviews" : 1026, "site" : "funpc.wemade.com" }{ "_id" : ObjectId("4bbc3748831900000000198b"), "hour" : "201004071642", "pageviews" : 7979, "site" : "funpc.wemade.com" }{ "_id" : ObjectId("4bbc3784831900000000198c"), "hour" : "201004071643", "pageviews" : 995, "site" : "funpc.wemade.com" }>18
드라이버를 이용한 접근각 언어별로 제공되는 드라이버 이용Mongo mongo = new Mongo("localhost", 27017);DB db = mongo.getDB("weblog");DBCollection collection = db.getCollection("pageview_minute");BasicDBObject q = new BasicDBObject();SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmm");q.put("hour", format.format(time));q.put("site", site);BasicDBObject o = new BasicDBObject();BasicDBObject incVal = new BasicDBObject();incVal.put("pageviews", new Integer(1));o.put("$inc", incVal);collection.update(q, o, true, true);19
DB/콜렉션 생성/삭제Lazy Creation실제 데이터가 생성될 때 DB/콜렉션 생성됨명시적인 DB/콜렉션 생성 없음콜렉션 삭제db.collName.drop()20
문서 관련 기본 API문서 삽입db.collName.save( {name: “mongo”} );문서 조회db.collName.find()db.collName.find( {name: “mongo”} )db.collName.find( {…}, {name: 1, ssn: 1} )db.collName.find( … ).sort( {userid: 1} )db.collName.find( {}, {}, 10, 20);db.collName.count()문서 수정db.collName.update( {userid: “madvirus”}, { lastupts: val}, false );문서 삭제db.collName.remove( {} )db.collName.remove( {userid: “madvirus”} )인덱스 생성db.collectionName.ensureIndex( {userid: 1, regts: 1} )기타group(), min(), max(), $in, $where (or 연산), 21
왜 끌렸나?22
MongoDB가 끌린 이유ReplicationShardingMapReduceAtomic 값 증분Capped CollectionGeospacial Index23
Master-SlaveReplication서버 간 Replication 지원High Availability (Failover)Read Throughput 증대구성Replica PairMaster24
Sharding하나의 개념적 문서 집합을 다수의 물리적 저장소에 분할해서 보관MongoDB는 인덱스 범위를 이용해서 보관ShardShardShardShardChunkChunkChunkChunkmongosconfig serverClient25
MapReduce 지원MapReduceGoogle이 창안 대량의 데이터 집합을 많은 컴퓨터로 병렬 처리2단계 처리Map단계 /Reduce 단계응용데이터 클러스터링 연산Collective Intelligence웹 로그 통계 생성데이터 추출/필터링상상하는 만큼 …26
MapReduce 동작 방식27발췌: http://www.slideshare.net/spirosd/mapreduce-distributed-computing-on-large-commodity-clusters
MapReduce 예태그 개수 구하기{tags: [‘dog’, ‘cat’] }{tags: [‘cat’] }{tags: [‘mouse’, ‘cat’, ‘dog’] }{tags: [] }map = function() {    this.tags.forEach(        function(tag) {            emit( tag, 1 );        }    );};{‘dog’: [1, 1] }{‘cat’: [1, 1, 1] }{‘mouse’: [1] }reduce = function( key , values ){    var total = 0;    for ( var i=0; i < values.length ; i++ ) {        total += values[i];    }    return total;};{ "_id" : "cat", "value" : 3 }{ "_id" : "dog", "value" : 2 }{ "_id" : "mouse", "value" : 1 }28
MapReduce + Sharding각 Shard를 통해 데이터 처리 및 수집 클러스터를 이용한 대량 데이터 처리Shard 별 분산∙병렬 처리를 통한 처리 시간 단축/처리량 증가대량 데이터 분석/생성에 적합ShardMapReduce 실행각 Shard에MapReduce 실행 요청ShardMapReduce 실행 요청MapReduce 실행mongosClientShard각 Shard의Reduce 결과MapReduce 실행각 Shard의Reduce 결과의Reduce 결과ShardMapReduce 실행29
Atomic 값 증분upsert와 $inc를 이용한 Atomic 값 증분실시간 통계 데이터 생성에 적합시간 당 접속자, 10분당 PV, 분당 회원 가입 수c.update( { hour : "20100415100001”, site : "abc" },             { $inc : { pageviews: 1} },             { upsert : true } )c.update( { hour : "20100415100001”, site : "abc" },             { $inc : { pageviews: 1} },             { upsert : true } )c.update( { hour : "20100415100001”, site : "abc" },             { $inc : { pageviews: 1} },             { upsert : true } )c.update( { hour : "20100415100002”, site : "abc" },             { $inc : { pageviews: 1} },             { upsert : true } )데이터 삽입{hour: “2010041510001”, site: “abc”, pageviews: 1 }pageviews 값 증가{hour: “2010041510001”, site: “abc”, pageviews: 2 }pageviews 값 증가{hour: “2010041510001”, site: “abc”, pageviews: 3 }데이터 삽입{hour: “2010041510002”, site: “abc”, pageviews: 1 }30
Capped Collection개수 제한을 갖는 콜렉션생성db.createCollection(“mycoll”,     {capped: true, size: 1000, max: 100})동작 방식지정된 개수만큼 차면, 새 문서를 추가 시 가장 오래된 문서 삭제삽입 순서로 인덱스 자동 생성제약기존 문서 수정시, 기존 문서보다 클 경우 수정 실패문서 삭제 불가32bit 머신에서 10억 바이트 (약 950M) 크기 제한64bit 머신은 시스템 자원만큼활용캐시LRU 캐시와 유사한 효과로깅인덱스 없는 경우 파일시스템에 근접한 쓰기 속도31
Geospacial Index2D 기반의 인덱스32
Geospacial Index좌표를 이용한 인덱스 생성db.position.ensureIndex( {loc: “2d”}, {min: -500, max: 500} ){ loc: [30, 30] }, {loc: {x: 50, y: 30} }쿼리근처에 있는 것 검색 (거리 기준)db.place.find( {loc : {$near: {x:50, y:30} } } )db.place.find( {loc : {$near: {x:50, y:30} } } ).limit(3)영역 안에 포함된 것 검색db.place.find( {loc: {$within : {$box: [[0,0],[10,10]] } } } );db.place.find( {loc: {$within : {$center: [ [50, 50], 20 ] } } } );복합 인덱스근처에 있는 자원 검색db.place.ensureIndex( {loc: “2d”, cat: 1} )db.place.find( {loc: {$near: [10,10] }, cat: “bank” }  ).limit(10)응용위치(맵) 기반 연산 (웹 게임 등에서 활용)데이터 클러스터링에서의 활용33
정리34
MongoDB의 쓰임새적합한 용도웹 App 백엔드 스토리지세션 데이터회원 프로필, 이벤트, 댓글, 설문조사 등실시간 분석Atomic Inc을 이용한 실시간 통계 (실시간 분당/시간당 PV)대용량 로그 처리 & 분석Sharding & MapReduce 기반 대용량 로그 분석/데이터 처리캐시<key, value>, Schema Free 특징으로 캐시 구현 적합Capped Collection좌표 기반 데이터 처리알맞지 않은 용도트랜잭션이 중요한 시스템예, 금융권 시스템, 빌링 시스템, 회원 테이블35
맺으며…NoSQL DB에 대한 관심 필요Document 중심 사고No Relation, No Join, No SQL, Schema FreeMapReduce 이해병렬 처리, no group byRDBMS와 Document DB의 알맞은 사용36
참고자료MapReduceWikipedia:http://en.wikipedia.org/wiki/MapReduceMapReduce:distributed computing on large commodity clusters:http://www.slideshare.net/spirosd/mapreduce-distributed-computing-on-large-commodity-clustersNoSQLNoSQL 정의 : http://en.wikipedia.org/wiki/NoSQLMongoDB 관련 문서MongoDB 매뉴얼: http://www.mongodb.org/display/DOCS/Developer+ZoneFast Updates with MongoDB:http://blog.mongodb.org/post/248614779/fast-updates-with-mongodb-update-in-placeMongoDB is Fatastic for Logging: http://blog.mongodb.org/post/172254834/mongodb-is-fantastic-for-loggingUsing MongoDB for Real-time Analytics:http://blog.mongodb.org/post/171353301/using-mongodb-for-real-time-analytics37
Q&A38

More Related Content

PPTX
Mongo DB 성능최적화 전략
PDF
Mongodb 특징 분석
PPTX
MaxScale이해와활용-2023.11
PPTX
Maxscale 소개 1.1.1
PDF
Maxscale_메뉴얼
PDF
Cassandra Introduction & Features
PDF
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
PDF
Twitter의 snowflake 소개 및 활용
Mongo DB 성능최적화 전략
Mongodb 특징 분석
MaxScale이해와활용-2023.11
Maxscale 소개 1.1.1
Maxscale_메뉴얼
Cassandra Introduction & Features
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Twitter의 snowflake 소개 및 활용

What's hot (20)

PDF
ProxySQL High Availability (Clustering)
PPTX
CockroachDB
PDF
Apache Cassandra and DataStax Enterprise Explained with Peter Halliday at Wil...
PDF
MariaDB MaxScale monitor 매뉴얼
PDF
MySQL 상태 메시지 분석 및 활용
PDF
MariaDB MaxScale
PPTX
mongodb와 mysql의 CRUD 연산의 성능 비교
PDF
MongoDB WiredTiger Internals
PDF
MySQL Administrator 2021 - 네오클로바
PDF
Kubernetes & helm 활용
PDF
PostgreSQL: Advanced indexing
DOCX
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docx
PDF
MySQL/MariaDB Proxy Software Test
PDF
New features in ProxySQL 2.0 (updated to 2.0.9) by Rene Cannao (ProxySQL)
PPTX
개발자도 알아야 하는 DBMS튜닝
PPTX
Optimizing Performance in Rust for Low-Latency Database Drivers
PPTX
MySQL8.0_performance_schema.pptx
PPTX
Introduction to Storm
PDF
Intro to HBase
PDF
PostgreSQL Deep Internal
ProxySQL High Availability (Clustering)
CockroachDB
Apache Cassandra and DataStax Enterprise Explained with Peter Halliday at Wil...
MariaDB MaxScale monitor 매뉴얼
MySQL 상태 메시지 분석 및 활용
MariaDB MaxScale
mongodb와 mysql의 CRUD 연산의 성능 비교
MongoDB WiredTiger Internals
MySQL Administrator 2021 - 네오클로바
Kubernetes & helm 활용
PostgreSQL: Advanced indexing
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docx
MySQL/MariaDB Proxy Software Test
New features in ProxySQL 2.0 (updated to 2.0.9) by Rene Cannao (ProxySQL)
개발자도 알아야 하는 DBMS튜닝
Optimizing Performance in Rust for Low-Latency Database Drivers
MySQL8.0_performance_schema.pptx
Introduction to Storm
Intro to HBase
PostgreSQL Deep Internal
Ad

Similar to Mongo db 최범균 (20)

PDF
The MongoDB Strikes Back / MongoDB 의 역습
PDF
Mongo db 시작하기
PDF
[스마트스터디]MongoDB 의 역습
PDF
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&amp;c)
PDF
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
PDF
MongoDB 하루만에 끝내기
PPTX
Node.js DBMS short summary
PDF
Mongo db로 배우는 nosql
PDF
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
PDF
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
PPTX
Mongodb and spatial
PPTX
몽고디비교육1일차
PDF
MongoDB 신제품 및 신기능 소개
PDF
Introduction to mongo db
PDF
Mongo db intro &amp; tips
PPTX
Mongo DB로 진행하는 CRUD
PDF
MongoDB 도입을 위한 제언
PDF
MongoDB 도입을 위한 제언 @krmug
PPTX
CouchDB - Introduction - Korean
PDF
MongoDB in use(김인범, mongodb korea)
The MongoDB Strikes Back / MongoDB 의 역습
Mongo db 시작하기
[스마트스터디]MongoDB 의 역습
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&amp;c)
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
MongoDB 하루만에 끝내기
Node.js DBMS short summary
Mongo db로 배우는 nosql
[스마트스터디]모바일 애플리케이션 서비스에서의 로그 수집과 분석
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
Mongodb and spatial
몽고디비교육1일차
MongoDB 신제품 및 신기능 소개
Introduction to mongo db
Mongo db intro &amp; tips
Mongo DB로 진행하는 CRUD
MongoDB 도입을 위한 제언
MongoDB 도입을 위한 제언 @krmug
CouchDB - Introduction - Korean
MongoDB in use(김인범, mongodb korea)
Ad

More from beom kyun choi (20)

PDF
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
PDF
DDD로 복잡함 다루기
PDF
TDD 발담그기 @ 공감세미나
PDF
keras 빨리 훑어보기(intro)
PDF
DDD 준비 서문래
PDF
Tensorflow regression 텐서플로우 회귀
PDF
Ddd start 부록 지앤선&ksug
PDF
MVP 패턴 소개
PPTX
파이썬 언어 기초
PDF
도메인구현 KSUG 20151128
PDF
Event source 학습 내용 공유
PDF
Spring Boot 소개
PDF
모델링 연습 리뷰
PDF
ALS WS에 대한 이해 자료
PDF
Ji 개발 리뷰 (신림프로그래머)
PDF
리뷰의 기술 소개
PDF
스프링 시큐리티 구조 이해
PDF
자바8 스트림 API 소개
PDF
자바8 람다식 소개
PDF
Zookeeper 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
DDD로 복잡함 다루기
TDD 발담그기 @ 공감세미나
keras 빨리 훑어보기(intro)
DDD 준비 서문래
Tensorflow regression 텐서플로우 회귀
Ddd start 부록 지앤선&ksug
MVP 패턴 소개
파이썬 언어 기초
도메인구현 KSUG 20151128
Event source 학습 내용 공유
Spring Boot 소개
모델링 연습 리뷰
ALS WS에 대한 이해 자료
Ji 개발 리뷰 (신림프로그래머)
리뷰의 기술 소개
스프링 시큐리티 구조 이해
자바8 스트림 API 소개
자바8 람다식 소개
Zookeeper 소개

Mongo db 최범균

  • 1. MongoDB 소개최 범 균 (madvirus@madvirus.net)
  • 4. 4NoSQL 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 maynot require fixed table schemas, usually avoid join operations and typically scale horizontally.- WIKIPEDIA
  • 5. NoSQL주요 특징schema-freereplication간단한 APIno relation / no joineventually consistency (not ACID)scalable / distributedNoSQL의 종류Document storeMongoDB, CouchDB, Jackrabbit, Lotus NotesKey/Value storeAmazon SimpleDB, MemcacheDB, …Column 기반Hadoop/HBase, Cassandra, Hypertable, …Graph DBNeo4j, HyperGraphDB, …5
  • 6. 오늘의 주제: MongoDB세미나의 목적MongoDB의 주요 기능 & 활용 방안 소개TOCDocument DB와 MongoDB왜 MongoDB?MongoDB 쓰임새6
  • 7. Document DB & MongoDB7
  • 11. Document DB문서 저장소주요 특징<key, value> 형식으로 문서 저장대부분 JSON 형식 이용No JoinSchema FreeNo SQL싼 장비, 대량 데이터, HA (replication), 분산 처리주요 제품MongoDB, CouchDB, Riak, ...11
  • 12. Document 예시{ ts : “20100415110001.001”, user : { nickname: “madvirus”, id: 12345 }, site : { domain: “cc2.wemade.com”, uri: “/main/main” }}{ ts : “20100415110001.005”, user : { nickname: “wemade”, id: 1 }, site : { domain: “cc2.wemade.com”, uri: “/main/main” }, referer: { domain: “www.wemade.com”, uri: “/main/main” }}12
  • 13. MongoDBhumongous DB현재 버전:1.4.0특징Document-oriented storageindex 지원geospacial 인덱스 지원, multikey빠른 업데이트 (no row lock, no table block)ReplicationSharding (alpha)MapReduce바이너리 데이터에 대한 효과적인 저장파일, 이미지 등쉬운 설치, 압축만 풀면 땡!언어별 드라이버 제공공식 지원: C, C++, Java, Perl, PHP, Python, Ruby커뮤니티 지원: C#/.NET, Erlang, Go, Groovy/Scala/Clojure13
  • 14. MongoDB 레퍼런스피딩 시스템의 캐시내부 리포팅 어플리케이션프론트 페이지, 프로젝트의백엔드 스토리지댓글 시스템의 백엔드 스토리지사이트 데이터, 포스트, 댓글, 이미지 스토리지서버 모니터링 솔루션실시간 로그 처리&분석14
  • 16. MongoDB의 구성요소 - Collection, DocumentDatabaseCollectionRDBMS의 Table과 유사Document를 포함DocumentRDBMS의 Row와 유사Schema Free문서마다 고유 키 값을 가짐 (“_id”)지정하지 않을 경우 mongoDB가 자동 생성16
  • 17. 설치 및 실행http://www.mongodb.org 에서 다운로드서버 시작기본DB경로: /data/db (c:\data\db), 포트: 27017서버 중지mongo 콘솔 접속후 shutdownServer() 실행Ctrl+C, kill -2 PID, kill -15 PIDkill -9 PID 사용시 데이터 깨질 수 있음$ mongod$ mongod --dbpath /wemade/db --port 90912$ mongod –fork –logpath /wemade/log/db/mongodb.log$ mongo> db.shutdownServer()17
  • 18. 콘솔을 이용한 접근bin/mongo 콘솔 프로그램 이용자바스크립트 코드를 이용$ mongo> use weblogswitched to db weblog> db.pageview_minute.find();{ "_id" : ObjectId("4bbc35128319000000001984"), "hour" : "201004071632", "pageviews" : 4000, "site" : "funpc.wemade.com" }{ "_id" : ObjectId("4bbc355d8319000000001985"), "hour" : "201004071633", "pageviews" : 601, "site" : "funpc.wemade.com" }{ "_id" : ObjectId("4bbc35688319000000001986"), "hour" : "201004071634", "pageviews" : 3194, "site" : "funpc.wemade.com" }{ "_id" : ObjectId("4bbc35a48319000000001987"), "hour" : "201004071635", "pageviews" : 3210, "site" : "funpc.wemade.com" }{ "_id" : ObjectId("4bbc35e08319000000001988"), "hour" : "201004071636", "pageviews" : 2142, "site" : "funpc.wemade.com" }{ "_id" : ObjectId("4bbc361c8319000000001989"), "hour" : "201004071637", "pageviews" : 853, "site" : "funpc.wemade.com" }{ "_id" : ObjectId("4bbc3740831900000000198a"), "hour" : "201004071641", "pageviews" : 1026, "site" : "funpc.wemade.com" }{ "_id" : ObjectId("4bbc3748831900000000198b"), "hour" : "201004071642", "pageviews" : 7979, "site" : "funpc.wemade.com" }{ "_id" : ObjectId("4bbc3784831900000000198c"), "hour" : "201004071643", "pageviews" : 995, "site" : "funpc.wemade.com" }>18
  • 19. 드라이버를 이용한 접근각 언어별로 제공되는 드라이버 이용Mongo mongo = new Mongo("localhost", 27017);DB db = mongo.getDB("weblog");DBCollection collection = db.getCollection("pageview_minute");BasicDBObject q = new BasicDBObject();SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmm");q.put("hour", format.format(time));q.put("site", site);BasicDBObject o = new BasicDBObject();BasicDBObject incVal = new BasicDBObject();incVal.put("pageviews", new Integer(1));o.put("$inc", incVal);collection.update(q, o, true, true);19
  • 20. DB/콜렉션 생성/삭제Lazy Creation실제 데이터가 생성될 때 DB/콜렉션 생성됨명시적인 DB/콜렉션 생성 없음콜렉션 삭제db.collName.drop()20
  • 21. 문서 관련 기본 API문서 삽입db.collName.save( {name: “mongo”} );문서 조회db.collName.find()db.collName.find( {name: “mongo”} )db.collName.find( {…}, {name: 1, ssn: 1} )db.collName.find( … ).sort( {userid: 1} )db.collName.find( {}, {}, 10, 20);db.collName.count()문서 수정db.collName.update( {userid: “madvirus”}, { lastupts: val}, false );문서 삭제db.collName.remove( {} )db.collName.remove( {userid: “madvirus”} )인덱스 생성db.collectionName.ensureIndex( {userid: 1, regts: 1} )기타group(), min(), max(), $in, $where (or 연산), 21
  • 23. MongoDB가 끌린 이유ReplicationShardingMapReduceAtomic 값 증분Capped CollectionGeospacial Index23
  • 24. Master-SlaveReplication서버 간 Replication 지원High Availability (Failover)Read Throughput 증대구성Replica PairMaster24
  • 25. Sharding하나의 개념적 문서 집합을 다수의 물리적 저장소에 분할해서 보관MongoDB는 인덱스 범위를 이용해서 보관ShardShardShardShardChunkChunkChunkChunkmongosconfig serverClient25
  • 26. MapReduce 지원MapReduceGoogle이 창안 대량의 데이터 집합을 많은 컴퓨터로 병렬 처리2단계 처리Map단계 /Reduce 단계응용데이터 클러스터링 연산Collective Intelligence웹 로그 통계 생성데이터 추출/필터링상상하는 만큼 …26
  • 27. MapReduce 동작 방식27발췌: http://www.slideshare.net/spirosd/mapreduce-distributed-computing-on-large-commodity-clusters
  • 28. MapReduce 예태그 개수 구하기{tags: [‘dog’, ‘cat’] }{tags: [‘cat’] }{tags: [‘mouse’, ‘cat’, ‘dog’] }{tags: [] }map = function() { this.tags.forEach( function(tag) { emit( tag, 1 ); } );};{‘dog’: [1, 1] }{‘cat’: [1, 1, 1] }{‘mouse’: [1] }reduce = function( key , values ){ var total = 0; for ( var i=0; i < values.length ; i++ ) { total += values[i]; } return total;};{ "_id" : "cat", "value" : 3 }{ "_id" : "dog", "value" : 2 }{ "_id" : "mouse", "value" : 1 }28
  • 29. MapReduce + Sharding각 Shard를 통해 데이터 처리 및 수집 클러스터를 이용한 대량 데이터 처리Shard 별 분산∙병렬 처리를 통한 처리 시간 단축/처리량 증가대량 데이터 분석/생성에 적합ShardMapReduce 실행각 Shard에MapReduce 실행 요청ShardMapReduce 실행 요청MapReduce 실행mongosClientShard각 Shard의Reduce 결과MapReduce 실행각 Shard의Reduce 결과의Reduce 결과ShardMapReduce 실행29
  • 30. Atomic 값 증분upsert와 $inc를 이용한 Atomic 값 증분실시간 통계 데이터 생성에 적합시간 당 접속자, 10분당 PV, 분당 회원 가입 수c.update( { hour : "20100415100001”, site : "abc" }, { $inc : { pageviews: 1} }, { upsert : true } )c.update( { hour : "20100415100001”, site : "abc" }, { $inc : { pageviews: 1} }, { upsert : true } )c.update( { hour : "20100415100001”, site : "abc" }, { $inc : { pageviews: 1} }, { upsert : true } )c.update( { hour : "20100415100002”, site : "abc" }, { $inc : { pageviews: 1} }, { upsert : true } )데이터 삽입{hour: “2010041510001”, site: “abc”, pageviews: 1 }pageviews 값 증가{hour: “2010041510001”, site: “abc”, pageviews: 2 }pageviews 값 증가{hour: “2010041510001”, site: “abc”, pageviews: 3 }데이터 삽입{hour: “2010041510002”, site: “abc”, pageviews: 1 }30
  • 31. Capped Collection개수 제한을 갖는 콜렉션생성db.createCollection(“mycoll”, {capped: true, size: 1000, max: 100})동작 방식지정된 개수만큼 차면, 새 문서를 추가 시 가장 오래된 문서 삭제삽입 순서로 인덱스 자동 생성제약기존 문서 수정시, 기존 문서보다 클 경우 수정 실패문서 삭제 불가32bit 머신에서 10억 바이트 (약 950M) 크기 제한64bit 머신은 시스템 자원만큼활용캐시LRU 캐시와 유사한 효과로깅인덱스 없는 경우 파일시스템에 근접한 쓰기 속도31
  • 33. Geospacial Index좌표를 이용한 인덱스 생성db.position.ensureIndex( {loc: “2d”}, {min: -500, max: 500} ){ loc: [30, 30] }, {loc: {x: 50, y: 30} }쿼리근처에 있는 것 검색 (거리 기준)db.place.find( {loc : {$near: {x:50, y:30} } } )db.place.find( {loc : {$near: {x:50, y:30} } } ).limit(3)영역 안에 포함된 것 검색db.place.find( {loc: {$within : {$box: [[0,0],[10,10]] } } } );db.place.find( {loc: {$within : {$center: [ [50, 50], 20 ] } } } );복합 인덱스근처에 있는 자원 검색db.place.ensureIndex( {loc: “2d”, cat: 1} )db.place.find( {loc: {$near: [10,10] }, cat: “bank” } ).limit(10)응용위치(맵) 기반 연산 (웹 게임 등에서 활용)데이터 클러스터링에서의 활용33
  • 35. MongoDB의 쓰임새적합한 용도웹 App 백엔드 스토리지세션 데이터회원 프로필, 이벤트, 댓글, 설문조사 등실시간 분석Atomic Inc을 이용한 실시간 통계 (실시간 분당/시간당 PV)대용량 로그 처리 & 분석Sharding & MapReduce 기반 대용량 로그 분석/데이터 처리캐시<key, value>, Schema Free 특징으로 캐시 구현 적합Capped Collection좌표 기반 데이터 처리알맞지 않은 용도트랜잭션이 중요한 시스템예, 금융권 시스템, 빌링 시스템, 회원 테이블35
  • 36. 맺으며…NoSQL DB에 대한 관심 필요Document 중심 사고No Relation, No Join, No SQL, Schema FreeMapReduce 이해병렬 처리, no group byRDBMS와 Document DB의 알맞은 사용36
  • 37. 참고자료MapReduceWikipedia:http://en.wikipedia.org/wiki/MapReduceMapReduce:distributed computing on large commodity clusters:http://www.slideshare.net/spirosd/mapreduce-distributed-computing-on-large-commodity-clustersNoSQLNoSQL 정의 : http://en.wikipedia.org/wiki/NoSQLMongoDB 관련 문서MongoDB 매뉴얼: http://www.mongodb.org/display/DOCS/Developer+ZoneFast Updates with MongoDB:http://blog.mongodb.org/post/248614779/fast-updates-with-mongodb-update-in-placeMongoDB is Fatastic for Logging: http://blog.mongodb.org/post/172254834/mongodb-is-fantastic-for-loggingUsing MongoDB for Real-time Analytics:http://blog.mongodb.org/post/171353301/using-mongodb-for-real-time-analytics37
  • 38. Q&A38