NoSQL - Die Onleihe

Werbung
stefan EDLICH
achim FRIEDLAND
jens HAMPE
benjamin BRAUER
markus BRÜCKNER
2. Auflage
N SQL
EINSTIEG IN DIE WELT
NICHTRELATIONALER
WEB 2.0 DATENBANKEN
EXTRA: Mit kostenlosem E-Book
NEU: Jetzt mit Kapiteln zu OrientDB
und Membase
Inhalt
Geleitwort...................................................................................................... XIII
Vorwort............................................................................................................ XV
Vorwort zur 2. Auflage...............................................................................................................XVII
1Einführung................................................................................................. 1
1.1Historie......................................................................................................................................1
1.2 Definition und Diskussion.................................................................................................... 2
1.3 Kategorisierung von NoSQL-Systemen............................................................................... 5
1.3.1Key/Value-Systeme..................................................................................................... 7
1.3.2Column-Family-Systeme............................................................................................ 7
1.3.3 Document Stores......................................................................................................... 8
1.3.4Graphdatenbanken..................................................................................................... 8
1.4Fazit.......................................................................................................................................... 9
2
NoSQL – Theoretische Grundlagen........................................................11
2.1Map/Reduce............................................................................................................................12
2.1.1 Funktionale Ursprünge.............................................................................................12
2.1.2 Phasen und Datenfluss............................................................................................. 17
2.1.3 Komponenten und Architektur................................................................................19
2.1.4 Anwendungsbereiche und Implementierungen.................................................. 22
2.1.5 Praktisches Beispiel................................................................................................. 24
2.1.6Zusammenfassung.................................................................................................... 28
2.2 CAP und Eventually Consistent.........................................................................................30
2.2.1 Konsistenzmodell relationaler Datenbanken.......................................................30
2.2.2CAP-Theorem..............................................................................................................31
2.2.3 Alternatives Konsistenzmodell: BASE...................................................................33
2.3Consistent-Hashing..............................................................................................................36
2.4 Multiversion Concurrency Control....................................................................................40
2.5 Vector Clocks.........................................................................................................................43
2.6Paxos....................................................................................................................................... 47
2.7REST.........................................................................................................................................51
2.7.1Web-scale?...................................................................................................................51
VI Inhalt
2.7.2Bausteine.................................................................................................................... 52
2.7.3 Entwurf von REST-Applikationen..........................................................................56
2.7.4 Skalierung von REST-Systemen.............................................................................59
2.7.5Fazit..............................................................................................................................61
3
Wide Column Stores...............................................................................63
3.1HBase......................................................................................................................................64
3.1.1Überblick....................................................................................................................64
3.1.2Allgemeines...............................................................................................................65
3.1.3Datenmodell...............................................................................................................65
3.1.4Installation................................................................................................................. 67
3.1.5CRUD-Operationen....................................................................................................69
3.1.6 Fortgeschrittene Abfragen mit Map/Reduce........................................................ 74
3.1.7 Skalierung und Konfiguration.................................................................................77
3.1.8Replikation................................................................................................................. 79
3.1.9Bewertung..................................................................................................................80
3.2Cassandra.............................................................................................................................. 82
3.2.1Allgemeines............................................................................................................... 82
3.2.2Installation.................................................................................................................83
3.2.3Datenmodell...............................................................................................................84
3.2.4CRUD-Operationen....................................................................................................88
3.2.5 Abfragen in Cassandra..............................................................................................91
3.2.6 Replikation und Skalierung....................................................................................93
3.2.7Bewertung.................................................................................................................. 94
3.3 Amazon SimpleDB................................................................................................................96
3.3.1Allgemeines............................................................................................................... 97
3.3.2Datenmodell............................................................................................................... 97
3.3.3 Datensicherheit und Datenschutz..........................................................................98
3.3.4Installation................................................................................................................. 99
3.3.5CRUD-Operationen.................................................................................................. 100
3.3.6 Zugriff mit dem AWS Toolkit für Eclipse..............................................................111
3.3.7 Replikation und Skalierung................................................................................... 114
3.3.8Bewertung................................................................................................................. 114
4
Document Stores...................................................................................117
4.1CouchDB................................................................................................................................ 118
4.1.1Überblick................................................................................................................... 118
4.1.2Beschreibung............................................................................................................ 118
4.1.3Datenmodell.............................................................................................................. 119
4.1.4View-Modell............................................................................................................. 120
4.1.5Zugriffskontrolle..................................................................................................... 120
4.1.6Installation................................................................................................................ 121
Inhalt VII
■■Inhalt
4.1.7CRUD-Operationen...................................................................................................123
4.1.8 Erstellen von Views................................................................................................. 127
4.1.9Replikation................................................................................................................128
4.1.10Skalierung.................................................................................................................129
4.1.11CouchApps................................................................................................................129
4.1.12Bewertung................................................................................................................ 130
4.2MongoDB............................................................................................................................... 131
4.2.1Überblick................................................................................................................... 131
4.2.2Datenmodell............................................................................................................. 133
4.2.3Installation................................................................................................................134
4.2.4CRUD-Operationen.................................................................................................. 135
4.2.5 Fortgeschrittene Abfragen und Map/Reduce..................................................... 140
4.2.6Skalierung.................................................................................................................143
4.2.7Replikation................................................................................................................145
4.2.8Bewertung.................................................................................................................148
5Key/Value-Datenbanken...................................................................... 151
5.1Redis......................................................................................................................................152
5.1.1Überblick...................................................................................................................152
5.1.2Allgemeines..............................................................................................................152
5.1.3Installation............................................................................................................... 153
5.1.4CRUD-Operationen...................................................................................................154
5.1.5 Redis Hashes............................................................................................................ 160
5.1.6 Redis Messaging...................................................................................................... 161
5.1.7 Zugriff aus anderen Programmiersprachen........................................................162
5.1.8 Replikation und Konfiguration............................................................................. 164
5.1.9Skalierung................................................................................................................ 166
5.1.10Bewertung................................................................................................................ 166
5.2Chordless............................................................................................................................. 168
5.2.1Überblick.................................................................................................................. 168
5.2.2Allgemeines..............................................................................................................169
5.2.3Installation................................................................................................................170
5.2.4CRUD-Operationen....................................................................................................171
5.2.5 Fortgeschrittene Abfragen......................................................................................173
5.2.6 Skalierung, Replikation und Konfiguration........................................................176
5.2.7Bewertung................................................................................................................. 177
5.3Riak........................................................................................................................................179
5.3.1Überblick...................................................................................................................179
5.3.2Allgemeines..............................................................................................................179
5.3.3Installation................................................................................................................182
5.3.4CRUD-Operationen...................................................................................................182
5.3.5 Zugriff aus anderen Programmiersprachen........................................................184
VIII Inhalt
5.3.6 Abfragen und Links in Riak...................................................................................187
5.3.7 Riak Search...............................................................................................................189
5.3.8 Skalierung, Replikation und Konfiguration....................................................... 190
5.3.9Bewertung................................................................................................................. 191
5.4Membase...............................................................................................................................193
5.4.1Überblick...................................................................................................................193
5.4.2Allgemeines..............................................................................................................193
5.4.3Installation................................................................................................................194
5.4.4 Architektur und Konzepte......................................................................................196
5.4.5 Das Memcached-Protokoll......................................................................................199
5.4.6 Zugriff aus anderen Programmiersprachen........................................................199
5.4.7 Skalierung und Replikation.................................................................................. 201
5.4.8 Der Moxi...................................................................................................................202
5.4.9 Die TAP-Schnittstelle..............................................................................................203
5.4.10Bewertung................................................................................................................204
6Graphdatenbanken...............................................................................207
6.1Mathematische und technische Grundlagen.................................................................209
6.1.1 Das allgemeine Graphenmodell............................................................................209
6.1.2 Das Property-Graph-Modell................................................................................... 210
6.1.3 Relationen höherer Ordnung.................................................................................213
6.1.4 Repräsentation von Graphen................................................................................. 217
6.1.5 Traversierung von Graphen...................................................................................219
6.1.6 Indizierung von Graphdaten..................................................................................221
6.1.7 Skalierung mittels Replikation und Partitionierung........................................ 222
6.1.8 Graph Query Languages........................................................................................ 225
6.1.9 Vergleich mit anderen Datenmodellen................................................................ 225
6.1.10Zusammenfassung.................................................................................................. 228
6.2 Der Tinkerpop Graph Processing Stack..........................................................................230
6.2.1Blueprints..................................................................................................................231
6.2.2Blueprints.NET........................................................................................................234
6.2.3Frames......................................................................................................................236
6.2.4 Pipes und Pipes.NET.............................................................................................. 237
6.2.5Gremlin.....................................................................................................................240
6.2.6Pacer.......................................................................................................................... 244
6.2.7Rexster...................................................................................................................... 244
6.3AllegroGraph.......................................................................................................................248
6.3.1Datenmodell............................................................................................................. 249
6.3.2Installation...............................................................................................................250
6.3.3 CRUD-Operationen mit Java...................................................................................251
6.3.4 RDF-Reasoning und Konsistenzkriterien............................................................ 257
6.3.5Bewertung................................................................................................................ 259
Inhalt IX
6.4DEX.......................................................................................................................................260
6.4.1Beschreibung............................................................................................................261
6.4.2Datenmodell............................................................................................................. 262
6.4.3Installation............................................................................................................... 262
6.4.4CRUD-Operationen.................................................................................................. 262
6.4.5Graphoperationen...................................................................................................264
6.4.6DEX-Skripting..........................................................................................................265
6.4.7DEX-Shell.................................................................................................................. 267
6.4.8Bewertung................................................................................................................268
6.5HyperGraphDB....................................................................................................................269
6.5.1Datenmodell.............................................................................................................269
6.5.2Installation............................................................................................................... 270
6.5.3CRUD-Operationen................................................................................................... 271
6.5.4Graphoperationen................................................................................................... 274
6.5.5Peer-To-Peer-Framework........................................................................................ 274
6.5.6Bewertung................................................................................................................ 274
6.6InfiniteGraph....................................................................................................................... 276
6.6.1Beschreibung........................................................................................................... 276
6.6.2Datenmodell..............................................................................................................277
6.6.3Installation............................................................................................................... 278
6.6.4CRUD-Operationen.................................................................................................. 278
6.6.5Graphoperationen................................................................................................... 282
6.6.6Bewertung................................................................................................................283
6.7InfoGrid................................................................................................................................284
6.7.1Beschreibung...........................................................................................................285
6.7.2Datenmodell.............................................................................................................285
6.7.3Installation...............................................................................................................286
6.7.4CRUD-Operationen..................................................................................................286
6.7.5Models.......................................................................................................................289
6.7.6Bewertung................................................................................................................290
6.8Neo4j.....................................................................................................................................290
6.8.1Installation................................................................................................................291
6.8.2 CRUD-Operationen mit der Java-API................................................................... 292
6.8.3 CRUD-Operationen mit JRuby...............................................................................296
6.8.4HTTP/REST-Schnittstelle....................................................................................... 297
6.8.5Cypher......................................................................................................................300
6.8.6 Replikation und Skalierung.................................................................................. 301
6.8.7Bewertung................................................................................................................ 301
6.9 sones GraphDB....................................................................................................................302
6.9.1Datenmodell.............................................................................................................303
6.9.2Installation...............................................................................................................304
6.9.3CRUD-Operationen..................................................................................................304
6.9.4Bewertung................................................................................................................308
X Inhalt
6.10 Weitere graphorientierte Ansätze...................................................................................309
6.10.1 Twitters FlockDB.....................................................................................................309
6.10.2 Google Pregel............................................................................................................ 311
6.10.3 Apache Hama........................................................................................................... 315
6.10.4 Microsoft Trinity......................................................................................................317
6.10.5 Die VertexDB-Familie..............................................................................................321
6.10.6Filament....................................................................................................................324
7OrientDB.................................................................................................329
7.1Überblick..............................................................................................................................329
7.2Allgemeines.........................................................................................................................330
7.3Datenmodell.........................................................................................................................330
7.4 Struktur der Datenablage..................................................................................................332
7.5Datenbanksicherheit..........................................................................................................332
7.6Installation...........................................................................................................................333
7.7 CRUD-Operationen DocumentDB.....................................................................................336
7.8 CRUD-Operationen ObjectDB............................................................................................340
7.9 CRUD-Operationen GraphDB............................................................................................343
7.10Datenbankschemata........................................................................................................... 347
7.11Transaktionen..................................................................................................................... 347
7.12HTTP-REST-Schnittstelle...................................................................................................348
7.13Replizierung........................................................................................................................ 351
7.14 Hosting über NuvolaBase..................................................................................................353
7.15Bewertung............................................................................................................................353
8
8.1
Weitere NoSQL-Datenbanken............................................................. 355
Wide Column Stores...........................................................................................................356
8.1.1Hypertable................................................................................................................356
8.1.2Cloudera................................................................................................................... 357
8.2 Document Stores.................................................................................................................358
8.3Key/Value/Tupel-Stores.....................................................................................................359
8.3.1 Amazon Dynamo.....................................................................................................359
8.3.2 Dynomite und KAI..................................................................................................360
8.3.3Voldemort.................................................................................................................360
8.3.4Scalaris.....................................................................................................................363
8.3.5 Die Tokyo-Produktfamilie......................................................................................364
8.3.6 Weitere Key/Value-Systeme..................................................................................366
8.4 Google App Engine Storage............................................................................................... 367
8.5 Weitere ‚Soft’-NoSQL-Lösungen........................................................................................368
Inhalt XI
9
Orientierung im Datenbankraum........................................................ 371
9.1 Grundlegende Gedanken................................................................................................... 372
9.2Datenanalyse....................................................................................................................... 373
9.3Transaktionsmodell............................................................................................................ 375
9.4Performancesapekte........................................................................................................... 376
9.5Abfrageanforderungen........................................................................................................377
9.6Architektur.......................................................................................................................... 378
9.7Weitere nicht-funktionale Anforderungen.......................................................................... 379
9.8Anwendungsfälle für NoSQL-Datenbanken.........................................................................381
9.9 Fazit......................................................................................................................................382
Register......................................................................................................... 385
1
Einführung
NoSQL zu verstehen, bedeutet nicht nur, die Technik zu beherrschen, sondern auch die
Geschichte und die Philosophie von NoSQL zu kennen. Wenden wir uns daher zuerst der
Geschichte von NoSQL zu.
■■1.1 Historie
Die Geschichte der NoSQL-Systeme begann durchaus parallel zum Siegeszug der relationalen Systeme. Bereits 1979 entwickelte Ken Thompson eine Key/Hash-Datenbank namens DBM. Mit Systemen wie Lotus Notes, BerkeleyDB und GT.M aus den 80er Jahren
entstanden dann die ersten noch heute populären Vorreiter der NoSQL-Systeme, im Vergleich zu heute natürlich noch mit geringen Datenmengen. 1998 tauchte dann der Begriff
NoSQL zum ersten Mal bei einer Datenbank von Carlo Strozzi auf. Seiner Datenbank lag
zwar immer noch ein relationales Datenbankmodell zugrunde, er stellte aber keine SQLAPI zur Verfügung.
Der eigentliche Schub für NoSQL kam aber seit 2000 mit dem Web 2.0 und dem Versuch,
auch große Datenmengen zu verarbeiten. So kann man sicherlich Google mit seinen Ansätzen wie Map/Reduce (siehe Abschnitt 2.1) und dem BigTable-Datenbanksystem (2004)
auf einem eigenen Filesystem (GFS) als den NoSQL-Vorreiter schlechthin bezeichnen. Und
natürlich zogen Firmen wie Yahoo, Amazon und später bald auch alle Sozialnetzwerke wie
MySpace, Facebook, LinkedIn usw. nach. Bis 2005 entstanden aber auch einige im Vergleich kleinere hochinteressante Datenbanken, die in vielen Facetten schon NoSQL-Charakter aufwiesen. db4o, Neo4j, memcached und InfoGrid haben hier ihren Ursprung.
Von 2006 bis 2009 entstanden dann die heutigen klassischen NoSQL-Systeme wie HBase/
Hypertable, CouchDB, Cassandra, Voldemort, Dynamo/Dynomite, MongoDB, Redis, Riak
und viele andere, wie sie z.B. im NoSQL-Archiv hinterlegt sind [NArchiv]. Doch erst im Mai
2009 tauchte der heutige Begriff in einem Weblog von Eric Evans auf [Oska09]. Das Team
von Johan Oskarsson suchte damals einen Begriff für ein Event (das NoSQL Meetup vom
11. Juni 2009 in San Francisco [Event09]), welches sich mit „distributed data storage“Systemen beschäftigte.
2 1 Einführung
Man sieht also, dass es Datenbanken, die stark von der relationalen SQL-Philosophie der
leistungsstarken RDBMS-Systeme abweichen, schon seit vielen Jahrzehnten gibt. Eine
starke Formation dieser NoSQL-Systeme als Kontrast zu dem RDBMS-Monopol bildete sich
jedoch erst seit 2009.
■■1.2 Definition und Diskussion
Bei der Arbeit am NoSQL-Archiv [NArchiv] haben sich die Autoren früh um eine Definition
des Begriffs NoSQL bemüht. Dies fällt relativ schwer, da es weder Gremien noch Organisationen gibt, die sich um eine Begriffsklärung bemüht haben. Dementsprechend versteht
heutzutage auch jeder unter NoSQL etwas leicht Verschiedenes, was durchaus seine Berechtigung hat und zur Vielfalt des Ökosystems beiträgt. Dennoch soll an dieser Stelle der
Versuch der Definition gewagt werden, um neu einsteigenden Lesern den Zugang zur
Materie zu erleichtern. Die Definition aus dem NoSQL-Archiv lautet in deutscher Übersetzung:
Definition:
Unter NoSQL wird eine neue Generation von Datenbanksystemen verstanden,
die meistens einige der nachfolgenden Punkte berücksichtigen:
1. Das zugrundeliegende Datenmodell ist nicht relational.
2.Die Systeme sind von Anbeginn an auf eine verteilte und horizontale Skalierbarkeit ausgerichtet.
3.Das NoSQL-System ist Open Source.
4.Das System ist schemafrei oder hat nur schwächere Schemarestriktionen.
5.Aufgrund der verteilten Architektur unterstützt das System eine einfache
Datenreplikation.
6.Das System bietet eine einfache API.
7.Dem System liegt meistens auch ein anderes Konsistenzmodell zugrunde:
Eventually Consistent und BASE, aber nicht ACID (siehe dazu Abschnitt 2.4).
Dies bedarf einiger Erläuterungen. Das Kernziel von NoSQL bestand darin, sogenannte
Web-Scale-Datenbanken zu entwickeln, also Datenbanken für die ungeheuren Datenmengen des Web 2.0-Zeitalters im Terabyte- oder sogar Petabyte-Bereich. Dazu kam auch die
Erkenntnis, dass es immer schwerer wird, herkömmliche relationale Datenbanken mit
normaler commodity-Hardware zu skalieren. Die großen relationalen DB-Hersteller versuchten zwar, den Eindruck zu vermitteln, sie könnten die akuten Probleme im Web 2.0
komplett abdecken. Bei genauerer Betrachtung und in der praktischen Anwendung zeigte
sich aber, dass dem nicht so ist.
1.2 Definition und Diskussion 3
Und so ist mit Punkt eins der Definition gemeint, dass das relationale Datenmodell nicht
immer das perfekte Datenmodell sein muss. Sicherlich hat das relationale Datenmodell
unbestreitbare Vorteile, die es in zuverlässigen Systemen seit Jahrzehnten bewiesen hat.
Nicht umsonst hat es sich durchgesetzt. Dennoch gibt es genügend andere Datenmodelle,
die nicht in relationale Strukturen gepresst werden sollten. Das Graphenmodell ist hier
ein bekanntes Beispiel: Die Traversion eines Graphen mittels Tabellen und join-Operationen lösen zu wollen, bringt erhebliche Performanceprobleme mit sich. Tatsache ist aber,
dass Derartiges in der Industrie immer wieder versucht wird und andere Datenbanken –
wie Graphdatenbanken – leider gar nicht erst evaluiert werden.
Punkt zwei beschreibt die Verteilung der Datenbank und die Ausrichtung auf Skalierbarkeit. Wenn Tera- oder gar Petabyte von Daten mit Standard-Hardware gespeichert und
verwaltet werden müssen, dann ist es von Vorteil, wenn die eingesetzte Datenbank von
Anbeginn auf Skalierung ausgerichtet ist. Bei Open Source-Datenbanken wie HBase oder
Cassandra ist diese Anforderung als Erstes in das Design der Datenbank mit eingeflossen.
Unter horizontaler Skalierbarkeit (Scale-out) versteht man das Einfügen (und ggf. auch
Löschen) von Nodes (d.h. Rechnerknoten), die dynamisch eingebunden werden und einen
Teil der Last/Daten tragen können. Dieses Scale-out-Prinzip steht diametral zu dem klassischen Scale-up-Prinzip, bei dem ein Server auf mehr Leistungsfähigkeit aufgerüstet wird.
Zu Punkt drei der Definition: Das Open Source-Kriterium wurde in der Community heiß
diskutiert, ist aber sicherlich nicht so strikt gemeint, wie es geschrieben den Anschein
hat. Es gibt erst einmal keinen logischen Grund, warum Systeme wie Hypertable oder
Amazon SimpleDB nicht auch NoSQL-Systeme sein sollten, nur weil sie nicht Open Source
sind. Diese Forderung kommt von der Erkenntnis, dass in der Industrie zu oft viel Geld für
(u.U. auch relationale) Datenbanksysteme ausgegeben worden ist, die aber dennoch nicht
ideal passen. Und so ist fast die gesamte Open Source-Bewegung als Protest zu verstehen,
mit der Idee ein anderes Geschäftsmodell zu etablieren. Und tatsächlich sind aus Systemen wie CouchDB oder Neo4j Firmen entstanden, die andere Lizenz- und Businessmodelle verfolgen, mit einem Open Source-Produkt als Basis. In diesem Sinne wird kein NoSQLVerfechter Open Source als Ausschlusskriterium sehen, sondern eher als Botschaft, sich
auch mal in der Open Source-Welt umzuschauen.
Mit der Schemafreiheit oder den schwächeren Schemaanforderungen aus Punkt vier stehen aber handfeste Anforderungen an Web 2.0-Datenbanken auf der Tagesordnung. Wa­
rum wurde es immer wichtiger, Schemarestriktionen zu lockern? Die Erfahrung zeigte,
dass Web 2.0-Projekte und -Portale deutlich agiler sein müssen als beispielsweise Bankanwendungen aus den 90er Jahren. Der Punkt ist, dass Schemaerweiterungen in relationalen Datenbankanwendungen (mit ALTER TABLE) nicht selten schmerzhaft verlaufen und
das darüber liegende Portal für Stunden lahmlegen können. Die Idee der NoSQL-Systeme
dagegen ist, einen Teil der Verantwortung im Umgang mit dem Schema auf die Anwendung zu übertragen. Hier kann eine Anpassung nämlich unter Umständen einfacher sein.
Anstatt wie bei relationalen Anwendungen die Tabelle stundenlang zu sperren und zu
konvertieren, wird vielfach der Ansatz verfolgt, die Daten zu versionieren (siehe Abschnitt
2.4, z.B. MVCC). So kann die Anwendung von Anfang an erweiterte Daten (z.B. mit einem
Feld mehr) schreiben und ein Hintergrundprozess die Daten konvertieren und als neue
Version schreiben. In diesem Fall gibt es eventuell nur ein kleines Zeitfenster, in dem das
4 1 Einführung
Lesen der Daten die alte Version ohne das neue Feld zurückliefert. Aber gerade in Web
2.0-Anwendungen ist diese Einschränkung oft tolerierbar. In sicherheitskritischen Transaktionssysteme natürlich nicht. Daher ist es initial durchaus sinnvoll zu schauen, ob der
Anwendungsbereich konsistente Daten erfordert und deshalb ein Schema hilfreich ist,
oder ob man schemafrei mit leichten, seltenen Inkonsistenz-Zeitfenstern nicht evtl. agiler
entwickeln kann.
Punkt fünf fordert eine einfache Replikationsunterstützung. Dies ist eine logische Konsequenz des verteilten Designs der meisten NoSQL-Anwendungen. Nachdem zugegebenermaßen die Replikation seit den 90er Jahren mit den etablierten relationalen Systemen nur
umständlich umgesetzt werden konnte, war es ein inhärenter Wunsch vieler Entwickler,
dies von Anfang an einfach zu gestalten. Dies ist der Mehrzahl der Datenbanken auch beeindruckend gelungen. NoSQL-Datenbanken wie CouchDB oder Redis können mit einem
einzigen Kommando repliziert werden, was z.B. in der mobilen Welt ganz neue Einsatzgebiete erschließen wird.
Einer der interessantesten und diskussionswürdigsten Aspekte ist aus Punkt sechs die
Forderung nach einer einfachen API. Die meisten Datenbankentwickler würden sicherlich
sagen, dass SQL bereits recht klar, einfach und dennoch mächtig ist. Es ist schließlich
nicht zu widerlegen, dass SQL einer der reifsten Standards der Datenbankwelt ist, insbesondere bei einem sauberen relationalen Modell. Aber die Welt dreht sich weiter, und
Anforderungen sowie Technologien ändern sich. Ist das relationale Datenbankmodell quasi schon „verbastelt“ und werden immer neue Spalten und Tabellen unüberlegt angefügt,
dann kann auch das zugehörige SQL unschön und nicht mehr performant werden. Ein
weiterer Punkt ist, dass auch SQL mit Strings arbeitet, die fehleranfällig sind, Fehler zur
Compile-Zeit nicht entdeckt werden und auch nicht „refactoring-fest“ sind. Dies führte zu
einer logischen Weiterentwicklung zum Beispiel im LINQ-Standard. So ist es eine logische
Folge, dass auch NoSQL-Datenbanken versuchen, neue Wege zu gehen, wenn die Abfragen
vielleicht auch in dem Maße nicht mehr direkt join-intensiv sind, wie das bisher der Fall
war. Eines der besten Beispiele liefert auch hier CouchDB, bei dem Datenbankoperationen
als REST-Anfragen formuliert werden. Dies bedeutet im Vergleich zu SQL einen erheblichen Paradigmenwechsel, eröffnet aber in der Web 2.0-Welt gleichzeitig wieder hochinteressante Einsatzgebiete wie Datenbankbefehle aus dem Browser an andere remote WebBrowser. Viele NoSQL-APIs sind daher tatsächlich einfacher als SQL, bieten aber manchmal
auch weniger mächtige (insbesondere Abfrage-) Funktionalität an. Problematisch wird es
bei NoSQL-Datenbanken mit komplexen Abfragen, die weiterhin das Hoheitsgebiet von
SQL bleiben. Nicht selten müssen NoSQL-Anwender dann z.B. komplexe Abfragen als
Map/Reduce-Abfragen (siehe Abschnitt 2.1) formulieren. Und dies in definierten Sprachen, die der Anwender evtl. nicht beherrscht. Hier steht NoSQL noch auf unsicheren
Füßen und muss in Sachen Entwicklerfreundlichkeit noch vieles nachholen. Das letzte
Wort ist hier jedoch bestimmt noch nicht gesprochen, und die Community wird sicher
noch viele Optimierungsfelder finden.
Der letzte Punkt betrifft das Konsistenzmodell von NoSQL-Systemen. Einiges dazu wurde
bereits in Punkt vier besprochen und wird in Kapitel 2.2 noch weiter vertieft. Daher soll
dies hier nur kurz angesprochen werden. Nicht alle heutigen (Web-)Systeme benötigen die
strikten Konsistenz- und Transaktionsanforderungen, die alle bekannten relationalen Sys-
1.3 Kategorisierung von NoSQL-Systemen 5
teme zur Verfügung stellen. Nicht alle Anwendungen sind sicherheitskritische Bank­an­
wendungen. Dennoch wird oft suggeriert, dass immer ein klassisches relationales ACIDSystem die beste Lösung ist. Vielleicht sind die bekanntesten relationalen SQL-Datenbanken
sogar die beste Lösung für das Gros der Anforderungen. Aber sicher nicht immer. Das typische Beispiel sind Social Web-Portale, die in der Regel keine besonders kritischen Daten
halten. Dort ist es unproblematisch, wenn Daten – auch innerhalb der Knoten der ver­teil­
ten Datenbanken – inkonsistent sind. Blogs oder Freundschaftsmarkierungen in Face­­­­book
können sicherlich auch mal für ein kurzes Zeitfenster inkonsistent sein. Man spricht daher von Systemen, die Eventually Consistent sind (siehe Abschnitt 2.4), also nicht sofort,
sondern etwas später konsistent sind. Solche Systeme benötigen daher keine ACID-Garantien (Atomar, Konsistent, Isoliert, Dauerhaft), sondern es reicht die sogenannte optimistischere BASE-Anforderung (basic available, soft state, eventually consistent).
Bei vielen NoSQL-Systemen muss man daher genau hinschauen, welches Konsistenzmodell zugrunde liegt. So gibt es durchaus einige NoSQL-Systeme, die trotzdem ACID anbieten. Manche bieten sogar ausschließlich ACID an, bei anderen Systemen hat man die Wahl
zwischen ACID und BASE, und viele andere bieten einfach nur BASE oder BASE-Derivate
an. Dies ist daher auch eines der Kernkriterien für eine Orientierung bzw. einen Anforderungskatalog, wann welche Datenbank eingesetzt werden sollte. Dazu aber mehr in Kapitel 8.
Abschließend soll auch die Diskussion über den Begriff „NoSQL“ nicht unerwähnt bleiben.
Schon bald, nachdem sich „NoSQL“ als Bezeichnung einer Bewegung durchgesetzt hatte,
fühlten sich viele Blogger berufen, gegen diesen Begriff anzugehen (am bekanntesten vielleicht Herr Dhananjay Nene [Nene10]). Und natürlich ist der Begriff relativ nichtssagend.
Schon der eingangs erwähnte Carlo Strozzi schlug vor, doch „NoSQL“ in „NoREL“ umzubenennen. Doch NoSQL war sehr schnell ein Selbstläufer und der Begriff nicht mehr zu verdrängen. Viele Kritiker hatten allerdings unterschätzt, dass NoSQL ein perfekter Marketingbegriff war. Und ohne die Kraft dieses – wenn auch unsinnigen oder nichtssagenden
– Begriffs wäre die NoSQL-Community nicht dahin gekommen, wo sie jetzt ist. Immerhin
schlug Emil Eifrem von Neo4j frühzeitig vor, NoSQL als „Not only SQL“ zu übersetzen,
womit sich die Community inzwischen angefreundet hat.
■■1.3 Kategorisierung von NoSQL-Systemen
Offenbar hat die Marktmacht relationaler (SQL-)Datenbanksysteme alle anderen Datenbanken herausgefordert, sich unter der Fahne von NoSQL zu vereinigen. So haben bisher
über 100 nichtrelationale Systeme die Aufnahme in das NoSQL-Archiv beantragt, darunter
auch die exotischsten Datenbanken. Sogar Firmen wie Oracle oder IBM – also die klassischen RDBMS-Hersteller – haben sich gemeldet und beantragt, bestimmte Produkte auch
unter der NoSQL-Flagge segeln zu lassen.
Register
Symbole
2-Hop-Cover 244
3-Hop-Cover 244
10gen 117, 132
A
Abfrage 377
Abgeleitete Kante 216
AbstractPipe 237
Acceptors 48
ACID 30, 330, 376
ACM 31
Adjazenzliste 218, 231
Adjazenzmatrix 217
Adobe 65
AllegroGraph 233, 248
allgemeines Graphenmodell 209
Amazon 1, 34
Amazon Dynamo 82, 179, 359
Amazon EC2 167
Amazon Elastic MapReduce 24
Amazon Web Services 96
Apache Hadoop 65
Apache Hama 315
Apache Jackrabbit 358
Apache Thrift 84, 371
App Engine 367
Armstrong, Joe 119
AsciiType 87
asynchroner Prozess 237
Atom 269
ATOM 56
Ausfalltoleranz 31
Availability 31
Availability-Zone 203, 204
AWS 96
B
Backup 380
Backup/Restore 380
baidu.com 356
balancierter Baum 221
ballots 48
BASE 33, 179, 376
BashReduce 24
Baum, balancierter 221
BBC 130
bedingte Anfragen 60
BerkeleyDB 1, 275, 366
BerkeleyDB XML 369
BigTable 1, 64, 82, 367
Bild- und Textanalyse 207
Bioinformatik 207
Blueprints 231, 330
Blueprints.NET 211, 234
Boost Graph Library 211, 217, 230
Breadth-First-Traversal 219
Breitensuche 219
BSON 133
B-Tree 365
Bucket 179, 194, 331
Bucket/Key/Value-Modell 331
Bulk-Kommando 157
Business-Daten 373
BytesType 87
C
Caching 59
Canonical 130
CAP 193
CAP-Theorem 31
Cassandra 82
cassandra-cli 84
386 Register
Cassandra Query Language 89
Causal Consistency 34
Cell-Prozessorserie 23
Chord 39
Chordless 168
Chubby-Prozess 50
Chunk 143
Class 332
Client-Sharding 166
Cloud-Computing 98
Cloudera 65
Cluster 332
Clustering 181
Clustering-Algorithmus 223
Codd 225
Column 83, 85
Column Families 6, 83
Common LISP 249
comparator 87
Consistency 31
Consistency-Level 93
Consistent Hashing 36, 93, 359
CouchApps 129
CouchDB 23, 118
CouchDB Lounge 129, 360
cqlsh 89
Crash Resistance 380
CRUD-Operation 242, 244
C-Store 63, 368
cURL 124
D
Data Access Pattern 378
Data Segment 332
Data-Structure Server 166
Data-Warehouse 63
Datenart 373
Datenflussnetz 239
datenflussorientiert 237
Datenkomplexität 375
Datenmenge 375
Datenmodell
–– objektorientiertes 227
–– relationales 225
Datennavigation 374
Datensilo 229
Daten- und Speichermodell 374
Datenzugriffsmuster 378
db4o 1, 369
DBObject 137
DELETE 54
Depth-First-Traversal 219
DEX 260
Dictionary 166
Disco 24
Distributed Hash Table 93
Django 357
Document Stores 6
DocumentDB 336
Dog House 247
Dokumentendatenbank 228
Dokumentmodell 331
Domain-Daten 373
Dynomite 360
E
EAV-Model 226
EMC Documentum 369
Emit 19
Empfehlungssystem 207, 221
Engine 336
Engine Yard 130
Entity-Attribute-Value-Datenmodell 226, 229
Erlang 196
Erlang/OPT 119
ETS 363
Euler, Leonhard 207
Eulerkreis 220
Eulerweg 220
Evans, Eric 1
Event-Daten 373
eXist 369
Expiration-Time 194
F
Facebook 1, 193
FarmVille 193
Filament 324
FileMap 23
Filtering 294
flapps 310
FlockDB 309, 366
Register 387
■■Register
Flow-based Programming 237
FluidDB 63
fold 13
full table scan 221
funktionale Sprache 12
Futon 123, 127
G
Gemstone 369
geographische Daten 373
Geoinformationssystem 207
gerichtete Hyperkante 213
gerichtete Kante 209
GET 54
gewichteter Graph 212
GFS 1, 19
GigaSpaces 7, 368
Gizzard 366
Go 24
Google 12, 50, 367
Google Pregel 312
Google Query Language 367
GQL 302, 304, 367
Graph
–– gewichteter 212
–– hierarchischer 215
–– multi-relationaler 210
–– Partitionierungsalgorithmus 219
–– Persistenz 217
–– Repräsentation 217
–– Traversierung 219
–– Visualisierung 215
Graph Query Language 225, 243, 302
Graphdatenbank 6
Graphdatenverarbeitung 209
GraphDB 343
Graphenmodell, allgemeines 209
Graph-Traversal 233, 240
Graphtraversierung 219, 225
Greenplum 23, 368
Gremlin 225, 240, 249
Grep 22
Grid-Datenbank 6
GridFS 134
GridGain 23
Groovy 240
GROUP BY 142
GT.M 1, 366
GXEF 308
H
Hamiltonkreis 220
Hamiltonweg 220
Hashes 160
Hashfunktionen 36
Haskell 14
Hazelcast 7, 368
HBase 64
HDFS 80, 356
HEAD 54
Hidden Handoff 179
hierarchischer Graph 215, 216
Hinted Handoff 191
Hive 372
Holumbus 24
Hook 330
HQL 356
HTML-Formulare 55
HTTP 51, 244
HyperGraphDB 213, 269
Hyperkante 213
–– gerichtete 213
Hypernode 215
HyperSQL 173
Hypertable 356
I
IBM 119
IBMs Lotus 368
Idempotenz 53
IEnumerable 237
IEnumerator 237
iGraph 230
Indexdatenstruktur 215
Indexfreie Traversierung 229
Indizierung von Graphdaten 221
Indizierungsverfahren 221
InfoGrid 1, 284
Inzidenzmatrix 218
IP-Adresse 44
ISideEffectPipe 238
388 Register
ISIS 368
Iterator 237
J
Jabber 274
Java 184
JavaScript 120, 132, 188
JDBC 162
JDO 367
Jena 249
join 187, 229
JPA 367
JRuby 69, 244, 330
JSON 8, 72, 119, 179, 228, 330
Judd, Doug 356
JUNG Graph Framework 217, 230
JVM 302
K
KAI 360
Kante
–– abgeleitete 216
–– gerichtete 209
–– ungerichtete 209, 213
–– versionierte 216
–– virtuelle 214
Kantenlabel 211
Kantenliste 218, 219
Key/Hash-Datenbank 1
Keyspace 50, 64, 83
Key/Value 6
Knoten, versionierter 216
Konfiguration 335
Konflikterkennung 94
Königsberger Brückenproblem 208
Konsistenz 30
Kosten 97
Kryptographie 36
kürzester Weg 208
Kyoto Cabinet 364
L
Lastverteilung 59
Leader 48
LexicalUUIDType 87
Link 52, 55, 180
Link-Typ 57
link-walking 187
Linked Open Data 207
LinkedIn 1
LINQ 4
LISP 13
Liste 158
Listener 335
Literal 210
locality of reference 218
Location Based Services 8
Log-Daten 373
logische Schlussfolgerung 215, 248
LongType 87
Lotus Notes 1
Lucene 222
M
MAC-ID 44
map 13
Mapper, objekt-relationaler 229, 236
Map/Reduce 1, 12, 140
MarkLogic 369
Master 20
Maximaler Fluss 208
Mehrfachkante 209, 211
Membase 193
Membase-Protokoll 199
Memcached 1, 193
MemcacheDB 366
Message-Daten 373
Metadaten 373
Methoden (HTTP) 53
Minimaler Spannbaum 208
MonetDB 63, 368
MongoDB 24, 131
Monotonic Read Consistency 34
Monotonic Write Consistency 35
Moxi 202
Multigraph 209
Multimodel Store 330
Multi-Node Cluster 68
Multiprozessor 166
multi-relationaler Graph 210
Multi-Value Properties 212
Register 389
Multiversion Concurrency Control 216
Mustererkennung 215
MVCC 41, 356
MySpace 1
MySQL 31, 310
N
Nebenläufigkeitskontrolle 216
Neo4j 1, 8, 232, 290
Netz, soziales 224
n-Hop-Cover 244
NuvolaBase 353
NVIDIA GPUs 23
O
ObjectDB 340
Objectivity 369
Objektdatenbank 6, 369
Objektdatenmodell 331
Objekt-Graph-Mapper 236
objektorientiertes Datenmodell 227
Objekt-relationaler Mapper 229, 236
OLAP 63
Ontologie 214, 227
Open Source 3
OpenSSL 121
Operationen 52
OrderPreservingPartitioner 92
OrientDB 329
OrientDB-Studio 334
OrientKV 330
Oskarsson, Johan 1
owl\
–– inverseOf 258
–– sameAs 258
–– SymmetricProperty 258
–– TransitiveProperty 258
OWL 249
P
PaaS 367
Pacer 244
Page-Rank 208
Paging 160
Paretoprinzip 224
Partitioner 92
Partitionierung 222
Partitionierungsalgorithmus 224
Partition Tolerance 31
Patent 12
Pattern-Matching 192, 208
Paxos 48, 363
Peer-to-Peer 177
Performance-Dimensionen 376
Persistenz von Graphen 217
Pfad 214
Pfaddefinition, semantische 214
Phoenix 23
Pig 372
Pipeline 239
Pipelining 166
Pipes.NET 237
POJO 340
POST 54
Postgres 31
Potenzgesetz 224
Prädikat 210
Prevayler 368
Primärschlüssel 65
Progress 369
Prolog 249
Property 210
–– virtuelle 216
Property-Graph 230, 303
Property-Graph-Datenmodell 210, 225
Property-Graph-Modell 331
Proposer 48
protobuf 73
Prozess, asynchroner 237
Prüfsummen 36
Pruning 294
PUT 54
pycassa 88
Q
Qizmt 24
Qt-Concurrent 23
Quadtree 221
Query-by-Example 253
QuickGraph 234
Quintupel 249
390 Register
Quorum 191
Quorum-Consensus-Algorithmen 47
Quota 195
R
RAM 152
randomisierte Traversierung 219, 221
RandomPartitioner 92
Range Queries 91
RavenDB 358
rdf\
–– type 257
RDF 8
RDF++ 257
RDF-Datenbank 250
RDF Query Language 225
RDF-Reasoning 248, 257
RDF-Schema 214, 227
RDF Schema Language (RDFS) 257
RDF-Statements 253
RDF-Store 209, 227, 248
RDF-Triple-Store 259
rdfs\
–– domain 257
–– range 258
–– subClassOf 257
–– subPropertyOf 258
RDFS 249
Read-your-write Consistency 34
Reasoning 214
Rebalance 201
Rechtemanagement 332
Record 332
RecordID 332
rediff.com 356
Redis 152
redis-conf 165
Refactoring 379
RegionServer 78
Reification 249
Relation höherer Ordnung 213
Relationales Datenmodell 225
Replikation 145, 180, 222, 379
Replizierung 351
Repräsentation, Graphen 217
Repräsentationen 52
REpresentational State Transfer 51
Resource Description Framework 208, 227
Ressourcen 52
REST 4, 51, 179, 244
RevisionId 212, 234
Rexster 244
Riak 39, 117, 179
RightScale 194
Ring 38, 93, 176, 190
Ring-Adressraum 179
Row 85
R-Tree 221
Ruby 163, 185
rufus-tokyo 365
S
SaaS 114, 367
Safety 53
Sanfillippo, Salvatore 152
Scala 164, 330
Scalaris 50, 363
Scale-out 377
Scale-up 377
Scalien 50
Schema 133
Schlüsselraum 190
Schlussfolgerung, logische 215, 248
Schreibsperre 216
SciDB 64
Scratchpad 101
Secondary Indices 92
Sector/Sphere 24
Sedna 369
seed node 93
Seiteneffekt 238
SemanticProperty 235
Semantic Web 227, 248
Semantische Pfaddefinition 214
Sesame 249
Session Consistency 34
Session-Daten 373
Sets 158
Shard 143
Sharding 143
shared memory 19
shared-nothing 179
Register 391
Shell 267
Sibling 183
Sicherheit 380
Single-Master-Multiple-Slave 222
Single-Node Cluster 68
Skalierbarkeit 3
Skiplist 221
Skynet 24
SNMP-Protokoll 181
SOAP 97
Software as a Service 228
sones 302
SonesDB 8
soziales Netz 224
Spaltenfamilie 66
Spannbaum, minimaler 208
SPARQL 225, 249
Sprache, funktionale 12
SQL 192
Stargate 72
Statuslosigkeit 59
sticky session 223
Storage 332
Straßennavigationssystem 212
Strozzi, Carlo 1, 5
StumbleUpon 65
subcomparator 87
Subgraph 215
Subgraphdefinition 215
SuperColumns 83, 86
SwapSpace 363
Sybase IQ 368
SybaseIQ 63
T
Tamino 369
TAP-Schnittstelle 203
Teilgraph 223
telnet 155
Temporäre Daten 373
Terrastore 358
Thompson, Ken 1
Thrift 74, 356
ThruDB 358
Tiefensuche 219
Timeout 188
Time To Live 157
TimeUUIDType 87
TinkerGraph 242
Tinkerpop 230, 330, 343
Tinkerpop Blueprints 209
Tinkerpop Frames 234, 236
Tinkerpop Pipes 237
Tokyo Cabinet 363, 364
Tokyo Dystopia 364
Tokyo Promenade 364
Tokyo Tyrant 364
Transaktion 233, 347
Traveling Salesman 220
Traversierung
–– indexfreie 229
–– randomisierte 219, 221
–– von Graphen 219
Triple 210
TripleId 250
Tupel 133
Tuple Stores 6
Twister 23
Twitter 309, 366
Two-Phase-Commit-Protokoll 47
U
Ubuntu 130, 182
ungerichtete Kante 209, 213
Uniform Resource Identifier 53, 210
Uniform Resource Locator 53
Unique Part Identifier, UPI 250
UNIX 153
UTF-8 163
UTF8Type 87
V
Validierung 88
Vector Clocks 43, 181, 183, 359
Vektorclock 212
Verfügbarkeit 31
Versant 369
versionierte Kante 216
versionierter Knoten 216
Versions-Vektoren 44
VertexDBs 321
392 Register
Vertica 368
Views 120, 127
Virtual Memory 197
virtuelle Kante 214, 216
virtueller Knoten 216
virtuelle Property 216
virtueller Server 39
Visualisierung 215
–– von Graphen 215
VMWare 152
vNodes 190
Vogels, Werner 34
W
Web Ontology 227
Web Ontology Language (OWL) 214, 257
web-scale 51
WebShell 304
Weg, kürzester 208
Wide Column Stores 6
Wissensrepräsentation 207, 210
Worker 20
X
X.509 101
Xindice 369
XLINK 228
XML 228
XML-Datenbank 6, 369
XMPP 274
XPath 240
XPRISO 285
Y
Yahoo 1, 65
YAML 8
Z
Zeitstempel 87
Zipfsches Gesetz 224
zookeeper 67
Zygna 193
Herunterladen