Couchdb w Ruby'm

34
CouchDB CouchDB w ruby'm, na przykładach w ruby'm, na przykładach

Transcript of Couchdb w Ruby'm

Page 1: Couchdb w Ruby'm

CouchDBCouchDBw ruby'm, na przykładachw ruby'm, na przykładach

Page 2: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 2

Kim jestem?Kim jestem?

Page 3: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 3

Plan prezentacjiPlan prezentacji

CouchDB● Nierelacyjna baza danych● RESTful JSON API● Widoki (MapReduce)● Replikacje

Ruby● Couchrest● Couch_foo● Couch_potato● Reverse proxy

teoria praktyka

Page 4: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 4

Źródło: http://blog.nahurst.com/visual-guide-to-nosql-systems

Page 5: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 5

Źródło: http://blog.nahurst.com/visual-guide-to-nosql-systems

tu jestem

Page 6: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 6

Document-OrientedDocument-Oriented

● Wszystkie dane są przechowywane w formie dokumentów o dowolnym rozmiarze.

● Każdy dokument ma unikalną nazwę, oraz posiada dowolną liczbę pól o unikalnej nazwie.

● Każdemu polu (kluczowi) odpowiada wartość dowolnego typu (np. String, Integer, Array, Hash).

● Na dokumentach wykonywane są operacje CRUD (Create, Read, Update, Delete) tylko na całym dokumencie, nigdy na jego fragmencie.

Page 7: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 7

RESTRESTfulful JSON JSON APIAPI

{ "_id": "fb288af72d22797f5cf68a73a7a5cb89", "_rev": "12-8f531b2a273d35ecd4af58e930525e8c", "couchrest-type": "Line", "no": 117, "begin_date": "2009/10/03", "timetables": [ { "data": {"pon-pt": [...], "sob": [...]}, "stop_id": "acf81f2770a21481bf0e784b7b506d38" }, ... ], "updated_at": "2010/03/08 21:08:50 +0000", "created_at": "2010/01/22 21:50:19 +0000"}

Page 8: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 8

RESTRESTfulful JSON JSON APIAPI

Stwórz: POST /db/<id>

Czytaj: GET /db/<id>

Aktualizuj: PUT /db/<id>

Usuń: DELETE /db/<id>

Page 9: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 9

Page 10: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 10

RESTRESTfulful JSON JSON APIAPI

[~] ➔ curl http://localhost:5984/[info] [<0.95.0>] 127.0.0.1 - - 'GET' / 200{"couchdb":"Welcome","version":"0.11.0"}[~] ➔ curl -X PUT http://localhost:5984/krug[info] [<0.124.0>] 127.0.0.1 - - 'PUT' /krug 201{"ok":true}[~] ➔ curl -X POST http://localhost:5984/krug -d '{"Temat": "Witaj świecie!"}'[info] [<0.216.0>] 127.0.0.1 - - 'POST' /krug 201{"ok":true,"id":"8cb7299cc68d35a2ca4a0c18070009be","rev":"1-4777d27f9e980ed1ce8cf94c0bc1d27a"}[~] ➔ curl -X PUT http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be \> -d '{"Temat": "Witaj okrutny świecie!"}'[info] [<0.668.0>] 127.0.0.1 - - 'PUT' /krug/8cb7299cc68d35a2ca4a0c18070009be 409{"error":"conflict","reason":"Document update conflict."}[~] ➔ curl -X PUT http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be \> -d '{"_rev":"1-4777d27f9e980ed1ce8cf94c0bc1d27a", "Temat": "Witaj okrutny świecie!"}'{"ok":true,"id":"8cb7299cc68d35a2ca4a0c18070009be","rev":"2-e51a077b62b9bfbc8faac8aff60733b4"}[info] [<0.774.0>] 127.0.0.1 - - 'PUT' /krug/8cb7299cc68d35a2ca4a0c18070009be 201[~] ➔ curl http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be[info] [<0.1264.0>] 127.0.0.1 - - 'GET' /krug/8cb7299cc68d35a2ca4a0c18070009be 200{"_id":"8cb7299cc68d35a2ca4a0c18070009be","_rev":"2-e51a077b62b9bfbc8faac8aff60733b4","Temat":"Witaj okrutny \u015bwiecie!"}[~] ➔

Page 11: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 11

RESTRESTfulful JSON JSON APIAPI

