CouchDB on Rails
-
Upload
jonathan-weiss -
Category
Technology
-
view
6.282 -
download
0
description
Transcript of CouchDB on Rails
![Page 1: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/1.jpg)
CouchDB on Rails An Introduction
Jonathan Weiss 03.07.2010
![Page 2: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/2.jpg)
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: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/3.jpg)
Scalarium
EC2 Cluster Management
Auto-config
Self-Healing
Auto-Scaling
One-click-deployment
www.scalarium.com
3
![Page 4: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/4.jpg)
Database Requirements
High Availability
Easy Replication
Clustering
Robustness
Short Recovery Time
4
![Page 5: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/5.jpg)
5
![Page 6: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/6.jpg)
CouchDB
Build for the Web
Scales
Replication built-in
Embracing offline
Flexible schema – document DB
6
![Page 7: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/7.jpg)
7
”CouchDB is built of the Web“ Jacob Kaplan-Moss
![Page 8: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/8.jpg)
Web Technologies
HTTP the access protocol
JavaScript the query language
JSON the storage format
8
![Page 9: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/9.jpg)
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: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/10.jpg)
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: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/11.jpg)
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: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/12.jpg)
No Tables or Namespaces
12
![Page 13: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/13.jpg)
No Tables or Namespaces
13
![Page 14: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/14.jpg)
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: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/15.jpg)
Interacting with CouchDB
15
PUT /dbname/ID
JSON
HTTP Client
![Page 16: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/16.jpg)
Interacting with CouchDB
16
JSON
GET /dbname/ID
HTTP Client
![Page 17: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/17.jpg)
Interacting with CouchDB
17
DELETE /dbname/ID HTTP Client
![Page 18: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/18.jpg)
18
Views
![Page 19: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/19.jpg)
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: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/20.jpg)
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: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/21.jpg)
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: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/22.jpg)
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: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/23.jpg)
Map
function(doc) { if (doc.headware) { for (var hat in doc.headware) { emit(hat, 1); } } }
23
![Page 24: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/24.jpg)
Map
function(doc) { if (doc.headware) { for (var hat in doc.headware) { emit(hat, 1); } } }
24
Passed every document in the DB
![Page 25: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/25.jpg)
Map
function(doc) { if (doc.headware) { for (var hat in doc.headware) { emit(hat, 1); } } }
25
Inspects & Decides
![Page 26: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/26.jpg)
Map
function(doc) { if (doc.headware) { for (var hat in doc.headware) { emit(hat, 1); } } }
26
Emits result for index
![Page 27: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/27.jpg)
Reduce
function(keys, values, rereduce) { return sum(values); }
27
![Page 28: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/28.jpg)
Reduce
function(keys, values, rereduce) { return sum(values); }
28
Passed map result (or partial reduce result)
![Page 29: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/29.jpg)
Reduce
function(keys, values, rereduce) { return sum(values); }
29
Aggregates (count, sum, average, …)
![Page 30: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/30.jpg)
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
![Page 31: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/31.jpg)
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: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/32.jpg)
Query a view
32
GET /dbname/_design/hats/_view/all?include_docs=true
HTTP Client
![Page 33: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/33.jpg)
View Query
Filter by
key=ABC123
startkey=123 & endkey=9
limit=100
descending=true
group=true
reduce=true
Include_docs=true
33
![Page 34: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/34.jpg)
SQL vs. JavaScript
34
Vs.
![Page 35: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/35.jpg)
SQL vs. JavaScript
35
Vs.
ActiveRecord
SimplyStored
![Page 36: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/36.jpg)
SimplyStored
Convenience Layer for CouchDB
Models & Associations
Validations
Callbacks
Dynamic finder
S3 attachments
Paranoid delete
ActiveModel compliant
36
BSD-licensed on http://github.com/peritor/simply_stored
On top of CouchPotato, CouchRest & RestClient
![Page 37: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/37.jpg)
Setup
37
Install
Load in environment.rb
Configure
![Page 38: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/38.jpg)
Setup
38
![Page 39: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/39.jpg)
39
![Page 40: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/40.jpg)
40
![Page 41: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/41.jpg)
RockingChair
In-memory CouchDB
Just a big Hash
Understands all SimplyStored generated views
Speeds up tests
Tests can run in parallel
Nice for debugging
41
BSD-licensed on http://github.com/jweiss/rocking_chair
![Page 42: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/42.jpg)
Database Requirements
High Availability
Easy Replication
Clustering
Robustness
Short Recovery Time
42
![Page 43: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/43.jpg)
Replication
XXXXX
43
B-Tree
Photo by Mathias Meyer
![Page 44: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/44.jpg)
B-Tree
Append only
Concurrency (MVCC)
Crash resistant
Hot backups
Compaction
44
![Page 45: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/45.jpg)
Replication
45
![Page 46: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/46.jpg)
CouchDB Replication
46
POST /_replicate
POST /_replicate
Eventually consistent & conflict resolution
![Page 47: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/47.jpg)
Load Balancing
47
HTTP Client HTTP Load Balancer
Replication
![Page 48: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/48.jpg)
Caching
48
HTTP Client HTTP Cache Varnish Apache …
![Page 49: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/49.jpg)
Multi-Master
49
![Page 50: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/50.jpg)
Sharding/Partitioning with CouchDB Lounge
50
HTTP Client CouchDB Lounge
![Page 51: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/51.jpg)
Sharding with CouchDB Lounge
51
HTTP Client CouchDB Lounge
![Page 52: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/52.jpg)
Various
CouchApps
Validations
Filtered replication
Changes feed
Futon
Geo
Fulltext-Search with embedded Lucene
Experimental Ruby-View-Server
52
![Page 53: CouchDB on Rails](https://reader033.fdocuments.in/reader033/viewer/2022050801/54b75fba4a7959f71f8b4648/html5/thumbnails/53.jpg)
© 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