38
MongoDB 소소 최 최 최 ([email protected])

Mongo db 최범균

Embed Size (px)

Citation preview

Page 1: Mongo db 최범균

MongoDB 소개최 범 균 ([email protected])

Page 2: Mongo db 최범균

2

공통점 ?

Page 3: Mongo db 최범균

3

NoSQL

Page 4: Mongo db 최범균

4

NoSQL 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

Page 5: Mongo db 최범균

5

NoSQL

• 주요 특징– schema-free– replication– 간단한 API– no relation / no join– eventually consistency (not ACID)– scalable / distributed

• NoSQL 의 종류– Document store

• MongoDB, CouchDB, Jackrabbit, Lotus Notes

– Key/Value store• Amazon SimpleDB, MemcacheDB, …

– Column 기반• Hadoop/HBase, Cassandra, Hypertable, …

– Graph DB• Neo4j, HyperGraphDB, …

Page 6: Mongo db 최범균

6

오늘의 주제 : MongoDB

• 세미나의 목적– MongoDB 의 주요 기능 & 활용 방안 소개

• TOC– Document DB 와 MongoDB– 왜 MongoDB?– MongoDB 쓰임새

Page 7: Mongo db 최범균

7

Document DB & MongoDB

Page 8: Mongo db 최범균

8

Document

Page 9: Mongo db 최범균

9

Document: Self-Contained

Page 10: Mongo db 최범균

10

Document: Schema Free

Page 11: Mongo db 최범균

11

Document DB

• 문서 저장소

• 주요 특징– <key, value> 형식으로 문서 저장

• 대부분 JSON 형식 이용– No Join– Schema Free– No SQL

• 싼 장비 , 대량 데이터 , HA (replication), 분산 처리

• 주요 제품– MongoDB, CouchDB, Riak, ...

Page 12: Mongo db 최범균

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” }}

Page 13: Mongo db 최범균

13

MongoDB

• humongous DB– 현재 버전 : 1.4.0

• 특징– Document-oriented storage– index 지원

• geospacial 인덱스 지원 , multikey

– 빠른 업데이트 (no row lock, no table block)– Replication– Sharding (alpha)– MapReduce– 바이너리 데이터에 대한 효과적인 저장

• 파일 , 이미지 등– 쉬운 설치 , 압축만 풀면 땡 !– 언어별 드라이버 제공

• 공식 지원 : C, C++, Java, Perl, PHP, Python, Ruby• 커뮤니티 지원 : C#/.NET, Erlang, Go, Groovy/Scala/Clojure

Page 14: Mongo db 최범균

14

MongoDB 레퍼런스

내부 리포팅 어플리케이션

프론트 페이지 , 프로젝트의백엔드 스토리지

서버 모니터링 솔루션 사이트 데이터 , 포스트 , 댓글 , 이미지 스토리지

댓글 시스템의 백엔드 스토리지

피딩 시스템의 캐시

실시간 로그 처리 & 분석

Page 15: Mongo db 최범균

15

mongoDB 사용

Page 16: Mongo db 최범균

16

MongoDB 의 구성요소 - Collection, Document

• Database

• Collection– RDBMS 의 Table 과 유사– Document 를 포함

• Document– RDBMS 의 Row 와 유사– Schema Free– 문서마다 고유 키 값을 가짐 (“_id”)

• 지정하지 않을 경우 mongoDB 가 자동 생성

Page 17: Mongo db 최범균

17

설치 및 실행

• http://www.mongodb.org 에서 다운로드• 서버 시작

– 기본 DB 경로 : /data/db (c:\data\db), 포트 : 27017

• 서버 중지– mongo 콘솔 접속후 shutdownServer() 실행

– Ctrl+C, kill -2 PID, kill -15 PID• kill -9 PID 사용시 데이터 깨질 수 있음

$ mongod$ mongod --dbpath /wemade/db --port 90912$ mongod –fork –logpath /wemade/log/db/mongodb.log

$ mongo> db.shutdownServer()

Page 18: Mongo db 최범균

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" }

>

Page 19: Mongo db 최범균

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);

Page 20: Mongo db 최범균

20

DB/ 콜렉션 생성 / 삭제

• Lazy Creation– 실제 데이터가 생성될 때 DB/ 콜렉션 생성됨

• 명시적인 DB/ 콜렉션 생성 없음

• 콜렉션 삭제– db.collName.drop()

Page 21: Mongo db 최범균

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 연산 ),

Page 22: Mongo db 최범균

22

왜 끌렸나 ?

Page 23: Mongo db 최범균

23

MongoDB 가 끌린 이유

• Replication• Sharding• MapReduce• Atomic 값 증분• Capped Collection• Geospacial Index

Page 24: Mongo db 최범균

24

Master-Slave

Replication

• 서버 간 Replication 지원– High Availability (Failover)– Read Throughput 증대

• 구성

Master

Replica Pair

Page 25: Mongo db 최범균

25

Sharding

• 하나의 개념적 문서 집합을 다수의 물리적 저장소에 분할해서 보관– MongoDB 는 인덱스 범위를 이용해서 보관