[~] ➔ curl http://localhost:5984/[info] [<0.95.0>] 127.0.0.1 - - 'GET' / 200{"couchdb":"Welcome","version":"0.11.0"}[~] ➔ curl -X PUT http://localhost:5984/krug[info] [<0.124.0>] 127.0.0.1 - - 'PUT' /krug 201{"ok":true}[~] ➔ curl -X POST http://localhost:5984/krug -d '{"Temat": "Witaj świecie!"}'[info] [<0.216.0>] 127.0.0.1 - - 'POST' /krug 201{"ok":true,"id":"8cb7299cc68d35a2ca4a0c18070009be","rev":"1-4777d27f9e980ed1ce8cf94c0bc1d27a"}[~] ➔ curl -X PUT http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be \> -d '{"Temat": "Witaj okrutny świecie!"}'[info] [<0.668.0>] 127.0.0.1 - - 'PUT' /krug/8cb7299cc68d35a2ca4a0c18070009be 409{"error":"conflict","reason":"Document update conflict."}[~] ➔ curl -X PUT http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be \> -d '{"_rev":"1-4777d27f9e980ed1ce8cf94c0bc1d27a", "Temat": "Witaj okrutny świecie!"}'{"ok":true,"id":"8cb7299cc68d35a2ca4a0c18070009be","rev":"2-e51a077b62b9bfbc8faac8aff60733b4"}[info] [<0.774.0>] 127.0.0.1 - - 'PUT' /krug/8cb7299cc68d35a2ca4a0c18070009be 201[~] ➔ curl http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be[info] [<0.1264.0>] 127.0.0.1 - - 'GET' /krug/8cb7299cc68d35a2ca4a0c18070009be 200{"_id":"8cb7299cc68d35a2ca4a0c18070009be","_rev":"2-e51a077b62b9bfbc8faac8aff60733b4","Temat":"Witaj okrutny \u015bwiecie!"}[~] ➔

Page 12: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 12

RESTRESTfulful JSON JSON APIAPI

[~] ➔ curl http://localhost:5984/[info] [<0.95.0>] 127.0.0.1 - - 'GET' / 200{"couchdb":"Welcome","version":"0.11.0"}[~] ➔ curl -X PUT http://localhost:5984/krug[info] [<0.124.0>] 127.0.0.1 - - 'PUT' /krug 201{"ok":true}[~] ➔ curl -X POST http://localhost:5984/krug -d '{"Temat": "Witaj świecie!"}'[info] [<0.216.0>] 127.0.0.1 - - 'POST' /krug 201{"ok":true,"id":"8cb7299cc68d35a2ca4a0c18070009be","rev":"1-4777d27f9e980ed1ce8cf94c0bc1d27a"}[~] ➔ curl -X PUT http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be \> -d '{"Temat": "Witaj okrutny świecie!"}'[info] [<0.668.0>] 127.0.0.1 - - 'PUT' /krug/8cb7299cc68d35a2ca4a0c18070009be 409{"error":"conflict","reason":"Document update conflict."}[~] ➔ curl -X PUT http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be \> -d '{"_rev":"1-4777d27f9e980ed1ce8cf94c0bc1d27a", "Temat": "Witaj okrutny świecie!"}'{"ok":true,"id":"8cb7299cc68d35a2ca4a0c18070009be","rev":"2-e51a077b62b9bfbc8faac8aff60733b4"}[info] [<0.774.0>] 127.0.0.1 - - 'PUT' /krug/8cb7299cc68d35a2ca4a0c18070009be 201[~] ➔ curl http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be[info] [<0.1264.0>] 127.0.0.1 - - 'GET' /krug/8cb7299cc68d35a2ca4a0c18070009be 200{"_id":"8cb7299cc68d35a2ca4a0c18070009be","_rev":"2-e51a077b62b9bfbc8faac8aff60733b4","Temat":"Witaj okrutny \u015bwiecie!"}[~] ➔

Page 13: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 13

RESTRESTfulful JSON JSON APIAPI

