SlideShare a Scribd company logo
1 of 53
A WEBRE TERMETT
   ADATBÁZIS
ÉRDI BÁLINT
(ruby) web developer
        @baaz
http://bucionrails.com
“Django may be built for the Web, but
CouchDB is built of the Web. I’ve never seen
software that so completely embraces the
philosophies behind HTTP.”
      Jacob Kaplan-Moss, a Django egyik megalkotója
DOKUMENTUM ALAPÚ
SÉMA NÉLKÜLI
ELOSZTOTT
HIBATŰRŐ
SKÁLÁZHATÓ
RESTFUL HTTP/JSON API
minnesotaindependent.com




KOOL!
KÖSZÖNÖM.
 KÉRDÉSEK?
ÁTTEKINTÉS

• Történet

• CouchDB, mint    DB

 • fő   tulajdonságok

 • adatbázis   kezelés (elvek és gyakorlat)

 • teljesítmény   avagy “a színes oszlopokat akarom”

• CouchDB    mint standalone application
TÖRTÉNET


• Damien   Katz hobbiprojektje

• Apache   open source projekt (2008-)

• Erlang: funkcionális, konkurrens

• 0.10.0
COUCHDB, MINT DB
DOKUMENTUM ALAPÚ

• rekordok   helyett dokumentumok

• “evolving, self-contained   documents”

• JSON

• típusok: minden, ami   valid JSON

• inkrementált   id helyett UUID (universally unique)
{
    “_id” : “BE2298A127D”,
    “_rev” : “2-5d0319b075a”,
    “type” : “book”,
    “title” : “CouchDB: The definitive
    guide”,
    “authors” :
     [“J. Chris Anderson”, “Jan
     Lehnardt”, “Noah Slater”],
    “published_year”: 2009,
    “categories” : [“db”, “web”]
}
{
    “_id” : “BE2298A127D”,
    “_rev” : “2-5d0319b075a”,
    “type” : “book”,
    “title” : “CouchDB: The definitive
    guide”,
    “authors” :
     [“J. Chris Anderson”, “Jan
     Lehnardt”, “Noah Slater”],
    “published_year”: 2009,
    “categories” : [“db”, “web”]
}
SÉMA NÉLKÜLI


• Az   igazi világ nem (mindig) sematikus

• nem     kell előre tervezni

• nincs   szükség migrációra

• ugyanaz    a típus != ugyanaz a séma
ELOSZTOTT, HIBATŰRŐ
• clustering   replikáció segítségével

• “crash-only    design”

• nincs   shut-down process, egyszerűen csak terminál

• nincs   felülírás, mindig csak a db file végére ír

• write   & commit (két fázisban)

• nem     kell consistency-check v. fix-up újraindításkor
HTTP API

• minden   adatbázisműveletre

• adatbázis   létrehozás és törlés

• dokumentum       létrehozás és lekérés (view query)

• kliensek: curl, wget, FF, Safari, stb. :)

• “webre   termett”
CREATE: PUT http://localhost:5984/webkonf/
     couchdb_eloadas -d {‘title’: ...}

 READ: GET http://localhost:5984/webkonf/
          couchdb_eloadas
UPDATE: PUT http://localhost:5984/webkonf/
     couchdb_eloadas -d {‘title’: ...}

DELETE: DELETE http://localhost:5984/webkonf/
         couchdb_eloadas?rev=...
CAP


• Consistency: Minden     kliens ugyanazt az adatot látja

• Availability: Minden   kliens megkapja az adat valamelyik verzióját

• Partition   tolerance: Az adatbázis szétosztható több szerverre
CAP ELV: VÁLASSZ 2-T
“Each node in a system should be able to make
decisions purely based on local state. If you
need to do something under high load with
failures occurring and you need to reach
agreement, you’re lost…”
    Werner Vogels, Amazon CTO and Vice President
AVAILABILITY >
                   CONSISTENCY

• nagy   forgalmú, elosztott rendszereknél életbevágó

• minden   adat megvan a node-on

• minden   kérés rögtön megkapja a dok. valamely verzióját

• replikáció   után konzisztens (“eventual consistency”)
HOGYAN? MVCC

• Multi Version   Concurrency Control

• minden     íráskor új verzió keletkezik

• az   írás alatt beérkező olvasások a régi verziót kapják meg

•a   CouchDB a _rev mezőt automatikusan növeli

• írás   csak a legutolsó _rev átadásával lehetséges
CONFLICT MANAGEMENT

• u. azon   dokumentum két helyen változik meg

• két   verzió keletkezik

• replikációkor   konfliktus (_conflicts mező)