Shard

Chunk

Shard

Chunk

Shard

Chunk

Shard

Chunk

mongosconfig server

Client

Page 26: Mongo db 최범균

26

MapReduce 지원

• MapReduce– Google 이 창안 – 대량의 데이터 집합을 많은 컴퓨터로 병렬 처리

• 2 단계 처리– Map 단계 / Reduce 단계

• 응용– 데이터 클러스터링 연산

• Collective Intelligence

– 웹 로그 통계 생성– 데이터 추출 / 필터링– 상상하는 만큼 …

Page 27: Mongo db 최범균

27

MapReduce 동작 방식

발췌 : http://www.slideshare.net/spirosd/mapreduce-distributed-computing-on-large-commodity-clus-ters

Page 28: Mongo db 최범균

28

MapReduce 예

• 태그 개수 구하기{tags: [‘dog’, ‘cat’] }{tags: [‘cat’] }{tags: [‘mouse’, ‘cat’, ‘dog’] }{tags: [] }

{‘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.forEach( 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;};

Page 29: Mongo db 최범균

29

MapReduce + Sharding

• 각 Shard 를 통해 데이터 처리 및 수집 – 클러스터를 이용한 대량 데이터 처리

• Shard 별 분산 병렬 처리를 통한 처리 시간 단축∙ / 처리량 증가– 대량 데이터 분석 / 생성에 적합

mongos

Shard

Shard

Shard

Shard

MapReduce 실행

MapReduce 실행

MapReduce 실행

MapReduce 실행

Client

MapReduce 실행 요청

각 Shard 에MapReduce 실행 요청

각 Shard 의Reduce 결과

각 Shard 의Reduce 결과의Reduce 결과

Page 30: Mongo db 최범균

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 }

Page 31: Mongo db 최범균

31

Capped Collection

• 개수 제한을 갖는 콜렉션• 생성

– db.createCollection(“mycoll”, {capped: true, size: 1000, max: 100})

• 동작 방식– 지정된 개수만큼 차면 , 새 문서를 추가 시 가장 오래된 문서 삭제– 삽입 순서로 인덱스 자동 생성

• 제약– 기존 문서 수정시 , 기존 문서보다 클 경우 수정 실패– 문서 삭제 불가– 32bit 머신에서 10 억 바이트 ( 약 950M) 크기 제한

• 64bit 머신은 시스템 자원만큼• 활용

– 캐시• LRU 캐시와 유사한 효과

– 로깅• 인덱스 없는 경우 파일시스템에 근접한 쓰기 속도

Page 32: Mongo db 최범균

32

Geospacial Index

• 2D 기반의 인덱스

Page 33: Mongo db 최범균

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)

• 응용– 위치 ( 맵 ) 기반 연산 ( 웹 게임 등에서 활용 )– 데이터 클러스터링에서의 활용

Page 34: Mongo db 최범균

34

정리

Page 35: Mongo db 최범균

35

MongoDB 의 쓰임새

• 적합한 용도– 웹 App 백엔드 스토리지

• 세션 데이터• 회원 프로필 , 이벤트 , 댓글 , 설문조사 등

– 실시간 분석• Atomic Inc 을 이용한 실시간 통계 ( 실시간 분당 / 시간당 PV)

– 대용량 로그 처리 & 분석• Sharding & MapReduce 기반 대용량 로그 분석 / 데이터 처리

– 캐시• <key, value>, Schema Free 특징으로 캐시 구현 적합• Capped Collection

– 좌표 기반 데이터 처리

• 알맞지 않은 용도– 트랜잭션이 중요한 시스템

• 예 , 금융권 시스템 , 빌링 시스템 , 회원 테이블

Page 36: Mongo db 최범균

36

맺으며…

• NoSQL DB 에 대한 관심 필요

• Document 중심 사고– No Relation, No Join, No SQL, Schema Free

• MapReduce 이해– 병렬 처리 , no group by

• RDBMS 와 Document DB 의 알맞은 사용

Page 37: Mongo db 최범균

37

참고자료

• MapReduce– Wikipedia:

http://en.wikipedia.org/wiki/MapReduce– MapReduce:distributed computing on large commodity clusters:

http://www.slideshare.net/spirosd/mapreduce-distributed-computing-on-large-commodity-clusters

• NoSQL– NoSQL 정의 : http://en.wikipedia.org/wiki/NoSQL

• MongoDB 관련 문서– MongoDB 매뉴얼 :

http://www.mongodb.org/display/DOCS/Developer+Zone– Fast Updates with MongoDB:

http://blog.mongodb.org/post/248614779/fast-updates-with-mongodb-update-in-place

– MongoDB is Fatastic for Logging: http://blog.mongodb.org/post/172254834/mongodb-is-fantastic-for-logging

– Using MongoDB for Real-time Analytics:– http://blog.mongodb.org/post/171353301/using-mongodb-for-real-time-

analytics

Page 38: Mongo db 최범균

38

Q&A