Upload
beom-kyun-choi
View
28.030
Download
3
Embed Size (px)
Citation preview
MongoDB 소개최 범 균 ([email protected])
2
공통점 ?
3
NoSQL
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
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, …
6
오늘의 주제 : MongoDB
• 세미나의 목적– MongoDB 의 주요 기능 & 활용 방안 소개
• TOC– Document DB 와 MongoDB– 왜 MongoDB?– MongoDB 쓰임새
7
Document DB & MongoDB
8
Document
9
Document: Self-Contained
10
Document: Schema Free
11
Document DB
• 문서 저장소
• 주요 특징– <key, value> 형식으로 문서 저장
• 대부분 JSON 형식 이용– No Join– Schema Free– No SQL
• 싼 장비 , 대량 데이터 , HA (replication), 분산 처리
• 주요 제품– MongoDB, CouchDB, Riak, ...
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” }}
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
14
MongoDB 레퍼런스
내부 리포팅 어플리케이션
프론트 페이지 , 프로젝트의백엔드 스토리지
서버 모니터링 솔루션 사이트 데이터 , 포스트 , 댓글 , 이미지 스토리지
댓글 시스템의 백엔드 스토리지
피딩 시스템의 캐시
실시간 로그 처리 & 분석
15
mongoDB 사용
16
MongoDB 의 구성요소 - Collection, Document
• Database
• Collection– RDBMS 의 Table 과 유사– Document 를 포함
• Document– RDBMS 의 Row 와 유사– Schema Free– 문서마다 고유 키 값을 가짐 (“_id”)
• 지정하지 않을 경우 mongoDB 가 자동 생성
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()
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" }
>
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);
20
DB/ 콜렉션 생성 / 삭제
• Lazy Creation– 실제 데이터가 생성될 때 DB/ 콜렉션 생성됨
• 명시적인 DB/ 콜렉션 생성 없음
• 콜렉션 삭제– db.collName.drop()
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 연산 ),
22
왜 끌렸나 ?
23
MongoDB 가 끌린 이유
• Replication• Sharding• MapReduce• Atomic 값 증분• Capped Collection• Geospacial Index
24
Master-Slave
Replication
• 서버 간 Replication 지원– High Availability (Failover)– Read Throughput 증대
• 구성
Master
Replica Pair
25
Sharding
• 하나의 개념적 문서 집합을 다수의 물리적 저장소에 분할해서 보관– MongoDB 는 인덱스 범위를 이용해서 보관
Shard
Chunk
Shard
Chunk
Shard
Chunk
Shard
Chunk
mongosconfig server
Client
26
MapReduce 지원
• MapReduce– Google 이 창안 – 대량의 데이터 집합을 많은 컴퓨터로 병렬 처리
• 2 단계 처리– Map 단계 / Reduce 단계
• 응용– 데이터 클러스터링 연산
• Collective Intelligence
– 웹 로그 통계 생성– 데이터 추출 / 필터링– 상상하는 만큼 …
27
MapReduce 동작 방식
발췌 : http://www.slideshare.net/spirosd/mapreduce-distributed-computing-on-large-commodity-clus-ters
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;};
29
MapReduce + Sharding
• 각 Shard 를 통해 데이터 처리 및 수집 – 클러스터를 이용한 대량 데이터 처리
• Shard 별 분산 병렬 처리를 통한 처리 시간 단축∙ / 처리량 증가– 대량 데이터 분석 / 생성에 적합
mongos
Shard
Shard
Shard
Shard
MapReduce 실행
MapReduce 실행
MapReduce 실행
MapReduce 실행
Client
MapReduce 실행 요청
각 Shard 에MapReduce 실행 요청
각 Shard 의Reduce 결과
각 Shard 의Reduce 결과의Reduce 결과
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 }
31
Capped Collection
• 개수 제한을 갖는 콜렉션• 생성
– db.createCollection(“mycoll”, {capped: true, size: 1000, max: 100})
• 동작 방식– 지정된 개수만큼 차면 , 새 문서를 추가 시 가장 오래된 문서 삭제– 삽입 순서로 인덱스 자동 생성
• 제약– 기존 문서 수정시 , 기존 문서보다 클 경우 수정 실패– 문서 삭제 불가– 32bit 머신에서 10 억 바이트 ( 약 950M) 크기 제한
• 64bit 머신은 시스템 자원만큼• 활용
– 캐시• LRU 캐시와 유사한 효과
– 로깅• 인덱스 없는 경우 파일시스템에 근접한 쓰기 속도
32
Geospacial Index
• 2D 기반의 인덱스
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)
• 응용– 위치 ( 맵 ) 기반 연산 ( 웹 게임 등에서 활용 )– 데이터 클러스터링에서의 활용
34
정리
35
MongoDB 의 쓰임새
• 적합한 용도– 웹 App 백엔드 스토리지
• 세션 데이터• 회원 프로필 , 이벤트 , 댓글 , 설문조사 등
– 실시간 분석• Atomic Inc 을 이용한 실시간 통계 ( 실시간 분당 / 시간당 PV)
– 대용량 로그 처리 & 분석• Sharding & MapReduce 기반 대용량 로그 분석 / 데이터 처리
– 캐시• <key, value>, Schema Free 특징으로 캐시 구현 적합• Capped Collection
– 좌표 기반 데이터 처리
• 알맞지 않은 용도– 트랜잭션이 중요한 시스템
• 예 , 금융권 시스템 , 빌링 시스템 , 회원 테이블
36
맺으며…
• NoSQL DB 에 대한 관심 필요
• Document 중심 사고– No Relation, No Join, No SQL, Schema Free
• MapReduce 이해– 병렬 처리 , no group by
• RDBMS 와 Document 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
38
Q&A