NoSQL - An introduction to CouchDB
-
Upload
jonathan-weiss -
Category
Documents
-
view
2.709 -
download
2
description
Transcript of 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
Scalarium
Amazon EC2 Cluster Management
Auto-config
Self-Healing
Auto-Scaling
One-click-deployment
www.scalarium.com
3
Database Requirements
High Availability
Easy Replication
Clustering
Robustness
Short Recovery Time
4
CouchDB
Build for the Web
Scales
Replication built-in
Embracing offline
Flexible schema – document DB
6
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
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
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
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
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
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/”
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
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
Map
function(doc) { if (doc.headware) { for (var hat in doc.headware) { emit(hat, 1); } } }
24
Passed every document in the DB
Map
function(doc) { if (doc.headware) { for (var hat in doc.headware) { emit(hat, 1); } } }
25
Inspects & Decides
Map
function(doc) { if (doc.headware) { for (var hat in doc.headware) { emit(hat, 1); } } }
26
Emits result for index
Reduce
function(keys, values, rereduce) { return sum(values); }
28
Passed map result (or partial reduce result)
Reduce
function(keys, values, rereduce) { return sum(values); }
29
Aggregates (count, sum, average, …)
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
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}, ]}
View Query
Filter by
key=ABC123
startkey=123 & endkey=9
limit=100
descending=true
group=true
reduce=true
Include_docs=true
33
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
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
Database Requirements
High Availability
Easy Replication
Clustering
Robustness
Short Recovery Time
42
CouchDB Replication
46
POST /_replicate
POST /_replicate
Eventually consistent & conflict resolution
BigCouch
50
Clustered CouchDB:
Many CouchDBs appear as one
Modeled after Amazon Dynamo
Scalability like Cassandra or Riak
github.com/cloudant/bigcouch
Various
CouchApps
Validations
Filtered replication
Changes feed
List functions
Futon
Geo
Fulltext-Search with embedded Lucene
Different experimental View-Server 52
© 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