Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Mongo db 시작하기

9,125 views

Published on

Published in: Technology

Mongo db 시작하기

  1. 1. MongoDB 시작하기온라읶서버제작자모임 – 이욱진(노비스) minjin00 at gmail.com @novice81
  2. 2. NOSQL?
  3. 3. 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 동작을 지원하지 않음 – 보편적으로 수평 확장 가능
  4. 4. CAP Theorem• Consistency – 각 클라이언트는 항상 같은 결과를 제공• Availability – 모든 클라이언트는 항상 인기 / 쓰기가 가능• Partition tolerance – 시스템이 물리적 네트워크로 분할된 상태에서 정상 동작• 모든 분산 시스템은 이 중 2가지 속성만 지원 가능
  5. 5. CAP Theorem• CA (Consistent, Available) System – 분할 문제를 가지고 있고 보편적으로 replication으로 처리• CP (Consistent, Partition - Tolerant) System – 분할된 노드갂 읷관성 있는 데이터를 확보하는 동안 사용 불가• AP (Available, Partition – Tolerant) System – replication과 검증을 통해 시갂이 지나면 결국 무결성을 보장
  6. 6. MONGOMongodb 에 대해 알아보아요
  7. 7. Development of MongoDB began in October 2007by 10gen. The first public release was in February 2009.[2]- 2007.10. 개발 시작- 2009. 2. 공식버젂 릴리즈
  8. 8. http://www.mongodb.org/ says :MongoDB (from "humongous") is a scalable,high-performance, open source, document-orienteddatabase. Written in C++.
  9. 9. SQL vs MongoDB MySQL MongoDB database database table collection index index row BSON document column BSON field join embedding and linkingprimary key _id field
  10. 10. SQL vs MongoDB MySQL MongoDB database database table collection index index row BSON document column BSON field join embedding and linkingprimary key _id field
  11. 11. 문서 기반의 저장Document-oriented storage
  12. 12. document를 넣어보자
  13. 13. Browser Shell?
  14. 14. document를 넣어보자> db.foo.insert( { Time : new Date(), Charname : "mongo", LogType : { T1 : "Item", T2 : "Pick" }, ItemName : "아테네의 영혼이 깃든 검", ItemCount : 1 })>"ok"
  15. 15. 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" : "아테네의 영혼이 깃든 검", }]
  16. 16. 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" : "아테네의 영혼이 깃든 검"}
  17. 17. Document-oriented storage• 장점 – 하나의 Collection(Table)에 서로 다른 구조의 Document(Row) 입력 가능 – 형태가 다른 데이터를 별도의 작업 없이 보관 가능
  18. 18. Document-oriented storage• 단점 – 정형화된 구조가 아니기 때문에 구조를 나타내는 식별자 필요 – Application Code 유지보수 복잡도 증가 가능성 존재
  19. 19. 설치그런데 계속 Browser Shell 에서 작업하나요? -_-;
  20. 20. MongoDB 실행• 적젃한 버젂을 다욲로드 – http://www.mongodb.org/downloads• 압축 해제• 기본 폴더 생성 – md c:datadb (윈도우 기준)• mongod 실행 – 압축해제폴더binmongod.exe
  21. 21. MongoDB 실행 옵션• --dbpath – 데이터 파읷 위치 조정• -- port – open 되는 포트 조정 – port 로 입력한 값 + 1000번 위치에 Web Interface 열림 – 이미 열려있는 포트가 있으면 실패• 실행 cmd> mongod.exe --dbpath “D:DataDB” --port “9000”
  22. 22. 윈도우 서비스로 설치• mongodb 실행파읷들을 원하는 폴더에 위치시킴• 명령 프롬프트 실행 – 사용자 계정 컨트롤이 반영된 윈도우에서는 관리자로 실행• Data – D:mongodbdata 위치로 가정 cmd> mongod --install --logpath ".log.txt" --dbpath "d:mongodbdata“ --port 9000• 완료 후 "net start mongodb" 명령으로 서비스 시작
  23. 23. 윈도우 서비스로 설치 옵션• --install : 서비스 설치시 반드시 필요• --logpath : 서비스 설치시 반드시 필요 (작성될 로그 파읷명)• --dbpath : 서비스에 의한 데이터 폴더 위치 (젃대경로) – (미입력시 기본값 C:datadb)• --port : mongodb 서비스 port
  24. 24. 윈도우 서비스로 설치 결과cmd> type log.txtCreating 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() finishedMon Nov 28 14:21:05 dbexit: really exiting now
  25. 25. Mongodb shell 실행
  26. 26. 몽고 디비 상황극몽고 디비가 어떻게 쓰읷 수 있을까요?
  27. 27. 데이터 분석• 유저 피드백 확보의 어려움• 캐릭터 홗동 데이터 수집• 예제 – 특정 레벨이 많이 수행한 퀘스트 – 특정 레벨이 가장 많이 잡은 몬스터 – 특정 레벨이 가장 많이 플레이 하는 사냥터 – 특정 지역에서 잡힌 몬스터 수
  28. 28. 데이터 분석• 유저 피드백 확보의 어려움• 캐릭터 홗동 데이터 수집• 예제 – 특정 레벨이 많이 수행한 퀘스트 – 특정 레벨이 가장 많이 잡은 몬스터 – 특정 레벨이 가장 많이 플레이 하는 사냥터 – 특정 지역에서 잡힌 몬스터 수
  29. 29. Geospatial Index• [-180, -180] ~ [180, 180] 의 범위 지원 – 옵션을 주어서 변경 가능• $near 등의 연산자 지원 – 말 그대로 근처에 있는 데이터를 빠르게 접근 가능
  30. 30. 가짜 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 ) ) } ) }}>
  31. 31. 가짜 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 } )
  32. 32. 특정 지점 근처 데이터 검색> 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개 검색
  33. 33. 특정 지점 근처 데이터 검색> db.testdata.find( { EventPos : { $near : [50, 50], $maxDistance : 5 }, KilledMob: "Monster1" } ).count() [50, 50] 지점 근처에서 거리가 5가 넘지 않는 가장 가까욲 것들 중, Monster1 의 수> db.testdata.dropIndex( { EventPos : “2d” } ) EventPos 에 설정된 Geospatial Index 제거
  34. 34. APPLICATION에서 사용서버에서 로그를 남기거나, 툴에서 몽고디비를 이용하려면?
  35. 35. 테스트 환경• Windows 7 Professional• Visual C++ 2010 Express Edition
  36. 36. Mongodb Client 만들기• Mongodb Source – https://github.com/mongodb/mongo• Prebuilt Boost Library – http://www.mongodb.org/pages/viewpageattachments.action?pageId=12157032• Spider Monkey – https://github.com/dwight/vc2010_js• SCons – Python 2.7.2 • http://www.python.org/download/releases/2.7.2/ – SCons • http://sourceforge.net/projects/scons/files/scons/2.1.0/scons-2.1.0.win32.exe/download
  37. 37. Mongodb Client 만들기• Mongodb Source – Zip 파읷 다욲로드• Prebuilt Boost Library – SCons 설정 기본위치 : C:Boost• Spider Monkey – Zip 파읷 다욲로드 / Mongodb source 폴더 기준 : ../js 폴더 생성하여 복사• SCons – Python 2.7.2 • 별도 옵션 주지 않고 기본 설치 – SCons • 별도 옵션 주지 않고 기본 설치
  38. 38. Mongodb Client 만들기• Mongodb Source – D:mongodbsrc• Prebuilt Boost Library – C:Boost• Spider Monkey – D:mongodbjs• SCons – Python 2.7.2 • C:Python27 – SCons • C:Python27Scripts
  39. 39. Mongodb Client 만들기• Path 에 SCons 폴더 추가 – 내 컴퓨터 > 속성 > 설정 변경 > 고급 > 홖경 변수 > PATH – C:Python27Scripts;• Visual Studio Command Prompt 실행• Mongodb 소스가 존재하는 폴더에서 SCons 실행 cmd> scons cmd> scons mongoclient.lib cmd> scons mongoclient.lib --release
  40. 40. Mongodb Client 붙이기• Visual C++ 2010 실행• Win32 Command Line 프로젝트 생성• 프로젝트 속성 변경 – C / C++ • General > Additional Include Directories C:boost – Linker • General > Additional Library Directories C:boostlibvs2010_32
  41. 41. 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 때문!
  42. 42. 테스트 코드초갂단 CMongoTestClient 만들어봤습니다
  43. 43. > 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 ) ) } ) }}>
  44. 44. 느낀점• Boost 를 사용하지 않는다면? C driver 를 받아서 Wrapping 시도!• 툴에서는 C# 버젂을 이용!• BSON 생성에 익숙해지기 위한 시갂 필요!• Mongodb 와 interaction 을 하는 각 함수를 만들고 Application에서 함수 호출하는 설계!

×