• determinisztikus   nyertes

• az   app feladata a konfliktus feloldása
ADATTÁROLÁS

• B-treeben

 •1   B-tree / adatbázis

 •1   B-tree / view

• DocId-vel   indexelve

• Query   key-jel v. key range-dzsel nagyon gyors: O(log N)
ADATTÁROLÁS 2.



• nincs   felül-, csak hozzáírás (“append-only”)

• compaction: a    régi verziókat lenyesi
DESIGN DOKUMENTUM


• nem     adatot, design elemeket tárol

• view-k, show    és list functionök, stb.

• mindenben     megegyezik az “adatdokumentumokkal”

• lehet   több is egy adatbázisban
REPLIKÁCIÓ

• adat   szinkronizáció módja

• két   adatbázis között

• inkrementális: csak   az új ill. módosult dokumentumok
 replikálódnak

• mindig     egyirányú (source és target)

• indított   és folyamatos (>= 0.10.0) replikáció
VALIDÁCIÓ


•a   régi dok., az új dok. és a user alapján

• true   : mehet, false v. raise: nem

• alkalmas   hozzáférés kezelésre is
LEKÉRDEZÉS

• csak   view-kon keresztül

• view: map    + reduce funkciópár

• indexelt   (B-treeben)

• javascript

• kevésbé    flexibilis, mint az SQL, de indexelt

•a   view a design dokumentumban tárolódik
MAP


• először   minden dokumentumon végigmegy

• utána   csak dok. változáskor fut le

• mindegyikhez    0..n key-value párt generál a view-ban

•a   kimenet key szerint rendezve van!
function map(doc) {
 if ( doc.type == “book” ) {
    if ( doc.title ) {
     emit(doc.title, doc)
    }
 }
}
REDUCE

• opcionális

• aggregáló    funkció

• inputja   lehet

  •a   Map által generált sor

  • előző    reduce által generált sor (rereduce)
function reduce (keys, values,
rereduce) {
  if (rereduce) {
    return sum(values);
  } else {
    return values.length;
  }
}
QUERY PARAMÉTEREK

•=   http query paraméterek :)

• key

• startkey, endkey

• group, group_level

• reduce

• descending
www.graphicshunt.com




HÁNY REQ/S, HÁNY REQ/S?
TELJESÍTMÉNY


• hangsúly   a megbízhatóságon és a concurrency-n

• megbízhatóság     vs. req/s

• “fast   enough”
“The ab (apache bench) utility has (or had at
the time) a hardcoded limit of 20000
concurrent connections. CouchDB didn't
sweat when ab started failing”
                 Jan Lehnardt, CouchDB team
BENCHMARKING


• nehéz

• reprodukálhatónak   kell lennie

•a   kontextus is fontos

• standard   benchmark hiánya
STANDALONE APP
“COUCHAPP”

• web    szerver + document database

• html   és js file attachmentek a design dochoz

• Javascript-tel   lehet kommunikálni a szerverrel

• offline   mód megoldva

• deployment       = replikáció

• shareable   apps!
P2P WEB: A JÖVŐ ZENÉJE?

• minden    eszközön (laptop, mobil, stb.) fut egy CouchDB
 szerver

• replikáció   a peerek között

•a   design dok. (view-k, list functionök, validációk) is replikálódik

• push   és pull

• Ubuntu    következő verziójában (Karmic Koala) alapból lesz
SHOW FUNCTIONS


•a   JSON dokumentumokat más Content-type-re konvertálja

• input: a   dok. és a Content-type

• ETag   support
LIST FUNCTIONS


•a   view kimenetét konvertálja

• bármely   view-val futtathatóak

• input: meta-információ        (“head”) és a request

• pl. feed-ek   előállítására
SHOW, LIST, VIEW FUNCTIONS

• nem   érhet el külső resource-okat (ismételhető)

• side-effect   mentes (nem írhat a DB-be, nem indíthat process-
 eket, stb.)

• cache-elhető

• egyfunctiont egy dokra csak egyszer kell lekérdezni, utána
 cache-ből!
BIZTONSÁG


• beépített   cookie-alapú autentikáció (_session)

• admin   account-ok

• dok.-hoz    tartozó reader lista

• proxy   server-rel az API tetszőleges része elrejthető
COUCHAPP-EK
• Futon, a   CouchDB admin interface-e

• Nymphormation: http://nymphormation.org/

• Boom Amazing: http://github.com/langalex/boom_amazing

• Swinger: http://github.com/quirkey/swinger

• Real-timegroup calendar: http://jchrisa.net/cal/_design/cal/
 index.html

