Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NoSQL: mongoDB vs. CouchDB

NoSQL: mongoDB vs. CouchDB

Rozdíly mezi mongoDB a CouchDB v prostředí NoSQL databází. Hlavní rysy a Case Study realtime replikace dat. Prezentování v Balingově Sále v NTK ve spolupráci s Michalem Valentou pro studenty ČVUT FIT v rámci předmětu MI-PDB.

Tomas Jukin

April 30, 2012
Tweet

More Decks by Tomas Jukin

Other Decks in Programming

Transcript

  1. Roadmap • Rekapitulace • Motivace • Trocha teorie • Features,

    Architektura, Kde použít?, Odkud instalovat? • mongoDB • CouchDB • Map-Reduce v praxi • mongoDB • CouchDB • Shrnutí ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB 2
  2. Rekapitulace • NoSQL = Not Only SQL 3 ČVUT Bc.

    Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  3. Rekapitulace • ACID občas svazuje • viz. CAP theorem •

    viz. BASE • via http://www.cs.berkeley.edu/~brewer/ cs262b-2004/PODC-keynote.pdf • Problematika GASŠ - “Garáže, Auta, Součástek a Šuplíků” 4 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  4. Motivace Situace: “V aplikaci instance, z DB lezou datasety a

    posíláme do ní řetězce...???” 5 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB ?
  5. Motivace Overkill? 6 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta,

    Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB ?
  6. Motivace ORM? 7 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta,

    Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB ?
  7. Motivace ORM? 8 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta,

    Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB ?
  8. Motivace NoSQL! 9 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta,

    Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB !
  9. Motivace - NoSQL • V aplikaci auto, v garáži auto

    • Propustnost • KISS • Pozor: • ALE JEN PRO SPRÁVNÉ USE CASES! • NoSQL není všelék! • ...a Map/Reduce není SQL... 10 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  10. Motivace - NoSQL • Ok, když NoSQL, jaké? • celá

    řada, viz. http://nosql-database.org/ • http://blog.nahurst.com/visual-guide-to- nosql-systems • my si představíme dvě dokumentově orientované... 11 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  11. Motivace NoSQL! 12 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta,

    Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  12. Motivace Problém SQL DBs • Škálování SQL DB = nákup

    více CPU • CPU je nejdražší komponenta počítače! • - tedy škálování SQL DB vyžaduje nákup těch nejdražších komponent PC... 13 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB ?
  13. Motivace Co s tím? We shall see... 14 ČVUT Bc.

    Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB ?
  14. Motivace • Co kdyby bylo možné místo škálování pomocí CPU

    škálovat pomocí RAM? 15 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB ?
  15. Motivace • Ono to možné je! 16 ČVUT Bc. Tomáš

    Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB !
  16. Trocha teorie • “Agile and scalable” • “MongoDB (from "humongous")

    is a scalable, high-performance, open source NoSQL database.” • Written in C++ • http://www.mongodb.org 17 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  17. Trocha teorie • Document-oriented storage • Schema-Less • Full Index

    Support • Replication • Horizontal scaling of the data layer • Document-based queries (JS / JSON) • Map / Reduce • /data/db 18 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  18. Trocha teorie • No relations, no joins • Embed vs.

    link • Embed = “prejoin” • Links = needs to be processed on client • follow-up query • Indexes • Collections • a.k.a. tables in SQL • mohou být heterogenní • v praxi často homogenní 19 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB “There are no joins in MongoDB – distributed joins would be difficult on a 1,000 server cluster.”
  19. Trocha teorie • Document-oriented storage • BSON • žije v

    RAM paměti • VRAM • dedikovaný stroj • nezpůsobuje SWAPování • (řeší sama) • Journaling (mimo storage) • on / off • Jazyk: “interaktivní”JS • JSON • BSON (over network) • REST (není native!) • mongod --rest 20 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  20. Trocha teorie 21 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta,

    Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  21. Trocha teorie 22 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta,

    Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  22. • http://labs.google.com/papers/ mapreduce.html • map() & reduce() • nad kolekcí

    23 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB Map / Reduce
  23. • map() - dej mi jen to podstatné, nebo to

    uprav • reduce() - zredukuj to! 24 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB Map / Reduce
  24. • map() - dej mi jen to podstatné, nebo to

    uprav • reduce() - zredukuj to! • a znovu! 25 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB Map / Reduce
  25. • map() - dej mi jen to podstatné, nebo to

    uprav • reduce() - zredukuj to! • a znovu! a znovu! 26 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB Map / Reduce
  26. • map() - dej mi jen to podstatné, nebo to

    uprav • reduce() - zredukuj to! • a znovu! a znovu! a znovu! ... 27 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB Map / Reduce
  27. Map / Reduce 28 ČVUT Bc. Tomáš Jukin, Ing. Michal

    Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB (1..3).map  {  |number|  number  *  2  } #  =>  [2,  4,  6] (1..3).reduce(0)  {  |sum,  num|  sum  +=  num  } #  =>  6
  28. Map / Reduce 29 ČVUT Bc. Tomáš Jukin, Ing. Michal

    Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB // Map function(doc) { for (tag in doc.tags) { emit(doc.tags[tag], 1) } } // Reduce _count
  29. • Komplexní dotazy? AND? • Co s tím? 30 ČVUT

    Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB Map / Reduce
  30. • CouchDB-Lucene • http://github.com/rnewson/couchdb-lucene • mongoDB API • http://www.mongodb.org/display/DOCS/Advanced+Queries 31

    ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB Map / Reduce
  31. • Nestačí? • Too Bad! • -> SQL :-(... 32

    ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB Map / Reduce
  32. 33 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. -

    NoSQL: mongoDB vs. CouchDB MI-PDB db.runCommand({ mapreduce: "DenormAggCollection", query: { filter1: { '$in': [ 'A', 'B' ] }, filter2: 'C', filter3: { '$gt': 123 } }, map: function() { emit( { d1: this.Dim1, d2: this.Dim2 }, { msum: this.measure1, recs: 1, mmin: this.measure1, mmax: this.measure2 < 100 ? this.measure2 : 0 } );}, reduce: function(key, vals) { var ret = { msum: 0, recs: 0, mmin: 0, mmax: 0 }; for(var i = 0; i < vals.length; i++) { ret.msum += vals[i].msum; ret.recs += vals[i].recs; if(vals[i].mmin < ret.mmin) ret.mmin = vals[i].mmin; if((vals[i].mmax < 100) && (vals[i].mmax > ret.mmax)) ret.mmax = vals[i].mmax; } return ret; }, finalize: function(key, val) { val.mavg = val.msum / val.recs; return val; }, out: 'result1', verbose: true }); db.result1. find({ mmin: { '$gt': 0 } }). sort({ recs: -1 }). skip(4). limit(8); SELECT Dim1, Dim2, SUM(Measure1) AS MSum, COUNT(*) AS RecordCount, AVG(Measure2) AS MAvg, MIN(Measure1) AS MMin MAX(CASE WHEN Measure2 < 100 THEN Measure2 END) AS MMax FROM DenormAggTable WHERE (Filter1 IN (’A’,’B’)) AND (Filter2 = ‘C’) AND (Filter3 > 123) GROUP BY Dim1, Dim2 HAVING (MMin > 0) ORDER BY RecordCount DESC LIMIT 4, 8 1 2 3 4 5 1 7 6 1 2 3 4 5 Grouped dimension columns are pulled out as keys in the map function, reducing the size of the working set. Measures must be manually aggregated. Aggregates depending on record counts must wait until finalization. Measures can use procedural logic. Filters have an ORM/ActiveRecord- looking style. 6 Aggregate filtering must be applied to the result set, not in the map/reduce. 7 Ascending: 1; Descending: -1 Revision 4, Created 2010-03-06 Rick Osborne, rickosborne.org mySQL MongoDB
  33. Trocha teorie • Cloud • https://mongohq.com/home • Heroku, nodejitsu, AWS,

    EngineYard • Reference • SAP, MTV, SourceForge, Disney, FourSquare 34 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  34. Trocha teorie • Zdroje • http://www.mongodb.org/display/DOCS/ Philosophy • http://www.mongodb.org/display/DOCS/SQL+to +Mongo+Mapping+Chart

    • http://rickosborne.org/blog/2010/02/infographic- migrating-from-sql-to-mapreduce-with-mongodb/ • http://www.mongodb.org/display/DOCS/ Production+Deployments 35 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  35. Instalace • Windows • mongoDB - http://goo.gl/wgmpE • Linux •

    custom apt pkgs - http://goo.gl/Bngud • mongoDB - http://goo.gl/wgmpE • MacOS • brew install mongodb • mongoDB - http://goo.gl/wgmpE 36 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  36. Motivace Problém SQL DBs • Škálování SQL DB = nákup

    více CPU • CPU je nejdražší komponenta počítače! • - tedy škálování SQL DB vyžaduje nákup těch nejdražších komponent PC... 37 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB ?
  37. Motivace • Co kdyby bylo možné místo škálování pomocí CPU

    škálovat pomocí HDD? 38 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB ?
  38. Motivace • Ono to možné je! 39 ČVUT Bc. Tomáš

    Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB !
  39. Trocha teorie • “Time to relax!” • “Apache CouchDB is

    a distributed, fault- tolerant and schema-free document- oriented database accessible via a RESTful HTTP/JSON API.” • Written in Erlang • http://couchdb.apache.org/ 40 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  40. Trocha teorie “Django may be built for the Web, but

    CouchDB is built of the Web. I’ve never seen software that so completely embraces the philosophies behind HTTP.” Jacob Kaplan-Moss, Of the Web (2007) 41 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  41. Trocha teorie • “A Database for the Web” • RESTful

    over HTTP • Server = HTTP server • Client = Website / cURL / Futon • ETag HTTP caching 42 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  42. Trocha teorie • Fault tolerant and Concurent • Erlang •

    Append-only B-Trees • Append ONLY! • Distributed • Bez kofliktů! 43 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  43. Trocha teorie HOST=http://localhost:5984 curl ‐X GET $HOST # {"couchdb":"Welcome","version":"1.0.2"} curl

    ‐X GET $HOST/my‐db # {"error":"not_found","reason":"no_db_file"} curl ‐X PUT $HOST/my‐db # {"ok":true} curl ‐X PUT $HOST/my‐db/foo ‐d '{"moo":"bar"}' # {"ok":true,"id":"foo","rev":"1‐4c6114c65e295552ab1019e2b046b10e"} curl ‐X GET $HOST/my‐db/foo # {"_id":"foo","_rev":"1-4c6114c65e295552ab1019e2b046b10e","moo":"bar"} curl ‐X DELETE $HOST/my‐db/foo?rev=2‐d179f665eb01834faf192153dc72dcb3 # {"ok":true,"id":"foo","rev":"1‐4c6114c65e295552ab1019e2b046b10e"} 44 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  44. Trocha teorie • Budoucnost? • CouchBase • používá CouchDB •

    Reference • BBC, EngineYard, WikiLeaks, .. (http://goo.gl/ UZFBj) • http://www.jobs.cz/vysoke-skoly/ 45 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  45. Trocha teorie • Zdroje • http://couchdb.apache.org/ • http://wiki.apache.org/couchdb • http://www.couchbase.com/couchdb

    • http://jacobian.org/writing/of-the-web/ • http://webexpo.cz/praha2010/prednaska/couchdb- databaze-pro-web/ • http://wiki.apache.org/couchdb/CouchDB_in_the_wild 46 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  46. Instalace • Windows • CouchDB - http://goo.gl/SJUkp • Linux •

    CouchDB - http://goo.gl/SJUkp • MacOS • CouchDBX - http://goo.gl/crdYL 47 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  47. Shrnutí • mongoDB • škálování = nakupuji RAM • update

    only (journaling OFF by default) • replikace je MUST have! (by default) • CouchDB • škálování = nakupuji HDD • append only (revisions) • replikace je NICE to have 48 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  48. One last thing 49 ČVUT Bc. Tomáš Jukin, Ing. Michal

    Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  49. Živá ukázka real-time replikace! 50 ČVUT Bc. Tomáš Jukin, Ing.

    Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  50. • POST _replicate • push vs. pull • Jednocestná replikace

    dat (konrétní DB) • lze nastavit i druhý směr • jen poslední revize • single / continuous • podporuje autentikaci (HTTP) • 1.1.0+ - _replicator DB • nastavení replikace není persistentní přes restart 51 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB Replikace
  51. Replikace 2. 2 kliky přes FUTON GUI nebo 3. jeden

    POST dotaz ;) 4. DONE 52 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  52. Replikace curl -i -X POST "http://localhost:5984/_replicate" \ -H "Content-Type: application/json"

    \ -d '{"source":"http://example.net:5984/test", "target":"test","create_target":true }' 53 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB • http://wiki.apache.org/couchdb/Replication
  53. Replikace curl -i -X POST "http://localhost:5984/_replicate" \ -H "Content-Type: application/json"

    \ -d '{"source":"http://example.net:5984/test", "target":"test","create_target":true, "continuous":true }' 54 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB • http://wiki.apache.org/couchdb/Replication
  54. • master-slave • Replica Set • voting • inkrementální replikace

    dat • on write • write to all • read from one 55 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB Replikace
  55. Replikace 1. start v režimu Replica Set 2. na jednom

    z uzlů rs.initiate(); • volitelně předáme config JSON rs.initiate(config); • tento uzel bude master 3. můžeme přidat další uzly rs.add(“node”) 4. ověříme stav Replika Setu rs.status(); 5. DONE 56 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB
  56. Replikace mongod --replSet foo config = {_id: 'foo', members: [

    {_id: 0, host: 'node1ip:27017'}, {_id: 1, host: 'node2ip:27017'}]} rs.initiate(config); 57 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB • http://www.mongodb.org/display/DOCS/Replica+Sets+-+Basics Node B (PRIMARY) Node A (SECONDARY) mongod --replSet foo
  57. Děkujeme za pozornost Dotazy? Bc. Tomáš Jukin @Inza Ing. Michal

    Valenta, Ph.D. 58 ČVUT Bc. Tomáš Jukin, Ing. Michal Valenta, Ph.D. - NoSQL: mongoDB vs. CouchDB MI-PDB Přednášku stahujte na link