YOU ARE DOWNLOADING DOCUMENT

Please tick the box to continue:

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


Related Documents