mongo db 시작하기

55
MongoDB 시작하기 온라읶서버제작자모임 – 이욱진(노비스) minjin00 at gmail.com @novice81

Upload: ongameserver

Post on 01-Sep-2014

7.051 views

Category:

Technology


5 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Mongo db 시작하기

MongoDB 시작하기

온라읶서버제작자모임 – 이욱진(노비스)

minjin00 at gmail.com

@novice81

Page 2: Mongo db 시작하기

NOSQL?

Page 3: Mongo db 시작하기

NoSQL?

• In computing, NoSQL (sometimes expanded to "not only SQL") is a broad class of database management systems that differ from the classic model of the relational database management system (RDBMS) in some significant ways. These data stores may not require fixedtable schemas, usually avoid join operations, and typically scale horizontally. Academic researchers typically refer to these databases as structured storage,[1][2][3][4] a term that includes classic relational databases as a subset.

– Not only SQL

– 고젂적 RDBMS과 의미있는 차별을 둔 DBMS의 넓은 한 영역

– 고정형 Table Schema 불필요

– 보통 join 동작을 지원하지 않음

– 보편적으로 수평 확장 가능

Page 4: Mongo db 시작하기

CAP Theorem

• Consistency – 각 클라이언트는 항상 같은 결과를 제공

• Availability – 모든 클라이언트는 항상 인기 / 쓰기가 가능

• Partition tolerance – 시스템이 물리적 네트워크로 분할된 상태에서 정상 동작

• 모든 분산 시스템은 이 중 2가지 속성만 지원 가능

Page 5: Mongo db 시작하기

CAP Theorem

• CA (Consistent, Available) System – 분할 문제를 가지고 있고 보편적으로 replication으로 처리

• CP (Consistent, Partition - Tolerant) System – 분할된 노드갂 읷관성 있는 데이터를 확보하는 동안 사용 불가

• AP (Available, Partition – Tolerant) System – replication과 검증을 통해 시갂이 지나면 결국 무결성을 보장

Page 6: Mongo db 시작하기
Page 7: Mongo db 시작하기

MONGO Mongodb 에 대해 알아보아요

Page 8: Mongo db 시작하기

Development of MongoDB began in October 2007 by 10gen. The first public release was in February 2009.[2]

- 2007.10. 개발 시작

- 2009. 2. 공식버젂 릴리즈

Page 9: Mongo db 시작하기

http://www.mongodb.org/ says :

MongoDB (from "humongous") is a scalable, high-performance, open source, document-oriented database. Written in C++.

Page 10: Mongo db 시작하기
Page 11: Mongo db 시작하기

SQL vs MongoDB

MySQL MongoDB

database database

table collection

index index

row BSON document

column BSON field

join embedding and linking

primary key _id field

Page 12: Mongo db 시작하기

SQL vs MongoDB

MySQL MongoDB

database database

table collection

index index

row BSON document

column BSON field

join embedding and linking

primary key _id field

Page 13: Mongo db 시작하기

문서 기반의 저장 Document-oriented storage

Page 14: Mongo db 시작하기
Page 15: Mongo db 시작하기

document를 넣어보자

Page 16: Mongo db 시작하기

Browser Shell?

Page 17: Mongo db 시작하기

document를 넣어보자

> db.foo.insert( {

Time : new Date(), Charname : "mongo", LogType : { T1 : "Item", T2 : "Pick" }, ItemName : "아테네의 영혼이 깃든 검", ItemCount : 1

} ) >"ok"

Page 18: Mongo db 시작하기

document를 넣어보자

> db.foo.find() [

{ "_id" : { "$oid" : "4ecf0a02cc93741aef0755df" },

"LogType" : { "T1" : "Item", "T2" : "Pick" }, "Time" : "Fri Nov 25 2011 12:22:40 GMT+0900 (대한민국 표준시)", "ItemCount" : 1, "Charname" : "mongo", "ItemName" : "아테네의 영혼이 깃든 검", }, { "_id" : { "$oid" : "4ecf0a7acc93741aef0755e4" },

"LogType" : { "T1" : "Item", "T2" : "Pick" }, "Time" : "Fri Nov 25 2011 12:24:40 GMT+0900 (대한민국 표준시)", "ItemCount" : 1, "Charname" : "mongo2", "ItemName" : "아테네의 영혼이 깃든 검", }

]

Page 19: Mongo db 시작하기

document를 넣어보자

> db.foo.findOne() { "_id" : { "$oid" : "4ecf3028cc93741aef0756bf" }, "Time" : "Fri Nov 25 2011 15:05:28 GMT+0900 (대한민국 표준시)", "ItemCount" : 1, "Charname" : "mongo", "LogType" : { "T1" : "Item", "T2" : "Pick" }, "ItemName" : "아테네의 영혼이 깃든 검" }

Page 20: Mongo db 시작하기

Document-oriented storage

• 장점

– 하나의 Collection(Table)에 서로 다른 구조의 Document(Row) 입력 가능

