Dokumentenorientierte Datenbanken Eine Einführung am Beispiel von CouchDB
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
Agenda Schemalosigkeit und Dokumente CouchDB ... und Lotus Domino? ReST on the CouchDB  Batteries included Map & Reduce Anwendungsbeispiele CouchDB ... und sonst noch?
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 ;)
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
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)
CouchDB
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
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
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
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
Batteries Included Apache Futon, eine eingebaute GUI Versionierung von Dokumenten Authentifizierung via HTTP ReST API JavaScript & JSON Plugins für weitere Sprachen
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
Map & Reduce
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
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); } }
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); }
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“
Replikation
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
Anwendungsbeispiele
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
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
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)
CouchDB ... und sonst noch?
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
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
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
Vielen Dank für die Aufmerksamkeit!
Fragen

Dokumentenorientiere Datenbanken am Beispiel CouchDB

  • 1.
    Dokumentenorientierte Datenbanken EineEinfü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 undDokumente CouchDB ... und Lotus Domino? ReST on the CouchDB Batteries included Map & Reduce Anwendungsbeispiele CouchDB ... und sonst noch?
  • 4.
    Schema? Nein! Trennungnach 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 „inetwa“ 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 HerangehensweisenDirekt 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.
  • 8.
    CouchDB Erfinder istDamien 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 ähnlichesVerhalten 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 theCouch 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 ApacheFuton, eine eingebaute GUI Versionierung von Dokumenten Authentifizierung via HTTP ReST API JavaScript & JSON Plugins für weitere Sprachen
  • 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
  • 17.
  • 18.
    Map & ReduceIst 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 - MapDie 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 Überdie 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 Nachteilevon 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.
  • 23.
    Replikation einfach gemachtReplikation 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.
  • 25.
    Arbit Tracker Geschriebenin 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 diedirekt 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 ... undsonst 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-basierteDatenbank 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ürdie Aufmerksamkeit!
  • 33.