nosql - an introduction to couchdb
DESCRIPTION
Introduction to CouchDB presented by Jonathan Weiss at BarCampRuhr4TRANSCRIPT
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