Slide 1

Slide 1 text

ApacheCon Bradley Holt, Developer Advocate Friday, May 13, 2016 Introducing Apache CouchDB 2.0 @BradleyHolt

Slide 2

Slide 2 text

@BradleyHolt

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

IBM Cloud Data Services Open for Data A comprehensive por.olio of open source data services

Slide 5

Slide 5 text

What is Apache CouchDB?

Slide 6

Slide 6 text

Document Database Apache CouchDB is a JSON document database

Slide 7

Slide 7 text

HTTP API Apache CouchDB is accessed through an HTTP API @BradleyHolt GET / GET /db/doc POST /db DELETE /db/doc PUT /db/doc PUT /db

Slide 8

Slide 8 text

Peer-to-Peer Replication @BradleyHolt Cloudant Sync CouchDB PouchDB CouchDB Replication Protocol CouchDB

Slide 9

Slide 9 text

What's new in CouchDB 2.0?

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

CouchDB 1.x: Standalone @BradleyHolt CouchDB

Slide 13

Slide 13 text

CouchDB 2.0: Clusterered @BradleyHolt CouchDB node1 CouchDB node2 CouchDB node3 haproxy

Slide 14

Slide 14 text

Shards and Replicas §  q=8 –  Number of shards –  One or more shards per node –  Cannot have more nodes than shards §  r=2 –  Read quorum §  w=2 –  Write quorum §  n=3 –  Number of replicas of every document @BradleyHolt CouchDB node1 CouchDB node2 CouchDB node3

Slide 15

Slide 15 text

Mango §  Declarative indexes §  MongoDB-style query language §  You can still use map/reduce views @BradleyHolt

Slide 16

Slide 16 text

couch_peruser @BradleyHolt userdb-51d055 userdb-d76846 userdb-905cec userdb-adc95b userdb-c082f2 userdb-730bba userdb-c3d3e5 userdb-da userdb-a1ec1f db-85bcfe userdb-85a327 userdb-9b9aba

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

What else is new? §  Improved database compaction §  Faster index updates §  New _bulk_get endpoint for optimized replication §  View-based filters in _changes feed §  Filter _changes feed with _doc_ids §  _all_docs and _changes will support attachments=true @BradleyHolt

Slide 19

Slide 19 text

CouchDB 2.0 Developer Preview

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

Apache CouchDB 2.0 Sandbox Cluster Try Apache CouchDB 2.0 on an IBM Cloudant sandbox cluster @BradleyHolt

Slide 26

Slide 26 text

http-console

Slide 27

Slide 27 text

http-console $ npm install http-console -g! $ http-console 127.0.0.1:5984! > http-console 0.6.3! > Welcome, enter .help if you're lost.! > Connecting to 127.0.0.1 on port 5984.! @BradleyHolt https://github.com/cloudhead/http-console

Slide 28

Slide 28 text

http-console http://127.0.0.1:5984/> GET /! HTTP/1.1 200 OK! Content-Type: text/plain; charset=utf-8! ! {! couchdb: 'Welcome',! version: '9afa6a0',! vendor: { name: 'The Apache Software Foundation' }! } @BradleyHolt https://github.com/cloudhead/http-console

Slide 29

Slide 29 text

http-console http://127.0.0.1:5984/> .q @BradleyHolt https://github.com/cloudhead/http-console

Slide 30

Slide 30 text

http-console $ http-console https://bradley-holt.cloudant.com! > http-console 0.6.3! > Welcome, enter .help if you're lost.! > Connecting to bradley-holt.cloudant.com on port 443.! @BradleyHolt https://github.com/cloudhead/http-console

Slide 31

Slide 31 text

http-console https://bradley-holt.cloudant.com:443/> GET /! HTTP/1.1 200 OK! Content-Type: application/json! ! {! couchdb: 'Welcome',! version: '9d28c57',! vendor: {! name: 'IBM Cloudant',! version: '5331',! variant: 'paas'! },! features: [ 'geo' ]! }! @BradleyHolt https://github.com/cloudhead/http-console

Slide 32

Slide 32 text

http-console https://bradley-holt.cloudant.com:443/> .q @BradleyHolt https://github.com/cloudhead/http-console

Slide 33

Slide 33 text

Exploring the CouchDB API

Slide 34

Slide 34 text