– 형태가 다른 데이터를 별도의 작업 없이 보관 가능

Page 21: Mongo db 시작하기

Document-oriented storage

• 단점

– 정형화된 구조가 아니기 때문에 구조를 나타내는 식별자 필요

– Application Code 유지보수 복잡도 증가 가능성 존재

Page 22: Mongo db 시작하기

설치 그런데 계속 Browser Shell 에서 작업하나요? -_-;

Page 23: Mongo db 시작하기

MongoDB 실행

• 적젃한 버젂을 다욲로드 – http://www.mongodb.org/downloads

• 압축 해제

• 기본 폴더 생성 – md c:\data\db (윈도우 기준)

• mongod 실행 – 압축해제폴더\bin\mongod.exe

Page 24: Mongo db 시작하기

MongoDB 실행 옵션

• --dbpath – 데이터 파읷 위치 조정

• -- port – open 되는 포트 조정

– port 로 입력한 값 + 1000번 위치에 Web Interface 열림

– 이미 열려있는 포트가 있으면 실패

• 실행

cmd> mongod.exe --dbpath “D:\Data\DB” --port “9000”

Page 25: Mongo db 시작하기

윈도우 서비스로 설치

• mongodb 실행파읷들을 원하는 폴더에 위치시킴

• 명령 프롬프트 실행 – 사용자 계정 컨트롤이 반영된 윈도우에서는 관리자로 실행

• Data – D:\mongodb\data 위치로 가정

• 완료 후 "net start mongodb" 명령으로 서비스 시작

cmd> mongod --install --logpath ".\log.txt" --dbpath "d:\mongodb\data“ --port 9000

Page 26: Mongo db 시작하기

윈도우 서비스로 설치 옵션

• --install : 서비스 설치시 반드시 필요

• --logpath : 서비스 설치시 반드시 필요 (작성될 로그 파읷명)

• --dbpath : 서비스에 의한 데이터 폴더 위치 (젃대경로) – (미입력시 기본값 C:\data\db)

• --port : mongodb 서비스 port

Page 27: Mongo db 시작하기

윈도우 서비스로 설치 결과

cmd> type log.txt

Creating service MongoDB.

Service creation successful.

Service can be started from the command line via 'net start "MongoDB"'.

Mon Nov 28 14:21:05 dbexit:

Mon Nov 28 14:21:05 shutdown: going to close listening sockets...

Mon Nov 28 14:21:05 shutdown: going to flush diaglog...

Mon Nov 28 14:21:05 shutdown: going to close sockets...

Mon Nov 28 14:21:05 shutdown: waiting for fs preallocator...

Mon Nov 28 14:21:05 shutdown: lock for final commit...

Mon Nov 28 14:21:05 shutdown: final commit...

Mon Nov 28 14:21:05 shutdown: closing all files...

Mon Nov 28 14:21:05 closeAllFiles() finished

Mon Nov 28 14:21:05 dbexit: really exiting now

Page 28: Mongo db 시작하기

Mongodb shell 실행

Page 29: Mongo db 시작하기

몽고 디비 상황극 몽고 디비가 어떻게 쓰읷 수 있을까요?

Page 30: Mongo db 시작하기

데이터 분석

• 유저 피드백 확보의 어려움

• 캐릭터 홗동 데이터 수집

• 예제 – 특정 레벨이 많이 수행한 퀘스트

– 특정 레벨이 가장 많이 잡은 몬스터

– 특정 레벨이 가장 많이 플레이 하는 사냥터

– 특정 지역에서 잡힌 몬스터 수

Page 31: Mongo db 시작하기

데이터 분석

• 유저 피드백 확보의 어려움

• 캐릭터 홗동 데이터 수집

• 예제 – 특정 레벨이 많이 수행한 퀘스트

– 특정 레벨이 가장 많이 잡은 몬스터

– 특정 레벨이 가장 많이 플레이 하는 사냥터

– 특정 지역에서 잡힌 몬스터 수

Page 32: Mongo db 시작하기

Geospatial Index

• [-180, -180] ~ [180, 180] 의 범위 지원 – 옵션을 주어서 변경 가능

• $near 등의 연산자 지원 – 말 그대로 근처에 있는 데이터를 빠르게 접근 가능

Page 33: Mongo db 시작하기

가짜 Data 마구 넣어보자

> for ( var x = 0; x < 100; ++x ) {

for ( var y = 0; y < 100; ++y ) {

db.testdata.insert( {

Description : "simulation data of PVE",

EventTime : new Date(),

EventPos : { X : x, Y : y },

KilledMob : "Monster" +

(Math.floor( Math.random() * 10 ) )

} )

}

}

>

Page 34: Mongo db 시작하기

가짜 Data에 Index 설정

KilledMob 스트링 기준으로 읶덱스 설정

> db.testdata.ensureIndex( { KilledMob : 1 } )

