Top Banner
CouchDB A Database for the Web Jonathan Weiss
53

NoSQL - An introduction to CouchDB

Jan 15, 2015

Download

Documents

Jonathan Weiss

Introduction to CouchDB presented by Jonathan Weiss at BarCampRuhr4
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: NoSQL - An introduction to CouchDB

CouchDB A Database for the Web

Jonathan Weiss

Page 2: NoSQL - An introduction to CouchDB

Who am I?

Working for Peritor in Berlin, Germany

Written, maintain, or involved in

  Webistrano

  Capistrano

  SimplyStored

  Happening

  The great fire of London

http://github.com/jweiss

@jweiss

2

Page 3: NoSQL - An introduction to CouchDB

Scalarium

Amazon EC2 Cluster Management

  Auto-config

  Self-Healing

  Auto-Scaling

  One-click-deployment

www.scalarium.com

3

Page 4: NoSQL - An introduction to CouchDB

Database Requirements

High Availability

Easy Replication

Clustering

Robustness

Short Recovery Time

4

Page 5: NoSQL - An introduction to CouchDB

5

Page 6: NoSQL - An introduction to CouchDB

CouchDB

Build for the Web

Scales

Replication built-in

Embracing offline

Flexible schema – document DB

6

Page 7: NoSQL - An introduction to CouchDB

7

”CouchDB is built of the Web“ Jacob Kaplan-Moss

Page 8: NoSQL - An introduction to CouchDB

Web Technologies

HTTP the access protocol

JavaScript the query language

JSON the storage format

8

Page 9: NoSQL - An introduction to CouchDB

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

Page 10: NoSQL - An introduction to CouchDB

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

Page 11: NoSQL - An introduction to CouchDB

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

Page 12: NoSQL - An introduction to CouchDB

No Tables or Namespaces

12

Page 13: NoSQL - An introduction to CouchDB

No Tables or Namespaces

13

Page 14: NoSQL - An introduction to CouchDB

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

Page 15: NoSQL - An introduction to CouchDB

Interacting with CouchDB

15

PUT /dbname/ID

JSON

HTTP Client

Page 16: NoSQL - An introduction to CouchDB

Interacting with CouchDB

16

JSON

GET /dbname/ID

HTTP Client

Page 17: NoSQL - An introduction to CouchDB

Interacting with CouchDB

17

DELETE /dbname/ID HTTP Client

Page 18: NoSQL - An introduction to CouchDB

18

Views

Page 19: NoSQL - An introduction to CouchDB

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

Page 20: NoSQL - An introduction to CouchDB

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){ .... }” } } }

20

Document ID –

prefixed by “_design/”

Page 21: NoSQL - An introduction to CouchDB

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){ .... }” } } }

21

Hash of Views

Page 22: NoSQL - An introduction to CouchDB

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){ .... }” } } }

22

Hash of Views Every view has map &

reduce function

Page 23: NoSQL - An introduction to CouchDB

Map

function(doc) { if (doc.headware) { for (var hat in doc.headware) { emit(hat, 1); } } }

23

Page 24: NoSQL - An introduction to CouchDB

Map

function(doc) { if (doc.headware) { for (var hat in doc.headware) { emit(hat, 1); } } }

24

Passed every document in the DB

Page 25: NoSQL - An introduction to CouchDB

Map

function(doc) { if (doc.headware) { for (var hat in doc.headware) { emit(hat, 1); } } }

25

Inspects & Decides

Page 26: NoSQL - An introduction to CouchDB

Map

function(doc) { if (doc.headware) { for (var hat in doc.headware) { emit(hat, 1); } } }

26

Emits result for index

Page 27: NoSQL - An introduction to CouchDB

Reduce

function(keys, values, rereduce) { return sum(values); }

27

Page 28: NoSQL - An introduction to CouchDB

Reduce

function(keys, values, rereduce) { return sum(values); }

28

Passed map result (or partial reduce result)

Page 29: NoSQL - An introduction to CouchDB

Reduce

function(keys, values, rereduce) { return sum(values); }

29