Connecting to CouchDB 2.0 $ http-console root:passw0rd@127.0.0.1:5984 --json! > http-console 0.6.3! > Welcome, enter .help if you're lost.! > Connecting to 127.0.0.1 on port 5984.! @BradleyHolt

Slide 35

Slide 35 text

Connecting to IBM Cloudant $ http-console https://bradley-holt:passw0rd@bradley-holt.cloudant.com --json! > http-console 0.6.3! > Welcome, enter .help if you're lost.! > Connecting to bradley-holt.cloudant.com on port 443.! @BradleyHolt

Slide 36

Slide 36 text

Request Headers /> .headers! Accept: application/json! Content-Type: application/json! Authorization: Basic cm9vdDorMi95N3Y2aA==! Host: 127.0.0.1! @BradleyHolt

Slide 37

Slide 37 text

PUT a Database /> PUT /kittens! ... ! HTTP/1.1 201 Created! Content-Type: application/json! Location: http://127.0.0.1/kittens! ! { ok: true }! @BradleyHolt

Slide 38

Slide 38 text

PUT a Database Again /> PUT /kittens! ... ! HTTP/1.1 412 Precondition Failed! Content-Type: application/json! ! { error: 'file_exists', reason: 'The database could not be created, the file already exists.' }! @BradleyHolt

Slide 39

Slide 39 text

POST a Document /> /kittens! @BradleyHolt

Slide 40

Slide 40 text

POST a Document /kittens> POST /! ... { "_id": "mittens", "age_weeks": 10, "weight_kilograms": 0.997 }! HTTP/1.1 201 Created! Content-Type: application/json! Location: http://127.0.0.1/kittens/mittens! ! {! ok: true,! id: 'mittens',! rev: '1-e665a40d9ea9711c983e907f0b0b6e8a'! }! @BradleyHolt

Slide 41

Slide 41 text

GET All Documents /kittens> GET /_all_docs! HTTP/1.1 200 OK! Content-Type: application/json! Etag: "92afa0f309a9fd9f140cd31ff5000b5c"! ! {! total_rows: 1,! offset: 0,! rows: [! {! id: 'mittens',! key: 'mittens',! value: { rev: '1-e665a40d9ea9711c983e907f0b0b6e8a' }! }! ]! }! @BradleyHolt

Slide 42

Slide 42 text

GET a Document /kittens> GET /mittens! HTTP/1.1 200 OK! Content-Type: application/json! Etag: "1-e665a40d9ea9711c983e907f0b0b6e8a"! ! {! _id: 'mittens',! _rev: '1-e665a40d9ea9711c983e907f0b0b6e8a',! age_weeks: 10,! weight_kilograms: 0.997! }! @BradleyHolt

Slide 43

Slide 43 text

PUT an Attachment /kittens> .headers! Accept: application/json! Content-Type: application/json! Authorization: Basic cm9vdDorMi95N3Y2aA==! Host: 127.0.0.1! /kittens> Content-Type: image/gif! @BradleyHolt

Slide 44

Slide 44 text

PUT an Attachment /kittens> PUT /mittens/photo?rev=1-e665a40d9ea9711c983e907f0b0b6e8a! ... R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=! HTTP/1.1 201 Created! Content-Type: application/json! Location: http://127.0.0.1/kittens/mittens/photo! ! {! ok: true,! id: 'mittens',! rev: '2-d858e51453a5785bafe517b7eddc5a98'! }! /kittens> Content-Type: application/json! @BradleyHolt

Slide 45

Slide 45 text

GET an Attachment /kittens> GET /mittens/photo! HTTP/1.1 200 OK! Content-Type: image/gif! Etag: "UsqjdPnY6ApD2ENFOglFHg=="! ! R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=! @BradleyHolt

Slide 46

Slide 46 text

Conditional Caching /kittens> If-None-Match: "UsqjdPnY6ApD2ENFOglFHg=="! /kittens> GET /mittens/photo! HTTP/1.1 304 Not Modified! ! /kittens> If-None-Match:! @BradleyHolt

Slide 47

Slide 47 text

DELETE a Document /kittens> DELETE /mittens! HTTP/1.1 409 Conflict! Content-Type: application/json! ! { error: 'conflict', reason: 'Document update conflict.' }! @BradleyHolt

