Dokumentenorientiere Datenbanken am Beispiel CouchDB
-
Upload
mario-mueller -
Category
Technology
-
view
293 -
download
1
description
Transcript of Dokumentenorientiere Datenbanken am Beispiel CouchDB
1
Dokumentenorientierte Datenbanken
Eine Einführung am Beispiel von CouchDB
2
Wer bin ich?
Mario Müller, 27
TWT Interactive GmbH - Düsseldorf
PHP, Java, Groovy, Javascript, Python, Ruby
Webservices, SOA, Software Qualität, diverse Frameworks
MySQL, MongoDb, CouchDb
Mac-Head & Linux Enthusiast
Xing: http://bit.ly/mariomueller
Twitter: http://twitter.com/xenji
Github: http://github.com/xenji
3
Agenda
Schemalosigkeit und Dokumente
CouchDB ... und Lotus Domino?
ReST on the CouchDB
Batteries included
Map & Reduce
Anwendungsbeispiele
CouchDB ... und sonst noch?
4
Schema? Nein!
Trennung nach Datenbanken, einige kennen zusätzlich „Collections“ und „Subcollections“
Kein CREATE TABLE, kein ALTER TABLE
Keine feste Definition der Datenstruktur und der Datentypen
keine NULL Werte im RDBMS - Verständnis
... keine SQL Queries ;)
5
Dokumente
Entsprechen „in etwa“ einer Zeile in einer relationalen DB
Haben „beliebig“ viele Attribute in „beliebiger“ Verschachtelung
Normalisierung der Daten spielt eine geringere Rolle
Dokumente kennen keine Relationen zu anderen Dokumenten (Foreign Keys oder Constraints)
Viele Datenbanken können binäre Attachments verwalten
6
Abfragen
Verschiedene Herangehensweisen
Direkt per ID (eigentl. alle)
Map & Reduce (z. B. CouchDB, Amazon SDB)
Index (z. B. CouchDB, Google Bigtable)
Volltext Index (z. B. per Lucene für CouchDB)
7
CouchDB
8
CouchDB
Erfinder ist Damien Katz
Damien hat vorher Lotus Domino bei IBM (mit) entwickelt
CouchDB ist in Erlang geschrieben
Seit Nov. 2008 ein Apache Top-Level Projekt
Läuft auf allen Systemen, dank der Erlang VM
connect(Host, User, Password) -> {ftp_server,Host} ! {connect,self(),User,Password}, receive {ftp_server, Reply} -> Reply; Other -> Other after 10000 -> timeout end
Erlang Beispiel
9
Herausragend
ACID ähnliches Verhalten bei der Datenspeicherung dank MVCC Implementierung
Map & Reduce als Abfrage-Sprache/Filter in Form von Views
Entwickelt für verteilte Systeme, omni-direktionale Synchronisation
Alle Dokumente sind im JSON Format abzubilden
10
ReST on the Couch
CouchDB wird via ReST angesprochen
Dokumente
PUT /dbname
GET /dbname/id
POST /dbname/(id)
DELETE /dbname/id
Datenbanken werden nach dem selben Prinzip behandelt
11
MVCC
MVCC = Multi-Version Concurrency Control
Dokumente werden Versioniert
Kommt eine Revision zustande, bekommen alle Requests solange den alten Stand, bis der neue geschrieben ist
Verhindert jegliches Locking auf Dokument- oder Attributslevel
Daraus resultiert eine sehr hohe Abfrage-Performance
12
Batteries Included
Apache Futon, eine eingebaute GUI
Versionierung von Dokumenten
Authentifizierung via HTTP
ReST API
JavaScript & JSON
Plugins für weitere Sprachen
13
14
15
PHP Bibliotheken
Zend_Http_Client, http://framework.zend.com
PHPillow, http://kore-nordmann.de/projects/phpillow/index.html
CouchPHP, http://svn.pollinimini.net/couchphp/trunk/
PHPCouch, http://www.phpcouch.org/
CouchDB C-Extension, http://www.topdog.za.net/php_couchdb_extension
16
17
Map & Reduce
18
Map & Reduce
Ist eine Art, Datenbestände abzufragen,
Die Kombination von Map&Reduce nennt CouchDB „View“
Besteht aus zwei/drei nacheinander gelagerten Schritten, wobei der Reduce Schritt n-Mal wiederholt werden kann
Map
Bildet Paare aus Schlüssel und Wert
Für jedes Element aus der gesamten Datenmenge
Reduce / Rereduce
Übernimmt die Zwischenergebnisse aus der Map-Phase oder der vorherigen Reduce-Phase (= Rereduce)
Kann Berechnungen auf Basis der Daten durchführen
19
Beispiel - Map
Die Map-Funktion emittiert alle Tags aus der Liste jedes Dokuments
Der Key ist die String-Repräsentation des Tags
Der Key ist der Wert für genau diesen Tag
Über Werte != 1 könnte man eine Gewichtung abbilden.
CouchDB unterstützt Range-Angaben in Views
function(doc) { for (tag in doc.tags) {
emit(doc.tags[tag], 1); }}
20
Beispiel Map&Reduce
Über die Reduce-Funktion wird die Summe der Werte ermittelt
Die Reduce-Funktion bekommt alle Werte aus der Map, also das gesamte Zwischenergebnis
Damit die Vorkommnisse der Tags gezählt werden, muss in CouchDB der View mit dem Parameter „group“ aufgerufen werden. Damit werden doppelte Keys vor dem Reduce zusammengeführt. Dieser Vorgang wird auch „Combine“ Phase genannt
Beim Combine werden nur die Keys gruppiert, nicht die Werte. Bei 12 Tags bleibt 12x der Wert 1 stehen, alle gleichen Keys (= Tags) werden jedoch Gruppiert. => Tag - Cloud Beispiel!
function(doc) { for (tag in doc.tags) {
emit(doc.tags[tag], 1); }}
function(keys, values) {return sum(values);
}
21
Vor- und Nachteile von Map & Reduce
Vorteile
Hohes Maß an Parallelisierung möglich
Komplexe Ergebnismengen sind möglich
In CouchDB ist das Anlegen und Abfragen von Views sehr einfach
Nachteile
Simple „WHERE“ Abfragen sind kaum möglich
Ohne Parallelisierung mit erhöhter Komplexität wenig sinnvoll
Keine Indizes auf Feld-Ebene -> „Alles oder nichts“
22
Replikation
23
Replikation einfach gemacht
Replikation findet über HTTP statt
Konfiguration über Futon
Dokumente werden auf Attributsbasis synchronisiert
Konflikte werden werden, sofern möglich, automatisch behoben
Unlösbare Konflikte werden ausgesteuert und im Futon angezeigt
24
Anwendungsbeispiele
25
Arbit Tracker
Geschrieben in PHP5.3
von Kore Nordmann
Nutzt CouchDB als alleinige Datenbank
Nutzt Zend_Seach_Lucene als Volltext-Suche
Infos http://arbitracker.org/news.html
26
CouchApps
Applikationen die direkt auf der CouchDB ausgeführt werden
Bestehen aus HTML5 und Javascript
Infos unter http://couchapp.org
Beispiel App „Blue Ink“ ist ein kleines CMS basierend auf CouchDB
Infos http://www.bigbluehat.com/products/blueink_cms
27
Sonstige Anwendungsgebiete
Content / Webservice Caching
Queue Persistenz
Personen Datenbank (ähnlich Filemaker oder Access)
Warenkorb für ein Shop System
Blogs
Map & Reduce Engine für RDBMS (es gibt sicherlich bessere M&R Frameworks)
28
CouchDB ... und sonst noch?
29
MongoDB
Funktionsumfang „ähnlich“ zu CouchDB
Es gibt Attributs-basierte Indexe
Generell auf hohe Performanz ausgelegt
Keine Versionierung
Map & Reduce ist für die Verarbeitung von Daten intern, nicht für die Abfrage
Native PHP C-Extension und div. Bibliotheken vorhanden
Kein MVCC, sondern update-in-place, => BASE statt ACID
30
Amazon SimpleDB
Cloud-basierte Datenbank
SOAP & ReST-ähnliche API
Jede Query darf max. 5 Sekunden dauern (von Amazon festgelegt)
Format ist XML, kein JSON
PHP Adapter von Amazon bereitgestellt
Kostenpflichtig
In Deutschland wg. Datenschutz nicht für pers. Bez. Daten einsetzbar
31
Google Bigtable (AppEngine)
Gibt es nativ nur für Python & Java
Kann per Quercus auch für PHP verwendet werden
„Endloser Speicher“ für normale Inhalte
Begrenzter Speicher für Binärdaten
Abfragemöglichkeiten eingeschränkt vorhanden
In Deutschland wg. Datenschutz eingeschränkt für pers. Bez. Daten einsetzbar
32
Vielen Dank für die Aufmerksamkeit!
33
Fragen