[~] ➔ curl http://localhost:5984/[info] [<0.95.0>] 127.0.0.1 - - 'GET' / 200{"couchdb":"Welcome","version":"0.11.0"}[~] ➔ curl -X PUT http://localhost:5984/krug[info] [<0.124.0>] 127.0.0.1 - - 'PUT' /krug 201{"ok":true}[~] ➔ curl -X POST http://localhost:5984/krug -d '{"Temat": "Witaj świecie!"}'[info] [<0.216.0>] 127.0.0.1 - - 'POST' /krug 201{"ok":true,"id":"8cb7299cc68d35a2ca4a0c18070009be","rev":"1-4777d27f9e980ed1ce8cf94c0bc1d27a"}[~] ➔ curl -X PUT http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be \> -d '{"Temat": "Witaj okrutny świecie!"}'[info] [<0.668.0>] 127.0.0.1 - - 'PUT' /krug/8cb7299cc68d35a2ca4a0c18070009be 409{"error":"conflict","reason":"Document update conflict."}[~] ➔ curl -X PUT http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be \> -d '{"_rev":"1-4777d27f9e980ed1ce8cf94c0bc1d27a", "Temat": "Witaj okrutny świecie!"}'{"ok":true,"id":"8cb7299cc68d35a2ca4a0c18070009be","rev":"2-e51a077b62b9bfbc8faac8aff60733b4"}[info] [<0.774.0>] 127.0.0.1 - - 'PUT' /krug/8cb7299cc68d35a2ca4a0c18070009be 201[~] ➔ curl http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be[info] [<0.1264.0>] 127.0.0.1 - - 'GET' /krug/8cb7299cc68d35a2ca4a0c18070009be 200{"_id":"8cb7299cc68d35a2ca4a0c18070009be","_rev":"2-e51a077b62b9bfbc8faac8aff60733b4","Temat":"Witaj okrutny \u015bwiecie!"}[~] ➔

Page 14: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 14

RESTRESTfulful JSON JSON APIAPI

[~] ➔ curl http://localhost:5984/[info] [<0.95.0>] 127.0.0.1 - - 'GET' / 200{"couchdb":"Welcome","version":"0.11.0"}[~] ➔ curl -X PUT http://localhost:5984/krug[info] [<0.124.0>] 127.0.0.1 - - 'PUT' /krug 201{"ok":true}[~] ➔ curl -X POST http://localhost:5984/krug -d '{"Temat": "Witaj świecie!"}'[info] [<0.216.0>] 127.0.0.1 - - 'POST' /krug 201{"ok":true,"id":"8cb7299cc68d35a2ca4a0c18070009be","rev":"1-4777d27f9e980ed1ce8cf94c0bc1d27a"}[~] ➔ curl -X PUT http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be \> -d '{"Temat": "Witaj okrutny świecie!"}'[info] [<0.668.0>] 127.0.0.1 - - 'PUT' /krug/8cb7299cc68d35a2ca4a0c18070009be 409{"error":"conflict","reason":"Document update conflict."}[~] ➔ curl -X PUT http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be \> -d '{"_rev":"1-4777d27f9e980ed1ce8cf94c0bc1d27a", "Temat": "Witaj okrutny świecie!"}'{"ok":true,"id":"8cb7299cc68d35a2ca4a0c18070009be","rev":"2-e51a077b62b9bfbc8faac8aff60733b4"}[info] [<0.774.0>] 127.0.0.1 - - 'PUT' /krug/8cb7299cc68d35a2ca4a0c18070009be 201[~] ➔ curl http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be[info] [<0.1264.0>] 127.0.0.1 - - 'GET' /krug/8cb7299cc68d35a2ca4a0c18070009be 200{"_id":"8cb7299cc68d35a2ca4a0c18070009be","_rev":"2-e51a077b62b9bfbc8faac8aff60733b4","Temat":"Witaj okrutny \u015bwiecie!"}[~] ➔

Page 15: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 15

RESTRESTfulful JSON JSON APIAPI