• CouchDB    twitter client: http://github.com/jchris/couchdb-
 twitter-client
KÖSZÖNÖM, KÉRDÉSEK?

More Related Content

Similar to Couchdb - WebKonf 2009

Szerver oldali fejlesztés korszerű módszerekkel C# nyelven
Szerver oldali fejlesztés korszerű módszerekkel C# nyelvenSzerver oldali fejlesztés korszerű módszerekkel C# nyelven
Szerver oldali fejlesztés korszerű módszerekkel C# nyelvenKrisztián Gyula Tóth
 
Mi a baj a Drupaloddal
Mi a baj a DrupaloddalMi a baj a Drupaloddal
Mi a baj a Drupaloddalthesnufkin
 
Fejlesztési kihívások a pénzügyi szektorban
Fejlesztési kihívások a pénzügyi szektorbanFejlesztési kihívások a pénzügyi szektorban
Fejlesztési kihívások a pénzügyi szektorbanPal Vojacsek
 
BlackBerry10 alapú natív alkalmazásfejlesztés
BlackBerry10 alapú natív alkalmazásfejlesztésBlackBerry10 alapú natív alkalmazásfejlesztés
BlackBerry10 alapú natív alkalmazásfejlesztésOpen Academy
 
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezni
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezniAmit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezni
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezniFerenc Szalai
 
Life and Death of Apache Maven (HU)
Life and Death of Apache Maven (HU)Life and Death of Apache Maven (HU)
Life and Death of Apache Maven (HU)Tamas Cservenak
 
Swift -Helyzetjelentés az iOS programozás új nyelvéről
Swift -Helyzetjelentés az iOS programozás új nyelvérőlSwift -Helyzetjelentés az iOS programozás új nyelvéről
Swift -Helyzetjelentés az iOS programozás új nyelvérőlBalaBit
 
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?Webműves Kelemen tanácsai, avagy mi kell a PHP falába?
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?Open Academy
 
Az online hirdetéskiszolgálás technológiai kihívásai
Az online hirdetéskiszolgálás technológiai kihívásaiAz online hirdetéskiszolgálás technológiai kihívásai
Az online hirdetéskiszolgálás technológiai kihívásaiAdverticum
 
Laravel - Veszprémi Technology Meetup
Laravel - Veszprémi Technology MeetupLaravel - Veszprémi Technology Meetup
Laravel - Veszprémi Technology MeetupBálint Szekeres
 
Több app fejlesztése egy kódbázisból Androidon
Több app fejlesztése egy kódbázisból AndroidonTöbb app fejlesztése egy kódbázisból Androidon
Több app fejlesztése egy kódbázisból AndroidonRichard Radics
 

Similar to Couchdb - WebKonf 2009 (15)

Szerver oldali fejlesztés korszerű módszerekkel C# nyelven
Szerver oldali fejlesztés korszerű módszerekkel C# nyelvenSzerver oldali fejlesztés korszerű módszerekkel C# nyelven
Szerver oldali fejlesztés korszerű módszerekkel C# nyelven
 
Mi a baj a Drupaloddal
Mi a baj a DrupaloddalMi a baj a Drupaloddal
Mi a baj a Drupaloddal
 
Advanced PL/SQL (HUN)
Advanced PL/SQL (HUN)Advanced PL/SQL (HUN)
Advanced PL/SQL (HUN)
 
Fejlesztési kihívások a pénzügyi szektorban
Fejlesztési kihívások a pénzügyi szektorbanFejlesztési kihívások a pénzügyi szektorban
Fejlesztési kihívások a pénzügyi szektorban
 
Ci
CiCi
Ci
 
BlackBerry10 alapú natív alkalmazásfejlesztés
BlackBerry10 alapú natív alkalmazásfejlesztésBlackBerry10 alapú natív alkalmazásfejlesztés
BlackBerry10 alapú natív alkalmazásfejlesztés
 
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezni
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezniAmit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezni
Amit mindig is tudni akartál az LDAP-ról, de sosem merted megkérdezni
 
Life and Death of Apache Maven (HU)
Life and Death of Apache Maven (HU)Life and Death of Apache Maven (HU)
Life and Death of Apache Maven (HU)
 
Linux alapok
Linux alapokLinux alapok
Linux alapok
 
Swift -Helyzetjelentés az iOS programozás új nyelvéről
Swift -Helyzetjelentés az iOS programozás új nyelvérőlSwift -Helyzetjelentés az iOS programozás új nyelvéről
Swift -Helyzetjelentés az iOS programozás új nyelvéről
 
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?Webműves Kelemen tanácsai, avagy mi kell a PHP falába?
Webműves Kelemen tanácsai, avagy mi kell a PHP falába?
 