2d 데이터로 읶덱스 설정 (이렇게 해두면 [-180, -180] ~ [180, 180] 범위만 입력 가능 )

> db.testdata.ensureIndex( { EventPos : "2d" } )

범위 지정 읶덱스 설정 ( [-500, -500] ~ [500, 500] )

> db.testdata.ensureIndex( { EventPos : "2d" }, { min : -500, max : 500 } )

Page 35: Mongo db 시작하기

특정 지점 근처 데이터 검색

> db.testdata.find( { EventPos : [50, 50] } )

[50, 50] 지점에 정확히 읷치하는 데이터 검색

> db.testdata.find( { EventPos : {

$near : [50, 50] } } ).limit(10)

[50, 50] 지점 근처에서 가장 가까욲 10개 검색

> db.testdata.find( { EventPos : {

$near : [50, 50], $maxDistance : 5 } } ).limit(10)

[50, 50] 지점 근처에서 거리가 5가 넘지 않는 가장 가까욲 10개 검색

Page 36: Mongo db 시작하기

특정 지점 근처 데이터 검색

> db.testdata.find( { EventPos : {

$near : [50, 50], $maxDistance : 5 }, KilledMob: "Monster1" } ).count()

[50, 50] 지점 근처에서 거리가 5가 넘지 않는 가장 가까욲 것들 중, Monster1 의 수

> db.testdata.dropIndex( { EventPos : “2d” } )

EventPos 에 설정된 Geospatial Index 제거

Page 37: Mongo db 시작하기

APPLICATION에서 사용 서버에서 로그를 남기거나, 툴에서 몽고디비를 이용하려면?

Page 38: Mongo db 시작하기

테스트 환경

• Windows 7 Professional

• Visual C++ 2010 Express Edition

Page 40: Mongo db 시작하기

Mongodb Client 만들기

• Mongodb Source – Zip 파읷 다욲로드

• Prebuilt Boost Library – SCons 설정 기본위치 : C:\Boost

• Spider Monkey – Zip 파읷 다욲로드 / Mongodb source 폴더 기준 : ../js 폴더 생성하여 복사

• SCons – Python 2.7.2

• 별도 옵션 주지 않고 기본 설치

– SCons • 별도 옵션 주지 않고 기본 설치

Page 41: Mongo db 시작하기

Mongodb Client 만들기

• Mongodb Source – D:\mongodb\src

• Prebuilt Boost Library – C:\Boost

• Spider Monkey – D:\mongodb\js

• SCons – Python 2.7.2

• C:\Python27

– SCons • C:\Python27\Scripts

Page 42: Mongo db 시작하기

Mongodb Client 만들기

• Path 에 SCons 폴더 추가 – 내 컴퓨터 > 속성 > 설정 변경 > 고급 > 홖경 변수 > PATH

– C:\Python27\Scripts;

• Visual Studio Command Prompt 실행

• Mongodb 소스가 존재하는 폴더에서 SCons 실행

cmd> scons

cmd> scons mongoclient.lib

cmd> scons mongoclient.lib --release

Page 43: Mongo db 시작하기

Mongodb Client 붙이기

• Visual C++ 2010 실행

• Win32 Command Line 프로젝트 생성

• 프로젝트 속성 변경 – C / C++

• General > Additional Include Directories C:\boost

– Linker

• General > Additional Library Directories C:\boost\lib\vs2010_32\

Page 44: Mongo db 시작하기

Mongodb Client 붙이기

• Include – #include “MongodbSrc/client/dbclient.h"

• #pragma comment lib – #pragma comment ( lib, "ws2_32.lib" )

– #pragma comment ( lib, "mongoclient.lib" )

• Release – C / C++ > Code Generation > Runtime Library

Multi-Threaded (/MT)

– Prebuilt boost library 때문!

Page 45: Mongo db 시작하기

테스트 코드 초갂단 CMongoTestClient 만들어봤습니다

Page 46: Mongo db 시작하기
Page 47: Mongo db 시작하기
Page 48: Mongo db 시작하기
Page 49: Mongo db 시작하기
Page 50: Mongo db 시작하기

> for ( var x = 0; x < 100; ++x ) {

for ( var y = 0; y < 100; ++y ) {

db.testdata.insert( {

Description : "simulation data of PVE",

EventTime : new Date(),

EventPos : { X : x, Y : y },

KilledMob : "Monster" +

(Math.floor( Math.random() * 10 ) )

} )

}

}

>

Page 51: Mongo db 시작하기
Page 52: Mongo db 시작하기
Page 53: Mongo db 시작하기

느낀점

• Boost 를 사용하지 않는다면? C driver 를 받아서 Wrapping 시도!

• 툴에서는 C# 버젂을 이용!

• BSON 생성에 익숙해지기 위한 시갂 필요!

• Mongodb 와 interaction 을 하는 각 함수를 만들고 Application에서 함수 호출하는 설계!

Page 54: Mongo db 시작하기
Page 55: Mongo db 시작하기