[~] ➔ curl http://localhost:5984/[info] [<0.95.0>] 127.0.0.1 - - 'GET' / 200{"couchdb":"Welcome","version":"0.11.0"}[~] ➔ curl -X PUT http://localhost:5984/krug[info] [<0.124.0>] 127.0.0.1 - - 'PUT' /krug 201{"ok":true}[~] ➔ curl -X POST http://localhost:5984/krug -d '{"Temat": "Witaj świecie!"}'[info] [<0.216.0>] 127.0.0.1 - - 'POST' /krug 201{"ok":true,"id":"8cb7299cc68d35a2ca4a0c18070009be","rev":"1-4777d27f9e980ed1ce8cf94c0bc1d27a"}[~] ➔ curl -X PUT http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be \> -d '{"Temat": "Witaj okrutny świecie!"}'[info] [<0.668.0>] 127.0.0.1 - - 'PUT' /krug/8cb7299cc68d35a2ca4a0c18070009be 409{"error":"conflict","reason":"Document update conflict."}[~] ➔ curl -X PUT http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be \> -d '{"_rev":"1-4777d27f9e980ed1ce8cf94c0bc1d27a", "Temat": "Witaj okrutny świecie!"}'{"ok":true,"id":"8cb7299cc68d35a2ca4a0c18070009be","rev":"2-e51a077b62b9bfbc8faac8aff60733b4"}[info] [<0.774.0>] 127.0.0.1 - - 'PUT' /krug/8cb7299cc68d35a2ca4a0c18070009be 201[~] ➔ curl http://localhost:5984/krug/8cb7299cc68d35a2ca4a0c18070009be[info] [<0.1264.0>] 127.0.0.1 - - 'GET' /krug/8cb7299cc68d35a2ca4a0c18070009be 200{"_id":"8cb7299cc68d35a2ca4a0c18070009be","_rev":"2-e51a077b62b9bfbc8faac8aff60733b4","Temat":"Witaj okrutny \u015bwiecie!"}[~] ➔

Page 16: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 16

Coś więcej niż wymyślny Coś więcej niż wymyślny serwer plików.serwer plików.

http://www.flickr.com/photos/santos/1704875109/http://www.flickr.com/photos/santos/1704875109/

Page 17: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 17

WidokiWidoki

● Są przechowywane jako dokumenty,● definiują dowolne funkcje map i reduce,● służą do budowy wydajnych indeksów,● pozwalają na niezależne przetwarzanie pojedynczych

dokumentów i zwrócenie ich w pożądanym formacie,● generowane równolegle, inkrementalnie i na żądanie,● brak dynamicznych zapytań („close to the metal”),● rozbudowane API.

Page 18: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 18

Map ReduceMap Reduce

GET /_design/comments/_view/cenzor?limit=11&reduce=falseGET /_design/comments/_view/cenzor?limit=11&reduce=false& startkey=[<id>, <rok>, <miesiąc>, <dzień>]& endkey=[<id>, <rok>, <miesiąc>, <dzień>+3]

GET /_design/comments/_view/cenzor?limit=11&group=true&group_level=3GET /_design/comments/_view/cenzor?group=true&group_level=1&key=[<id>]

Page 19: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 19

ReplikacjeReplikacje

● Dwustronne, inkrementalne,● replikacja podzbioru (przez filtry),● rozwiązywanie konfliktów.

● Łatwe skalowanie wszerz,● praca off-line.

curl -X POST http://localhost:5984/_replicate -d {"source": "http://couch.db/remote", "target": "local"}

korzyści

Page 20: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 20

ReplikacjeReplikacje

http://www.slideshare.net/mlmilleratmit/20100310-miller-sts

Page 21: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 21

RubyRuby

Page 22: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 22

CouchrestCouchrest

CouchrestCouchrest

Page 23: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 23

Page 24: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 24

Couch_fooCouch_foo

Page 25: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 25

Page 26: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 26

Couch_potatoCouch_potato

Page 27: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 27

Page 28: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 28

em_proxyem_proxy

Page 29: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 29

Page 30: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 30

O czym nie mówiłem?O czym nie mówiłem?

● Couchdb-Lucene – pełno-tekstowa wyszukiwarka dokumentów CouchDB,

● Couchdb-Lounge – proxy framework do partycjonowania CouchDB,

● CouchApps - samowystarczalne aplikacje CouchDB,● bezpieczeństwo,● binarne załączniki,● walidacja dokumentów,● BrowserCouch – CouchDB w przeglądarce.

Page 31: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 31

Więcej o CouchDB na:Więcej o CouchDB na:

● http://couchdb.apache.org/

● http://www.couch.io/

● http://wiki.apache.org/couchdb/

● http://books.couchdb.org/relax/

Oraz:

● http://stackoverflow.com/questions/tagged/couchdb

● http://www.reddit.com/search?q=couchdb

Page 32: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 32

Dziękuję za uwagę.Dziękuję za uwagę.

Page 33: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 33

Fork me:Fork me:github.com/Stanleygithub.com/Stanley

Page 34: Couchdb w Ruby'm

20.04.2010 Stanisław Wasiutyński 34

Pytania?Pytania?