Aggregates (count, sum, average, …)

Page 30: NoSQL - An introduction to CouchDB

Example Map Result

Map functions are similar to SQL indices

30

ID KEY VALUE

51ABFA211 Cap 1

ABC123456 Cappy 1

BCCD12CBB Helmet 1

BCCD12CBB Sombrero 1

Sorted by the key

Key can also be an array

Value can be complex JSON and/or reference to other document

Page 31: NoSQL - An introduction to CouchDB

Query a view

31

GET /dbname/_design/hats/_view/all

HTTP Client

{"total_rows":348,"offset":0,"rows”:[ {"id":"A","key":"A","value":1}, {"id":"B","key":"B","value":1}, ]}

Page 32: NoSQL - An introduction to CouchDB

Query a view

32

GET /dbname/_design/hats/_view/all?include_docs=true

HTTP Client

Page 33: NoSQL - An introduction to CouchDB

View Query

Filter by

  key=ABC123

  startkey=123 & endkey=9

  limit=100

  descending=true

  group=true

  reduce=true

  Include_docs=true

33

Page 34: NoSQL - An introduction to CouchDB

SQL vs. JavaScript

34

Vs.

Page 35: NoSQL - An introduction to CouchDB

Using Couch from PHP

Several 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

Page 36: NoSQL - An introduction to CouchDB

36

Page 37: NoSQL - An introduction to CouchDB

37

Page 38: NoSQL - An introduction to CouchDB

38

Page 39: NoSQL - An introduction to CouchDB

39

Page 40: NoSQL - An introduction to CouchDB

SimplyStored

CouchDB convenience Layer for Ruby

  Models & Associations

  Validations

  Callbacks

  Dynamic finder

  S3 attachments

  Paranoid delete

  ActiveModel compliant

40

BSD-licensed on http://github.com/peritor/simply_stored

On top of CouchPotato, CouchRest & RestClient

Page 41: NoSQL - An introduction to CouchDB

Many more

Or just build your own using HTTP!

41

Page 42: NoSQL - An introduction to CouchDB

Database Requirements

High Availability

Easy Replication

Clustering

Robustness

Short Recovery Time

42

Page 43: NoSQL - An introduction to CouchDB

Replication

XXXXX

43

B-Tree

Photo by Mathias Meyer

Page 44: NoSQL - An introduction to CouchDB

B-Tree

Append only

Concurrency (MVCC)

Crash resistant

Hot backups

Compaction

44

Page 45: NoSQL - An introduction to CouchDB

Replication

45

Page 46: NoSQL - An introduction to CouchDB

CouchDB Replication

46

POST /_replicate

POST /_replicate

Eventually consistent & conflict resolution

Page 47: NoSQL - An introduction to CouchDB

Load Balancing

47

HTTP Client HTTP Load Balancer

Replication

Page 48: NoSQL - An introduction to CouchDB

Caching

48

HTTP Client HTTP Cache Varnish Apache …

Page 49: NoSQL - An introduction to CouchDB

Multi-Master

49

Page 50: NoSQL - An introduction to CouchDB

BigCouch

50

  Clustered CouchDB:

Many CouchDBs appear as one

 Modeled after Amazon Dynamo

  Scalability like Cassandra or Riak

  github.com/cloudant/bigcouch

Page 51: NoSQL - An introduction to CouchDB

BigCouch

51

Q – No. of partitions

N – No. of replicas

R – Read quorum

W – Write quorum

Page 52: NoSQL - An introduction to CouchDB

Various

CouchApps

Validations

Filtered replication

Changes feed

List functions

Futon

Geo

Fulltext-Search with embedded Lucene

Different experimental View-Server 52

Page 53: NoSQL - An introduction to CouchDB

© Peritor GmbH - Alle Rechte vorbehalten

Peritor GmbH Blücherstr. 22, Hof III Aufgang 6 10961 Berlin

Tel.: +49 (0)30 69 20 09 84 0 Fax: +49 (0)30 69 20 09 84 9

Internet: www.peritor.com E-Mail: [email protected]

Q&A