Mongo db로 배우는 nosql
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Mongo db로 배우는 nosql

on

  • 4,963 views

 

Statistics

Views

Total Views
4,963
Views on SlideShare
4,847
Embed Views
116

Actions

Likes
7
Downloads
158
Comments
0

4 Embeds 116

http://awesomejude.wordpress.com 111
http://m.blog.naver.com 2
https://awesomejude.wordpress.com 2
http://blog.naver.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Mongo db로 배우는 nosql Presentation Transcript

  • 1. MongoDB로 배우는 NoSQL 채수원 blog.doortts.com doortts@gmail.com
  • 2. 진행목표 - 쉽게 - 학습 시간 단축 - 기초를 닦아서 발판을 마련 - Use ME!!2 MongoDB로배우는NoSQL
  • 3. NoSQL3 MongoDB로배우는NoSQL
  • 4. Think about DATABASE4 MongoDB로배우는NoSQL
  • 5. in recently•  충분히•  필요한 만큼•  적절하게•  잘 살아오고 있었다.1983, DEC microcomputer (128kb ram)5 MongoDB로배우는NoSQL
  • 6. NoSQL •  Not Only SQL •  데이터 스토어 •  비 관계형을 지향 •  대용량 처리를 목표 Q> 구글은 어느 회사 DB를 쓸까? 직접 만들어서 쓰나?6 MongoDB로배우는NoSQL
  • 7. CAP 이론 cap theorem7 MongoDB로배우는NoSQL
  • 8. Tales about… TELEPHONE SECRETARY8 MongoDB로배우는NoSQL
  • 9. Data Models•  Relational•  Key-value•  Column-oriented – Table no joins•  Document-oriented – JSON or XML like, no joins9 MongoDB로배우는NoSQL
  • 10. Consistent, Available (CA) Systems•  전통적인 RDBMS•  Vertica (column-oriented)•  Aster Data (relational)•  Greenplum (relational)10 MongoDB로배우는NoSQL
  • 11. Consistent, Partition-Tolerant (CP) Systems•  BigTable (column-oriented/tabular)•  Hypertable (column-oriented/tabular)•  HBase (column-oriented/tabular)•  MongoDB (document-oriented)•  Redis (key-value)•  MemcacheDB (key-value)•  Berkeley DB (key-value)11 MongoDB로배우는NoSQL
  • 12. Available, Partition-Tolerant (AP) Systems•  Dynamo (key-value) amazon•  Tokyo Cabinet (key-value)•  KAI (key-value)•  Cassandra (column-oriented) facebook p2p•  CouchDB (document-oriented)•  SimpleDB (document-oriented)12 MongoDB로배우는NoSQL
  • 13. 라이선스 및 구현 비교 정리 *출처 : 10gen slide “No SQL, No problem”13 MongoDB로배우는NoSQL
  • 14. 소개14 MongoDB로배우는NoSQL
  • 15. 몽고DB란?•  MongoDB (from "humongous")는 확장가능 하고, 고성능을 지향하는 도큐먼트 기반의 오픈소스 데이터 베이스.•  C++로 작성되었음 by15 MongoDB로배우는NoSQL
  • 16. 특징 •  Document-oriented storage –  JSON 스타일의 documents –  간결하고 강력한 동적 스키마 구성 •  Full Index Support –  어느 속성에나 인덱스 설정 가능 •  Replication & High Availability –  LAN과 WAN을 이용한 미러링16 MongoDB로배우는NoSQL
  • 17. 특징 (계속) •  Auto-Sharding –  기능 손실 없는 수평 확장 •  Querying –  풍부한 문서기반의 쿼리 지원 •  Fast In-Place Updates –  성능문제를 일으키지 않는 정교한 수정 •  Map/Reduce –  유연한 데이터 수집과 처리17 MongoDB로배우는NoSQL
  • 18. 특징 (계속) •  GridFS –  다양한 크기의 파일을 쉽게 저장 •  Commercial Support –  기술 지원 기업이 존재, 교육, 컨설팅 지원 ( but 북미 이야기;;;) •  고성능 •  간편한 관리18 MongoDB로배우는NoSQL
  • 19. 실 습 시작하기19 MongoDB로배우는NoSQL
  • 20. MongoDB 개요 •  데이터의 기본 단위는 Document •  컬렉션은 Document의 집합 •  자바스크립트 쉘 내장 •  스키마가 없다.20 MongoDB로배우는NoSQL
  • 21. Schema •  데이터베이스 스키마는 데이터베이스에서 자료의 구조, 자료의 표현 방법, 자 료 간의 관계를 정의한 것을 말하는 전산학 용어이다. •  데이터베이스 관리 시스템(DBMS)이 주어진 설정에 따라 데이터베이스 스키마를 만들어 내며, 데이터베 이스 사용자가 자료를 저장, 조회, 삭제, 변경할 때 DB MS는 그것이 생성한 데이터베이스 스키마를 참조하 여 명령을 수행한다.21 MongoDB로배우는NoSQL
  • 22. 도큐먼트Document •  key:value 쌍으로 이루어진 JSON-like {        "id":  1,        "name":  "Foo",        "price":  123,          "tags":  ["Bar","Eek"] }22 MongoDB로배우는NoSQL
  • 23. 도큐먼트Document { “hello” : “world” } ß 문서 { “이름” : “채수원”, ß 또 다른 문서 “직업” : “무직”, “나이” : 5 }23 MongoDB로배우는NoSQL
  • 24. 컬렉션 Collection •  document의 모음 •  schema-free •  system으로 시작하는 이름은 사용불가(예약어) •  db.컬렉션이름.명령어 –  db.blog.insert(…)24 MongoDB로배우는NoSQL
  • 25. 실습25 MongoDB로배우는NoSQL
  • 26. 서버 실행 •  mongod --dbpath ./data/db •  mongo26 MongoDB로배우는NoSQL
  • 27. Database 하나의 데이터 베이스는 자체 권한을 가지 고 있으며 각각 파일로 존재한다. •  admin –  root DB •  local –  복제 제외 DB •  config –  샤드(shard)정보 저장27 MongoDB로배우는NoSQL
  • 28. MongoDB shell •  Interactive console •  JavaScript 기반28 MongoDB로배우는NoSQL
  • 29. 기본CRUD(create, retrieve, update, delete) •  insert() –  insert( {“name” : “world” } ) •  find() •  findOne() •  update() •  remove() –  remove( {“name” : “world” } )29 MongoDB로배우는NoSQL
  • 30. Shell Help > help > db.help() > db.mycollection.help() > db.mycollection.find().help() db.mycollection.help??30 MongoDB로배우는NoSQL
  • 31. Shell database관련 > db.version() > var titles = ["blog", "cafe", "message"]; > db.blog.insert( titles ); > for ( i in titles) { print( db.blog[ titles[i] ]); }31 MongoDB로배우는NoSQL
  • 32. Shell database관련 > db.version() > use 데이터베이스_이름 > show collections32 MongoDB로배우는NoSQL
  • 33. Data Types •  null •  boolean •  32비트 정수 •  64비트 정수 •  64비트 부동소수점형 •  문자열 •  심볼형33 MongoDB로배우는NoSQL
  • 34. Data Types (이어서) •  객체ID –  ObjectId() •  날짜 –  Date(), 1/1000초 단위 •  정규표현식 –  { "a" : /wo/i }34 MongoDB로배우는NoSQL
  • 35. Data Types (이어서) •  코드형 –  { "a” : function() { … } } •  이진데이터형 •  최대값형 •  최소값형 •  undefined •  배열 •  embedded document35 MongoDB로배우는NoSQL
  • 36. 숫자 •  Shell에서 모든 숫자는 더블double형으로 취급 --> floating-point로 취급36 MongoDB로배우는NoSQL
  • 37. Embedded Document { "name" : "John Doe", "address" : { "street" : "123 Street", "city" : ”Hamton", "state" : "NY" } } 문제점은?37 MongoDB로배우는NoSQL
  • 38. _id •  ObjectId() •  o = new ObjectId() •  o.getTimestamp()38 MongoDB로배우는NoSQL
  • 39. Array {"things" : ["pie", 3.14]}39 MongoDB로배우는NoSQL
  • 40. Collections 문서작성실습 •  db.getCollectionNames() •  document 생성 : 영화제목, 장르 •  db.getCollectionNames() •  db.system.indexes.find()40 MongoDB로배우는NoSQL
  • 41. insert •  db.foo.insert( document ); •  batch insert <-- fast!! –  but one collection only •  document size는 16M 까지 •  BSON –  Object.bsonsize( db.blog )41 MongoDB로배우는NoSQL
  • 42. update •  var robin = db.blog.findOne( {"name" : " robin" } ); •  robin.age = 18; •  db.blog.update( {"name" : "robin"}, robin ); •  delete robin.age42 MongoDB로배우는NoSQL
  • 43. update이어서 •  $inc –  db.blog.update( {"name" : "robin" }, {"$inc" : {"age" : 1 } } ) –  db.blog.update( {"name" : "robin" }, {"$inc" : {"exp" : 1 } } )43 MongoDB로배우는NoSQL
  • 44. update이어서 •  $set –  db.blog.update( {"name" : "robin" }, {"$set" : {"pow" : 10 } } ) •  $unset44 MongoDB로배우는NoSQL
  • 45. update이어서 •  $rename –  db.blog.update( {"name" : "robin" }, {"$rena me" : {"pow" : "pwr" } } )45 MongoDB로배우는NoSQL
  • 46. update이어서 •  upsert >db.blog.update( {"name" : "robin" }, robin, true ); •  multi –  db.blog.update( { }, {"$set" : {"level" : "1" } } , false, true );46 MongoDB로배우는NoSQL
  • 47. update이어서 •  $push > db.movie.insert({ "title" : "dark knight" }) > db.movie.update({ "title" : "dark knight"} , {$push : { "character" : "batman" } } ); •  $addToSet •  db.getLastError()47 MongoDB로배우는NoSQL
  • 48. save vs update >db.mycollection.save(x); >db.mycollection.update( { _id: x._id }, x, / *upsert*/ true );48 MongoDB로배우는NoSQL
  • 49. drop vs remove > db.blog.remove( fake ); > db.blog.drop();49 MongoDB로배우는NoSQL
  • 50. get-and-set { "_id" : ObjectId(), "status" : state, "priority" : N }50 MongoDB로배우는NoSQL
  • 51. get-and-set 이어서ps = db.processes.find({"status" : "READY").sort({"priority" : -1}) .limit(1).next()db.processes.update({"_id" : ps._id}, {"$set" : {"status" : "RUNNING"}})do_something(ps);db.processes.update({"_id" : ps._id}, {"$set" : {"status" : "DONE"}})51 MongoDB로배우는NoSQL
  • 52. get-and-set 이어서> ps = db.runCommand({"findAndModify" : "processes", "query" : {"status" : "READY"}, "sort" : {"priority" : -1}, "update" : {"$set" : {"status" : "RUNNING"}}){ "ok" : 1, "value" : { "_id" : ObjectId("4b3e7a18005cab32be6291f7"), "priority" : 1, "status" : "READY"}}52 MongoDB로배우는NoSQL
  • 53. get-and-set 이어서 •  형식 –  findAndModify –  query –  sort –  update / remove –  new •  오직 존재하는 문서만 갱신가능53 MongoDB로배우는NoSQL
  • 54. Fastest Write Mechanism •  fire-and-forget54 MongoDB로배우는NoSQL
  • 55. Safe Operations •  getLastError()55 MongoDB로배우는NoSQL
  • 56. 질의 query56 MongoDB로배우는NoSQL
  • 57. Query > db.users.find({"age" : 27}) > db.users.find({"username" : "joe", "age" : 27}) > db.users.find({}, {"username" : 1, "email " : 1})57 MongoDB로배우는NoSQL
  • 58. 제약사항 •  db.stock.find({"in_stock" : "stock.no"})58 MongoDB로배우는NoSQL
  • 59. Query 조건문 > db.users.find({"age" : {"$gte" : 18, "$lte" : 30}}) > start = new Date("01/01/2007") > db.users.find({”D-day" : {"$lt" : start}}) > db.users.find({”name" : {"$ne" : "joe"}})59 MongoDB로배우는NoSQL
  • 60. OR > db.raffle.find({"ticket_no" : {"$in" : [725, 542, 390]}}) > db.raffle.find({"ticket_no" : {"$nin" : [725 , 542, 390]}}) > db.raffle.find({"$or" : [{"ticket_no" : 725}, {"winner" : true}]})60 MongoDB로배우는NoSQL
  • 61. Not > db.users.find({"id_num" : {"$mod" : [5, 1 ]}}) > db.users.find({"id_num" : {"$not" : {"$mo d" : [5, 1]}}})61 MongoDB로배우는NoSQL
  • 62. 조건 규칙 > db.users.find( {"age" : {"$lt" : 30, "$gt" : 20}})62 MongoDB로배우는NoSQL
  • 63. null> db.c.find(){ "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null }{ "_id" : ObjectId("4ba0f0dfd22aa494fd523622"), "y" : 1 }{ "_id" : ObjectId("4ba0f148d22aa494fd523623"), "y" : 2 }> db.c.find({"y" : null}){ "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null }> db.c.find({"z" : null}){ "_id" : ObjectId("4ba0f0dfd22aa494fd523621"), "y" : null }{ "_id" : ObjectId("4ba0f0dfd22aa494fd523622"), "y" : 1 }{ "_id" : ObjectId("4ba0f148d22aa494fd523623"), "y" : 2 }63 MongoDB로배우는NoSQL
  • 64. 정규표현식Regular Expressions > db.users.find({"name" : /joe/i}) > db.users.find({"name" : /joey?/i})64 MongoDB로배우는NoSQL
  • 65. 배열검색> db.food.insert({"fruit" : ["apple", "banana", "peach"]})> db.food.find({"fruit" : "banana"})65 MongoDB로배우는NoSQL
  • 66. 배열검색$all> db.food.insert({"_id" : 1, "fruit" : ["apple", "banana", "peach"]})> db.food.insert({"_id" : 2, "fruit" : ["apple", "kumquat", "orange"]})> db.food.insert({"_id" : 3, "fruit" : ["cherry", "banana", "apple"]})> db.food.find({fruit : {$all : ["apple", "banana"]}}){"_id" : 1, "fruit" : ["apple", "banana", "peach"]}{"_id" : 3, "fruit" : ["cherry", "banana", "apple"]}> db.food.find({"fruit" : ["apple", "banana"]})> db.food.find({"fruit.2" : "peach"})66 MongoDB로배우는NoSQL
  • 67. 배열검색$size> db.food.find({"fruit" : {"$size" : 3}})> db.food.update({"$push" : {"fruit" : "strawberry"}, "$inc" : {"size" : 1}})> db.food.find({"size" : {"$gt" : 3}})67 MongoDB로배우는NoSQL
  • 68. 배열검색$slice> db.blog.posts.findOne(criteria, {"comments" : {"$slice" : 10}})> db.blog.posts.findOne(criteria, {"comments" : {"$slice" : -10}})> db.blog.posts.findOne(criteria, {"comments" : {"$slice" : [23, 10]}}) { "_id" : ObjectId("4b2d75476cc613d5ee930164"), "title" : "A blog post", "content" : "...", "comments" : [ { "name" : "joe", "email" : "joe@example.com", "content" : "nice post." }, { "name" : "bob", "email" : "bob@example.com", "content" : "good post." } ]}68 MongoDB로배우는NoSQL
  • 69. Embedded Documents 검색 { "name" : { "first" : "Joe", "last" : "Schmoe" }, "age" : 45 }69 MongoDB로배우는NoSQL
  • 70. Embedded Documents 검색> db.people.find({"name" : {"first" : "Joe", "last" : "Schmoe"}})> db.people.find({"name.first" : "Joe", "name.last" : "Schmoe"})70 MongoDB로배우는NoSQL
  • 71. Embedded Documents 검색> db.blog.find(){"content" : "...","comments" : [ { "author" : "joe", "score" : 3, "comment" : "nice post" }, { "author" : "mary", "score" : 6, "comment" : "terrible post" }]}71 MongoDB로배우는NoSQL
  • 72. Embedded Documents 검색 •  내장 문서는 전체 문서가 다 일치해야 한 다! ç 문제발생!!72 MongoDB로배우는NoSQL
  • 73. Embedded Documents 검색•  > db.blog.find({"comments" : {"$elemMatch" : {"author" : "joe", "score" : {"$gte" : 5}}}})73 MongoDB로배우는NoSQL
  • 74. Embedded Documents 검색 > db.blog.find( {"comments" : {"$elemMatch" : {"aut hor" : "joe”,"score" : {"$gte" : 5} }} } )74 MongoDB로배우는NoSQL
  • 75. $where> db.foo.insert({"apple" : 1, "banana" : 6, "peach" : 3})> db.foo.insert({"apple" : 8, "spinach" : 4, "watermelon" : 4})> db.foo.find({"$where" : "this.x + this.y == 10"})> db.foo.find({"$where" : "function() { return this.x + this.y == 10; }"})75 MongoDB로배우는NoSQL
  • 76. 커서cursor > for(i=0; i<100; i++) { ... db.c.insert({x : i}); ... } > var cursor = db.collection.find(); > while (cursor.hasNext()) { ... obj = cursor.next(); ... // do stuff ... }76 MongoDB로배우는NoSQL
  • 77. 커서cursor > var cursor = db.people.find(); > cursor.forEach(function(x) { ... print(x.name); ... });77 MongoDB로배우는NoSQL
  • 78. Limits, Skips, Sorts > db.c.find().limit(3) > db.c.find().skip(3) > db.c.find().sort({username : 1, age : -1}) > db.stock.find({"desc" : "mp3"}).limit(50). sort({"price" : -1})78 MongoDB로배우는NoSQL
  • 79. skip 피하기> var page1 = db.foo.find(criteria).limit(100)> var page2 = db.foo.find(criteria).skip(100).limit(100) > var page3 = db.foo.find(criteria).skip(200).limit(100)var latest = null;while (page1.hasNext()) { latest = page1.next(); display(latest);}var page2 = db.foo.find({"date" : {"$gt" : latest.date}});page2.sort({"date" : -1}).limit(100);79 MongoDB로배우는NoSQL
  • 80. random> var total = db.foo.count()> var random = Math.floor(Math.random()*total)> db.foo.find().skip(random).limit(1)> db.people.insert({"name" : "joe", "random" : Math.random()})> db.people.insert({"name" : "john", "random" : Math.random()})> db.people.insert({"name" : "jim", "random" : Math.random()})> var random = Math.random()> result = db.foo.findOne({"random" : {"$gt" : random}})80 MongoDB로배우는NoSQL
  • 81. 쿼리 결과의 일관성 유지 cursor = db.foo.find(); while (cursor.hasNext()) { var doc = cursor.next(); doc = process(doc); db.foo.save(doc); }81 MongoDB로배우는NoSQL
  • 82. $snapshot var cursor = db.foo.find().snapshot(); var cursor = db.foo.find( { $query :{}, $sna pshot : true } );82 MongoDB로배우는NoSQL
  • 83. 인덱스 index83 MongoDB로배우는NoSQL
  • 84. 인덱스 case1 {user : 1, date : -1} vs {date : -1, user : 1} case2 index for sort84 MongoDB로배우는NoSQL
  • 85. 인덱스 설정 > db.people.find({"username" : "mark"}) > db.people.ensureIndex({"username" : 1})85 MongoDB로배우는NoSQL
  • 86. 인덱스 전략 case1 {user : 1, date : -1} vs {date : -1, user : 1} case2 index for sort86 MongoDB로배우는NoSQL
  • 87. index name •  keyname1_dir1_keyname2_dir2… •  인덱스 이름 변경 db.foo.ensureIndex( {“a”:1…}, {“name”:”myindex”} )87 MongoDB로배우는NoSQL
  • 88. unique index db.people.ensureIndex( {“username”:1}, {“unique”:true} ) •  use getLastError 예) db.getLastError() •  _id :default unique index •  compound unique index도 가능함88 MongoDB로배우는NoSQL
  • 89. 중복 제거 db.people.ensureIndex( {“username”:1}, {“unique”:true, “dropDups”: true} )89 MongoDB로배우는NoSQL
  • 90. missing key •  db.things.ensureIndex( {firstname: 1}, {unique: true}); db.things.save({lastname: "Smith"}); •  db.things.save({lastname: "Jones"}); à error!!90 MongoDB로배우는NoSQL
  • 91. Index 관리 •  system.indexes 컬렉션91 MongoDB로배우는NoSQL
  • 92. Index 삭제 •  db.runcommand({“dropIndexes”:”people ”, “index”:”myIndex”} ) •  db.runcommand( {“dropIndexes”:”people”,“index”:”*”} ) •  db.collection.dropIndexes();92 MongoDB로배우는NoSQL
  • 93. Index Rebuild •  db.myCollection.reIndex() •  db.runCommand( { reIndex : myCollecti on } )93 MongoDB로배우는NoSQL
  • 94. explain, hint •  db.collectionName.find(…).explain() •  db.collectionName.find(…).hint()94 MongoDB로배우는NoSQL
  • 95. sparse index > db.people.ensureIndex({title : 1}, {sparse : true}) > db.people.save({name:"Jim"}) > db.people.save({name:"Sarah", title:"Princess"}) > db.people.find() { "_id" : ObjectId("4de6abd5da558a49fc5eef29"), "name" : "Jim" } { "_id" : ObjectId("4de6abdbda558a49fc5eef2a"), "name" : "Sarah", "title" : " Princess" } > db.people.find().sort({title:1}) // only 1 doc returned because sparse { "_id" : ObjectId("4de6abdbda558a49fc5eef2a"), "name" : "Sarah", "title" : " Princess" } 뒤로 이어서…95 MongoDB로배우는NoSQL
  • 96. sparse index (계속) > db.people.dropIndex({title : 1}) { "nIndexesWas" : 2, "ok" : 1 } > db.people.find().sort({title:1}) // no more index, returns all documents { "_id" : ObjectId("4de6abd5da558a49fc5eef29"), "name" : "Jim" } { "_id" : ObjectId("4de6abdbda558a49fc5eef2a"), "name" : "Sarah", "title" : " Princess" }96 MongoDB로배우는NoSQL
  • 97. 2D Geospatial indexes •  db.places.ensureIndex( { loc : "2d" } ) •  2d documents { loc : [ 50 , 30 ] } { loc : { x : 50 , y : 30 } } { loc : { foo : 50 , y : 30 } } { loc : { long : 40.739037, lat: 73.992964 } } •  only 1 geospatial index per collection97 MongoDB로배우는NoSQL
  • 98. 2D Geospatial indexes (계속) •  Query db.places.find( { loc : [50,50] } ) db.places.find( { loc : { $near : [50,50] } } ) db.places.find( { loc : { $near : [50,50] } } ).li mit(20) db.places.find( { loc : { $near : [50,50] , $ maxDistance : 5 } } ).limit(20)98 MongoDB로배우는NoSQL
  • 99. 2D Geospatial indexes (계속)•  within> polygonA = [ [ 10, 20 ], [ 10, 40 ], [ 30, 40 ], [ 30, 20 ] ]> polygonB = { a : { x : 10, y : 20 }, b : { x : 15, y : 25 }, c : { x : 20, y : 20 } }> db.places.find( { "loc" : { "$within" : { "$polygon" : polygonA } } })> db.places.find( { "loc" : { "$within" : { "$polygon" : polygonB } } })99 MongoDB로배우는NoSQL
  • 100. 주의사항 •  일반적으로 ‘인덱스’가 갖는 특징을 동일 하게 갖는다. •  쿼리 결과 반환비율 •  CUD 부하 •  Cardinality •  공간차지 •  인덱스 생성시의 부하100 MongoDB로배우는NoSQL
  • 101. 집계 Aggregation101 MongoDB로배우는NoSQL
  • 102. count •  db.movie.count() •  db.movie.count( {“title” : “shark”} ) •  db.pageviews.count({date: {$gte: new Date("Nov 1, 2009"), $lt: new Date("De c 1, 2009")}})102 MongoDB로배우는NoSQL
  • 103. distinct {"name" : "Ada", "age" : 20} {"name" : "Fred", "age" : 35} {"name" : "Susan", "age" : 60} {"name" : "Andy", "age" : 35} > db.runCommand({"distinct" : "people", " key" : "age"})103 MongoDB로배우는NoSQL
  • 104. group select a,b,sum(c) csum from coll where a ctive=1 group by a,b104 MongoDB로배우는NoSQL
  • 105. group db.coll.group({ key: { a:true, b:true }, cond: { active:1 }, reduce: function(obj, prev) { prev.csum += obj.c; }, initial: { csum: 0 } });105 MongoDB로배우는NoSQL
  • 106. group {"day" : "2010/10/03", "price" : 4.23} {"day" : "2010/10/04", "price" : 4.27} {"day" : "2010/10/03", "price" : 4.10} {"day" : "2010/10/06", "price" : 4.30} {"day" : "2010/10/04”, "price" : 4.01}106 MongoDB로배우는NoSQL
  • 107. group db.stocks.group({ "key" : {"day" : true }, "initial" : {"sum" : 0}, "$reduce" : function(doc, prev) { prev.sum += doc.price; } })107 MongoDB로배우는NoSQL
  • 108. group "ns" "key" "initial” "$reduce" "condition"108 MongoDB로배우는NoSQL
  • 109. group109 MongoDB로배우는NoSQL
  • 110. group110 MongoDB로배우는NoSQL
  • 111. group111 MongoDB로배우는NoSQL
  • 112. group112 MongoDB로배우는NoSQL
  • 113. Group $keyf > db.posts.group( {"ns" : "posts", "$keyf" : function(x) { return x.category.toLowerCase(); }, "initializer" : ... })113 MongoDB로배우는NoSQL
  • 114. MapReduce - Google -  페타바이트 이상의 대용량 데이터를 신 뢰할 수 없는 컴퓨터로 구성된 클러스터 환경에서 병렬 처리를 지원하기 위해서 개발 -  map, reduce 함수로 구성114 MongoDB로배우는NoSQL
  • 115. MapReduce map map = function () { for (var key in this) { emit(key, {count:1}); } }115 MongoDB로배우는NoSQL
  • 116. MapReduce reduce reduce = function (key, emits) { total = 0; for (var i in emits) { total += emits[i].count; } return {count:total}; }116 MongoDB로배우는NoSQL
  • 117. MapReducedb.runCommand({"mapreduce" : ”blog", "map" : map, "reduce" : reduce})db.blog.mapReduce(map, reduce, {out: { inline : 1}})117 MongoDB로배우는NoSQL
  • 118. 기타등등 miscellaneous118 MongoDB로배우는NoSQL
  • 119. RDBMS유저를 위한 Query 비 교 •  http://www.mongodb.org/display/DOCS/ SQL+to+Mongo+Mapping+Chart119 MongoDB로배우는NoSQL
  • 120. Capped Collections •  very high performance –  빠른 입력 –  바른 출력 •  auto-FIFO age-out 기능 •  Logging •  입력순서 자동유지 •  Caching •  Automatic Age Out120 MongoDB로배우는NoSQL
  • 121. Capped Collections이어서 •  circular queues •  update, remove불가 •  No index •  tailable지원121 MongoDB로배우는NoSQL
  • 122. Capped Collections•  db.createCollection(”blog", {capped:true, size:100000})•  db.createCollection(”blog", {capped:true, size:100000, max: 100})•  db. blog.find().sort({"$natural" : -1})122 MongoDB로배우는NoSQL
  • 123. GridFS•  리플리케이션 설정시, 자동으로 파일 백업•  한 디렉터리내에 수백만개의 파일 저장가능•  파일과 함께 관련된 데이터 저장가능 (수정한 사람, 다운로드 수, 설명등 등)•  document당 1개만 첨부가능123 MongoDB로배우는NoSQL
  • 124. GridFS fs.files { "_id" : <unspecified>, "length" : data_number, "chunkSize" : data_number, "uploadDate" : data_date, "md5" : data_string }124 MongoDB로배우는NoSQL
  • 125. DBref •  {"$ref" : collection, "$id" : id_value} •  {"$ref" : collection, "$id" : id_value, "$db " : database}125 MongoDB로배우는NoSQL
  • 126. DB관리 •  startup/shutdown •  monitoring –  web –  mongostat126 MongoDB로배우는NoSQL
  • 127. 인증 Authentication > db.addUser("root", "1234"); > db.addUser("read_only", "4321", true); > db.auth("root", "1234"); > db.system.users.remove({"user" : "test_ user"});127 MongoDB로배우는NoSQL
  • 128. NoSQL 비교자료 http://kkovacs.eu/cassandra-vs-mongodb -vs-couchdb-vs-redis128 MongoDB로배우는NoSQL
  • 129. 백업/복구129 MongoDB로배우는NoSQL
  • 130. mongodump/mongorestore •  $ ./mongodump -d test -o backup •  $ ./mongorestore -d foo --drop backup/t est/130 MongoDB로배우는NoSQL
  • 131. fsync > db.runCommand({"fsync" : 1, "lock" : 1}) ; > db.$cmd.sys.unlock.findOne();131 MongoDB로배우는NoSQL
  • 132. repairDatabase > db.repairDatabase() > mongod --dbpath=/data/db --repair132 MongoDB로배우는NoSQL
  • 133. 분산복제 replication133 MongoDB로배우는NoSQL
  • 134. master-slave•  $ mkdir -p ~/dbs/master•  $ ./mongod --dbpath ~/dbs/master --port 10000 --master•  $ mkdir -p ~/dbs/slave•  $ ./mongod --dbpath ~/dbs/slave --port 10001 --slave --source localhos t:10000134 MongoDB로배우는NoSQL
  • 135. master-slave •  --only •  --slavedelay •  --fastsync •  --autoresync •  --oplogSize master의 oplog size 지정(MB)135 MongoDB로배우는NoSQL
  • 136. master-slave 추가/제거•  $ ./mongod --slave --dbpath ~/dbs/slave --port 27018> use local> db.sources.insert({"host" : "localhost:27017"})> db.sources.find()> db.sources.insert({"host" : "prod.example.com:27017"})> db.sources.remove({"host" : "localhost:27017"})136 MongoDB로배우는NoSQL
  • 137. 레플리카 셋replica sets137 MongoDB로배우는NoSQL
  • 138. 레플리카 셋replica sets•  $ cat /etc/hostname•  $ mkdir -p ~/dbs/node1 ~/dbs/node2•  $ ./mongod --dbpath ~/dbs/node1 --port 10001 --replSet blog/earth:100 02•  $ ./mongod --dbpath ~/dbs/node2 --port 10002 --replSet blog/earth:100 01•  $ ./mongod --dbpath ~/dbs/node3 --port 10003 --replSet blog/earth:100 01•  $ ./mongod --dbpath ~/dbs/node3 --port 10003 --replSet blog/earth:100 01,morton:10002138 MongoDB로배우는NoSQL
  • 139. 레플리카 셋replica sets•  $ ./mongo morton:10001/admin >db.runCommand({"replSetInitiate" : { "_id" : "blog", "members" : [ { "_id" : 1, "host" : "earth:10001" }, { "_id" : 2, "host" : "earth:10002" } ]}})139 MongoDB로배우는NoSQL
  • 140. 레플리카 셋replica sets •  standard –  일반노드.투표에 참여. 주 노드가 될 수 있 음 •  passive –  전체 데이터를 가지고 있음 •  arbiter –  투표에만 참여. 복제본(X)140 MongoDB로배우는NoSQL
  • 141. 레플리카 셋replica sets > members.push({ ... "_id" : 3, ... "host" : "earth:10003", ... "priority" : 40 ... });141 MongoDB로배우는NoSQL
  • 142. 레플리카 셋replica sets142 MongoDB로배우는NoSQL
  • 143. 레플리카 셋replica sets143 MongoDB로배우는NoSQL
  • 144. 레플리카 셋replica sets144 MongoDB로배우는NoSQL
  • 145. oplog•  operation log•  oplog.$main> db.slaves.find()>db.sources.find()> db.runCommand({getLastError: 1, w: N});> db.printReplicationInfo();145 MongoDB로배우는NoSQL
  • 146. 샤딩 sharding146 MongoDB로배우는NoSQL
  • 147. Sharding •  현재 장비에 디스크 공간이 부족할 때 •  단인 mongod가 처리할 때 보다 빠르게 데이터를 쓰고 싶을 때 •  성능 향상을 위해 더 많은 데이터를 메모 리에 올려 두고 싶을 때147 MongoDB로배우는NoSQL
  • 148. Sharding148 MongoDB로배우는NoSQL
  • 149. Shard key •  name •  timestamp •  category •  local •  level type •  etc149 MongoDB로배우는NoSQL
  • 150. Autosharding •  Shard •  mongos •  config server150 MongoDB로배우는NoSQL
  • 151. Autosharding•  설정서버 시작•  $ mkdir -p ~/dbs/config•  $ ./mongod --dbpath ~/dbs/config --port 20000•  mongos 기동•  $ ./mongos --port 30000 --configdb localhost:20000151 MongoDB로배우는NoSQL
  • 152. Autosharding•  샤드추가•  $ mkdir -p ~/dbs/shard1•  $ ./mongod --dbpath ~/dbs/shard1 --port 10000•  $ ./mongo localhost:30000/admin> db.runCommand({addshard : "localhost:10000", allowLocal : true})•  컬렉션을 샤딩으로 지정> db.runCommand({"enablesharding" : "foo"})> db.runCommand({"shardcollection" : "foo.bar", "key" : {"_id" : 1}})152 MongoDB로배우는NoSQL
  • 153. Autosharding•  $ mkdir -p ~/dbs/config1 ~/dbs/config2 ~/dbs/config3•  $ ./mongod --dbpath ~/dbs/config1 --port 20001•  $ ./mongod --dbpath ~/dbs/config2 --port 20002•  $ ./mongod --dbpath ~/dbs/config3 --port 20003•  $ ./mongos --configdb localhost:20001,localhost:20002,localhost:2000 3153 MongoDB로배우는NoSQL
  • 154. Autosharding> db.shards.find()> db.databases.find()> db.chunks.find()> db.printShardingStatus()> db.runCommand({"removeshard" : "localhost:10000"});> db.runCommand({"removeshard" : "localhost:10000"});154 MongoDB로배우는NoSQL