NoSQL - An introduction to CouchDB
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

NoSQL - An introduction to CouchDB

  • 3,221 views
Uploaded on

Introduction to CouchDB presented by Jonathan Weiss at BarCampRuhr4

Introduction to CouchDB presented by Jonathan Weiss at BarCampRuhr4

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,221
On Slideshare
3,218
From Embeds
3
Number of Embeds
2

Actions

Shares
Downloads
44
Comments
0
Likes
2

Embeds 3

http://dschool.co 2
http://twitter.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. CouchDBA Database for the WebJonathan Weiss
  • 2. Who am I?Working for Peritor in Berlin, GermanyWritten, maintain, or involved in   Webistrano   Capistrano   SimplyStored   Happening   The great fire of Londonhttp://github.com/jweiss@jweiss 2
  • 3. ScalariumAmazon EC2 Cluster Management   Auto-config   Self-Healing   Auto-Scaling   One-click-deploymentwww.scalarium.com 3
  • 4. Database RequirementsHigh AvailabilityEasy ReplicationClusteringRobustnessShort Recovery Time 4
  • 5. 5
  • 6. CouchDBBuild for the WebScalesReplication built-inEmbracing offlineFlexible schema – document DB 6
  • 7. ”CouchDB is built of the Web“ Jacob Kaplan-Moss 7
  • 8. Web TechnologiesHTTP the access protocolJavaScript the query languageJSON the storage format 8
  • 9. JSON Document { "_id": "BCCD12CBB", "_rev": "1-AB764C", "type": "person", "name": "Darth Vader", "age": 63, "headware": ["Helmet", "Sombrero"], "dark_side": true, "weapons": { "right_arm": "light_saber", "left_arm": null } } 9
  • 10. JSON Document { "_id": "BCCD12CBB", "_rev": "1-AB764C", "type": "person", "name": "Darth Vader", "age": 63, "headware": ["Helmet", "Sombrero"], "dark_side": true, "weapons": { "right_arm": "light_saber", "left_arm": null } } 10
  • 11. JSON Document { "_id": "BCCD12CBB", "_rev": "1-AB764C", "type": "person", "name": "Darth Vader", "age": 63, "headware": ["Helmet", "Sombrero"], "dark_side": true, "weapons": { "right_arm": "light_saber", "left_arm": null } } 11
  • 12. No Tables or Namespaces 12
  • 13. No Tables or Namespaces 13
  • 14. Manual Namespacing { "_id": "BCCD12CBB", "_rev": "1-AB764C", "type": "person", "name": "Darth Vader", "age": 63, "headware": ["Helmet", "Sombrero"], "dark_side": true, "weapons": { "right_arm": "light_saber", "left_arm": null } } 14
  • 15. Interacting with CouchDB JSONHTTP Client PUT /dbname/ID 15
  • 16. Interacting with CouchDB GET /dbname/IDHTTP Client JSON 16
  • 17. Interacting with CouchDB DELETE /dbname/IDHTTP Client 17
  • 18. Views 18
  • 19. Design Document { "id": "_design/hats”, "_rev": "431212AB4”, "language": "javascript”, "views": { "all": { "map": "function(doc){ .... }”, "reduce": "function(doc){ .... }” }, "by_manufacturer": { "map": "function(doc){ .... }”, "reduce": "function(doc){ .... }” } } } 19
  • 20. Design Document { Document ID "id": "_design/hats”, – "_rev": "431212AB4”, prefixed by “_design/” "language": "javascript”, "views": { "all": { "map": "function(doc){ .... }”, "reduce": "function(doc){ .... }” }, "by_manufacturer": { "map": "function(doc){ .... }”, "reduce": "function(doc){ .... }” } } } 20
  • 21. Design Document { "id": "_design/hats”, "_rev": "431212AB4”, "language": "javascript”, "views": { "all": { Hash of Views "map": "function(doc){ .... }”, "reduce": "function(doc){ .... }” }, "by_manufacturer": { "map": "function(doc){ .... }”, "reduce": "function(doc){ .... }” } } } 21
  • 22. Design Document { "id": "_design/hats”, "_rev": "431212AB4”, "language": "javascript”, "views": { "all": { Hash of Views "map": "function(doc){ .... }”, Every view has map & "reduce": "function(doc){ .... }” reduce function }, "by_manufacturer": { "map": "function(doc){ .... }”, "reduce": "function(doc){ .... }” } } } 22
  • 23. Mapfunction(doc) { if (doc.headware) { for (var hat in doc.headware) { emit(hat, 1); } }} 23
  • 24. Map Passed every document in the DBfunction(doc) { if (doc.headware) { for (var hat in doc.headware) { emit(hat, 1); } }} 24
  • 25. Mapfunction(doc) { if (doc.headware) { Inspects for (var hat in doc.headware) { & Decides emit(hat, 1); } }} 25
  • 26. Mapfunction(doc) { if (doc.headware) { for (var hat in doc.headware) { emit(hat, 1); } } Emits result} for index 26
  • 27. Reduce function(keys, values, rereduce) { return sum(values); } 27
  • 28. Reduce Passed map result (or partial reduce result) function(keys, values, rereduce) { return sum(values); } 28
  • 29. Reduce function(keys, values, rereduce) { return sum(values); } Aggregates (count, sum, average, …) 29
  • 30. Example Map ResultMap functions are similar to SQL indices ID KEY VALUE 51ABFA211 Cap 1 ABC123456 Cappy 1 BCCD12CBB Helmet 1 BCCD12CBB Sombrero 1Sorted by the keyKey can also be an arrayValue can be complex JSON and/or reference to other document 30
  • 31. Query a view GET /dbname/_design/hats/_view/allHTTP Client {"total_rows":348,"offset":0,"rows”:[ {"id":"A","key":"A","value":1}, {"id":"B","key":"B","value":1}, ]} 31
  • 32. Query a view GET /dbname/_design/hats/_view/all? include_docs=trueHTTP Client 32
  • 33. View QueryFilter by   key=ABC123   startkey=123 & endkey=9   limit=100   descending=true   group=true   reduce=true   Include_docs=true 33
  • 34. SQL vs. JavaScript Vs. 34
  • 35. Using Couch from PHPSeveral options available   PHPillow: http://arbitracker.org/phpillow.html (LGPL 3)   PHP Object_Freezer: https://github.com/sebastianbergmann/php-object-freezer/tree (BSD)   PHP On Couch: http://github.com/dready92/PHP-on-Couch/tree/master (GPLv2 or v3)   PHP CouchDB Extension: http://www.topdog.za.net/php_couchdb_extension (PHP License 3.0)   Sag for CouchDB: http://www.saggingcouch.com/ (Apache License 2.0) 35
  • 36. 36
  • 37. 37
  • 38. 38
  • 39. 39
  • 40. SimplyStoredCouchDB convenience Layer for Ruby   Models & Associations   Validations   Callbacks BSD-licensed on   Dynamic finder http://github.com/peritor/simply_stored   S3 attachments On top of CouchPotato, CouchRest & RestClient   Paranoid delete   ActiveModel compliant 40
  • 41. Many moreOr just build your own using HTTP! 41
  • 42. Database RequirementsHigh AvailabilityEasy ReplicationClusteringRobustnessShort Recovery Time 42
  • 43. Replication B-TreeXXXXX Photo by Mathias Meyer 43
  • 44. B-TreeAppend onlyConcurrency (MVCC)Crash resistantHot backupsCompaction 44
  • 45. Replication 45
  • 46. CouchDB Replication POST /_replicate POST /_replicateEventually consistent & conflict resolution 46
  • 47. Load Balancing Replication HTTP Client HTTP Load Balancer 47
  • 48. Caching HTTP Client HTTP Cache Varnish Apache … 48
  • 49. Multi-Master 49
  • 50. BigCouch  Clustered CouchDB: Many CouchDBs appear as one  Modeled after Amazon Dynamo  Scalability like Cassandra or Riak  github.com/cloudant/bigcouch 50
  • 51. Q – No. of partitionsBigCouchN – No. of replicasR – Read quorumW – Write quorum 51
  • 52. VariousCouchAppsValidationsFiltered replicationChanges feedList functionsFutonGeoFulltext-Search with embedded LuceneDifferent experimental View-Server 52
  • 53. Q&APeritor GmbHBlücherstr. 22, Hof III Aufgang 610961 BerlinTel.: +49 (0)30 69 20 09 84 0Fax: +49 (0)30 69 20 09 84 9Internet: www.peritor.comE-Mail: info@peritor.com© Peritor GmbH - Alle Rechte vorbehalten