Slide 48

Slide 48 text

DELETE a Document /kittens> HEAD /mittens! HTTP/1.1 200 OK! Etag: "2-d858e51453a5785bafe517b7eddc5a98"! ! @BradleyHolt

Slide 49

Slide 49 text

DELETE a Document /kittens> If-Match: "2-d858e51453a5785bafe517b7eddc5a98"! /kittens> DELETE /mittens! HTTP/1.1 200 OK! Content-Type: application/json! ! {! ok: true,! id: 'mittens',! rev: '3-d0780627ddff7a7f536fe273100cec41'! }! /kittens> If-Match:! @BradleyHolt

Slide 50

Slide 50 text

Replication /kittens> ..! /> DELETE /kittens! HTTP/1.1 200 OK! Content-Type: application/json! ! { ok: true }! @BradleyHolt

Slide 51

Slide 51 text

Replication /> POST /_replicate! ... { "create_target": true, "source": "https://bradley-holt.cloudant.com/ kittens", "target": "kittens" }! HTTP/1.1 200 OK! Content-Type: application/json! ! {! ok: true,! session_id: '9f7bd286a0001ece5bf0bf65dd83c5ab',! source_last_seq: '5- g1AAAAFDeJzLYWBgYMlgTmGQT0lKzi9KdUhJMtVLykxPyilN1UvOyS9NScwr0ctLLckBKmRKZEiy___ _f1YiA6oWQ9xakhyAZFI9SFcGcyJzLpDHbplmZmxkaULYBKIdlscCJBkagBTQov2kuA- i8wBEJ9iNTGA3mhoampmnGBA2JQsA1LtoyA',! …! }! @BradleyHolt

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

Mango /> /kittens! @BradleyHolt

Slide 54

Slide 54 text

Mango /kittens> POST /_index! ... { "index": { "fields": [ "age_weeks", "weight_kilograms" ] } }! HTTP/1.1 200 OK! Content-Type: application/json! ! {! result: 'created',! id: '_design/e19dde7f518129a966ebe072edc66be88d54e694',! name: 'e19dde7f518129a966ebe072edc66be88d54e694'! }! @BradleyHolt

Slide 55

Slide 55 text

@BradleyHolt

Slide 56

Slide 56 text

Mango /kittens> POST /_find! ... { "selector": { "age_weeks": { "$gte": 7, "$lte": 10 } }, "fields": [ "_id", "age_weeks" ] }! HTTP/1.1 200 OK! Content-Type: application/json! ! {! docs: [! { _id: 'tiger', age_weeks: 7 },! { _id: 'daisy', age_weeks: 9 },! { _id: 'mittens', age_weeks: 10 }! ]! }! @BradleyHolt

Slide 57

Slide 57 text

@BradleyHolt

Slide 58

Slide 58 text

@BradleyHolt

Slide 59

Slide 59 text

@BradleyHolt

Slide 60

Slide 60 text

Mango /kittens> POST /_find! ... { "selector": { "age_weeks": { "$gte": 0 }, "weight_kilograms": { "$gte": 0.5, "$lte": 1 } }, "fields": [ "_id", "weight_kilograms" ] }! HTTP/1.1 200 OK! Content-Type: application/json! ! {! docs: [! { _id: 'tiger', weight_kilograms: 0.726 },! { _id: 'daisy', weight_kilograms: 0.816 },! { _id: 'mittens', weight_kilograms: 0.997 }! ]! }! @BradleyHolt

Slide 61

Slide 61 text

@BradleyHolt

Slide 62

Slide 62 text

@BradleyHolt

Slide 63

Slide 63 text

@BradleyHolt

Slide 64

Slide 64 text

Contributing

Slide 65

Slide 65 text

No content

Slide 66

Slide 66 text

No content

Slide 67

Slide 67 text

Offline Camp June 24th - 26th, Catskill Mountains

Slide 68

Slide 68 text

offlinefirst.org/camp

Slide 69

Slide 69 text

Image Credits §  paper by malik, on Flickr §  person by Tim Morgan, on Flickr §  database by Tim Morgan, on Flickr §  gear by Tim Morgan, on Flickr §  Mango with section on a white background by bangdoll, on Flickr @BradleyHolt

Slide 70

Slide 70 text

Questions? @BradleyHolt