É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)
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 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;
}
}
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ő
0 comments
Post a comment