Az online hirdetéskiszolgálás technológiai kihívásai
Az online hirdetéskiszolgálás technológiai kihívásaiAz online hirdetéskiszolgálás technológiai kihívásai
Az online hirdetéskiszolgálás technológiai kihívásai
 
Chef
ChefChef
Chef
 
Laravel - Veszprémi Technology Meetup
Laravel - Veszprémi Technology MeetupLaravel - Veszprémi Technology Meetup
Laravel - Veszprémi Technology Meetup
 
Több app fejlesztése egy kódbázisból Androidon
Több app fejlesztése egy kódbázisból AndroidonTöbb app fejlesztése egy kódbázisból Androidon
Több app fejlesztése egy kódbázisból Androidon
 

Couchdb - WebKonf 2009

  • 1. A WEBRE TERMETT ADATBÁZIS
  • 2. ÉRDI BÁLINT (ruby) web developer @baaz http://bucionrails.com
  • 3. “Django may be built for the Web, but CouchDB is built of the Web. I’ve never seen software that so completely embraces the philosophies behind HTTP.” Jacob Kaplan-Moss, a Django egyik megalkotója
  • 12. ÁTTEKINTÉS • Történet • CouchDB, mint DB • fő tulajdonságok • adatbázis kezelés (elvek és gyakorlat) • teljesítmény avagy “a színes oszlopokat akarom” • CouchDB mint standalone application
  • 13. TÖRTÉNET • Damien Katz hobbiprojektje • Apache open source projekt (2008-) • Erlang: funkcionális, konkurrens • 0.10.0
  • 15. DOKUMENTUM ALAPÚ • rekordok helyett dokumentumok • “evolving, self-contained documents” • JSON • típusok: minden, ami valid JSON • inkrementált id helyett UUID (universally unique)
  • 16. { “_id” : “BE2298A127D”, “_rev” : “2-5d0319b075a”, “type” : “book”, “title” : “CouchDB: The definitive guide”, “authors” : [“J. Chris Anderson”, “Jan Lehnardt”, “Noah Slater”], “published_year”: 2009, “categories” : [“db”, “web”] }
  • 17. { “_id” : “BE2298A127D”, “_rev” : “2-5d0319b075a”, “type” : “book”, “title” : “CouchDB: The definitive guide”, “authors” : [“J. Chris Anderson”, “Jan Lehnardt”, “Noah Slater”], “published_year”: 2009, “categories” : [“db”, “web”] }
  • 18. SÉMA NÉLKÜLI • Az igazi világ nem (mindig) sematikus • nem kell előre tervezni • nincs szükség migrációra • ugyanaz a típus != ugyanaz a séma
  • 19. ELOSZTOTT, HIBATŰRŐ • clustering replikáció segítségével • “crash-only design” • nincs shut-down process, egyszerűen csak terminál • nincs felülírás, mindig csak a db file végére ír • write & commit (két fázisban) • nem kell consistency-check v. fix-up újraindításkor
  • 20. HTTP API • minden adatbázisműveletre • adatbázis létrehozás és törlés • dokumentum létrehozás és lekérés (view query) • kliensek: curl, wget, FF, Safari, stb. :) • “webre termett”
  • 21. CREATE: PUT http://localhost:5984/webkonf/ couchdb_eloadas -d {‘title’: ...} READ: GET http://localhost:5984/webkonf/ couchdb_eloadas UPDATE: PUT http://localhost:5984/webkonf/ couchdb_eloadas -d {‘title’: ...} DELETE: DELETE http://localhost:5984/webkonf/ couchdb_eloadas?rev=...
  • 22. CAP • Consistency: Minden kliens ugyanazt az adatot látja • Availability: Minden kliens megkapja az adat valamelyik verzióját • Partition tolerance: Az adatbázis szétosztható több szerverre
  • 24. “Each node in a system should be able to make decisions purely based on local state. If you need to do something under high load with failures occurring and you need to reach agreement, you’re lost…” Werner Vogels, Amazon CTO and Vice President
  • 25. AVAILABILITY > CONSISTENCY • nagy forgalmú, elosztott rendszereknél életbevágó • minden adat megvan a node-on • minden kérés rögtön megkapja a dok. valamely verzióját • replikáció után konzisztens (“eventual consistency”)
  • 26. HOGYAN? MVCC • Multi Version Concurrency Control • minden íráskor új verzió keletkezik • az írás alatt beérkező olvasások a régi verziót kapják meg •a CouchDB a _rev mezőt automatikusan növeli • írás csak a legutolsó _rev átadásával lehetséges
  • 27. CONFLICT MANAGEMENT • u. azon dokumentum két helyen változik meg • két verzió keletkezik • replikációkor konfliktus (_conflicts mező) • determinisztikus nyertes • az app feladata a konfliktus feloldása
  • 28. ADATTÁROLÁS • B-treeben •1 B-tree / adatbázis •1 B-tree / view • DocId-vel indexelve • Query key-jel v. key range-dzsel nagyon gyors: O(log N)
  • 29. ADATTÁROLÁS 2. • nincs felül-, csak hozzáírás (“append-only”) • compaction: a régi verziókat lenyesi
  • 30. DESIGN DOKUMENTUM • nem adatot, design elemeket tárol • view-k, show és list functionök, stb. • mindenben megegyezik az “adatdokumentumokkal” • lehet több is egy adatbázisban
  • 31. REPLIKÁCIÓ • adat szinkronizáció módja • két adatbázis között • inkrementális: csak az új ill. módosult dokumentumok replikálódnak • mindig egyirányú (source és target) • indított és folyamatos (>= 0.10.0) replikáció
  • 32. VALIDÁCIÓ •a régi dok., az új dok. és a user alapján • true : mehet, false v. raise: nem • alkalmas hozzáférés kezelésre is
  • 33. LEKÉRDEZÉS • csak view-kon keresztül • view: map + reduce funkciópár • indexelt (B-treeben) • javascript • kevésbé flexibilis, mint az SQL, de indexelt •a view a design dokumentumban tárolódik
  • 34. MAP • először minden dokumentumon végigmegy • utána csak dok. változáskor fut le • mindegyikhez 0..n key-value párt generál a view-ban •a kimenet key szerint rendezve van!
  • 35. function map(doc) { if ( doc.type == “book” ) { if ( doc.title ) { emit(doc.title, doc) } } }
  • 36. REDUCE • opcionális • aggregáló funkció • inputja lehet •a Map által generált sor • előző reduce által generált sor (rereduce)
  • 37. function reduce (keys, values, rereduce) { if (rereduce) { return sum(values); } else { return values.length; } }
  • 38. QUERY PARAMÉTEREK •= http query paraméterek :) • key • startkey, endkey • group, group_level • reduce • descending
  • 40. TELJESÍTMÉNY • hangsúly a megbízhatóságon és a concurrency-n • megbízhatóság vs. req/s • “fast enough”
  • 41. “The ab (apache bench) utility has (or had at the time) a hardcoded limit of 20000 concurrent connections. CouchDB didn't sweat when ab started failing” Jan Lehnardt, CouchDB team
  • 42. BENCHMARKING • nehéz • reprodukálhatónak kell lennie •a kontextus is fontos • standard benchmark hiánya
  • 43.
  • 45. “COUCHAPP” • web szerver + document database • html és js file attachmentek a design dochoz • Javascript-tel lehet kommunikálni a szerverrel • offline mód megoldva • deployment = replikáció • shareable apps!
  • 46. P2P WEB: A JÖVŐ ZENÉJE? • minden eszközön (laptop, mobil, stb.) fut egy CouchDB szerver • replikáció a peerek között •a design dok. (view-k, list functionök, validációk) is replikálódik • push és pull • Ubuntu következő verziójában (Karmic Koala) alapból lesz
  • 47.
  • 48. SHOW FUNCTIONS •a JSON dokumentumokat más Content-type-re konvertálja • input: a dok. és a Content-type • ETag support
  • 49. LIST FUNCTIONS •a view kimenetét konvertálja • bármely view-val futtathatóak • input: meta-információ (“head”) és a request • pl. feed-ek előállítására
  • 50. SHOW, LIST, VIEW FUNCTIONS • nem érhet el külső resource-okat (ismételhető) • side-effect mentes (nem írhat a DB-be, nem indíthat process- eket, stb.) • cache-elhető • egyfunctiont egy dokra csak egyszer kell lekérdezni, utána cache-ből!
  • 51. BIZTONSÁG • beépített cookie-alapú autentikáció (_session) • admin account-ok • dok.-hoz tartozó reader lista • proxy server-rel az API tetszőleges része elrejthető
  • 52. COUCHAPP-EK • Futon, a CouchDB admin interface-e • Nymphormation: http://nymphormation.org/ • Boom Amazing: http://github.com/langalex/boom_amazing • Swinger: http://github.com/quirkey/swinger • Real-timegroup calendar: http://jchrisa.net/cal/_design/cal/ index.html • CouchDB twitter client: http://github.com/jchris/couchdb- twitter-client