Fachhochschule Köln Campus Gummersbach Cologne University of Applied Siences Fakultät für Informatik und Ingenieurwissenschaften Bachelorarbeit Im Studiengang Wirtschaftsinformatik Etablierte Datenmodelle der NoSQL-Familie und ihre spezifischen Eigenschaften im Kontext von Cloud-Datenbanken 1. Prüferin/Betreuerin: 2. Prüferin: Prof. Dr. Birgit Bertelsmeier Prof. Dr. Heide Faeskorn-Woyke vorgelegt von: Mathias Frey Oberer Hengsbacher Weg 36b 57080 Siegen Matrikel-Nr.: 11053766 E-Mail: [email protected] Gummersbach, den 6. August 2010 Abstract Die relationalen Datenbankmanagementsysteme sind seit Mitte der 80er Jahre die vorherrschenden Systeme im Datenbanksegment. Diese Erfolgstory nähert sich womöglich jedoch ihrem Ende zu, da das Cloud Computing die IT-Landschaft in einen Wandel gebracht hat, der auch am Datenmanagement nicht vorbeigeht. Dynamische Skalierung, verteilte Systeme und riesige Datenmengen werden den Einsatzbereich der Datenbanken erweitern. Diese Arbeit stellt eingehend die neuen Herausforderungen vor, mit welchen die relationalen Datenbankmanagementsysteme, im Kontext der Cloud-Technologie, konfrontiert werden. Darüber hinaus werden die vier derzeit bekanntesten Typen der NoSQL-Datenmodelle und dazu jeweils ein Open-Source-Produkt beschrieben. Abschließend wird die Anwendung und Handhabung einer relationalen mit einer NoSQL-Datenbank in einem CRUD-Projekt verglichen. 2 Inhaltsverzeichnis Inhaltsverzeichnis...................................................................................................................3 1. Einleitung und Motivation ..................................................................................................4 2. Cloud Datenbanken...........................................................................................................6 2.1 RDBMS und die Anforderungen der Cloud-Technologie .............................................7 2.2 Das CAP-Theorem .....................................................................................................9 2.3 NoSQL......................................................................................................................11 2.3.1 Stärken und Schwächen der NoSQL-Datenbanken .............................................12 2.3.2 Datenbankskalierung ...........................................................................................13 2.3.3 Funktionale Partitionierung und die ACID-Alternative „BASE“..............................14 3. Gegenüberstellung etablierter NoSQL-Datenmodelle .......................................................16 3.1 Dokumentenorientiertes Datenmodell .......................................................................17 3.1.1 Eigenschaften dokumentenorientierter Datenmodelle ..........................................19 3.1.2 Apache CouchDB ................................................................................................19 3.2 Key-Value-orientiertes Datenmodell .........................................................................20 3.2.1 Eigenschaften Key-Value-orientierter Datenmodelle ............................................22 3.2.2 Redis ...................................................................................................................22 3.3 Spaltenorientiertes Datenmodell ...............................................................................24 3.3.1 Eigenschaften spaltenorientierter Datenmodelle ..................................................25 3.3.2 Cassandra ...........................................................................................................25 3.4 Graphorientiertes Datenmodell .................................................................................27 3.4.1 Eigenschaften graphorientierter Datenmodelle ....................................................28 3.4.2 Neo4j ...................................................................................................................28 3.5 Gesamtübersicht ......................................................................................................31 3.6 Fazit .........................................................................................................................32 4. Vergleich eines RDBMS mit einer NoSQL-Datenbank......................................................33 4.1 Oracle 11g in der Cloud ............................................................................................33 4.2 CRUD-Projekt mit Oracle Database 11g...................................................................34 4.3 CRUD-Projekt mit MongoDB ....................................................................................35 4.4 Gegenüberstellung von CouchDB und MongoDB .....................................................38 4.5 Fazit .........................................................................................................................41 5. Schlusswort......................................................................................................................43 6. Abkürzungsverzeichnis.....................................................................................................45 7. Literaturverzeichnis ..........................................................................................................47 3 1. Einleitung und Motivation Seit Mitte der 80er Jahre haben sich relationale Datenbankmanagementsysteme als die dominierenden etablieren können. Bereits in den Jahren zuvor haben sie viele der heute so genannten vorrelationalen Systeme, wie beispielsweise das Netzwerk-Datenbankmodell, das besonders in den 70er Jahren eine große Marktbedeutung hatte, verdrängt. In allen erdenklichen Unternehmens –und Wirtschaftsbereichen, in denen Datenbanken eingesetzt wurden, war das RDBMS das mit Abstand häufigste. In Anbetracht der Schnelllebigkeit der IT-Welt, die ständig mit neuen Innovationen, Veränderungen und technologischen Fortschritten aufwarten kann, stellen dreißig Jahre Dominanz eine beachtliche Leistung dar. Gegenwärtig jedoch befindet sich die IT in einem weiteren Wandel und dieser geht auch am Datenmanagement nicht vorbei. Das Cloud Computing ist der neue „Hype“ der IT-Welt, dem immer mehr Unternehmen folgen. Es birgt beträchtliche Potenziale, die jedoch nur abgerufen werden können, wenn alle Aspekte der Cloud-Plattform berücksichtigt werden. Einer dieser Aspekte ist die dynamische Skalierbarkeit oder die Fähigkeit Server nach Bedarf hinzuschalten zu können und Verarbeitungsprozesse oder Datenverwaltung auf diese zu verlagern bzw. auszuweiten (s. Kap. 2.3.2 Datenbankskalierung). Relationale Datenbankmanagementsysteme haben durch die Einhaltung des ACID-Transaktionskonzepts stets ein strenges und solides Datenmanagement sichergestellt. Dies kann sich nun im Zuge der Umstellung auf einen Cloud-Betrieb als unflexibel erweisen und wird in seiner bisherigen Form immer schwerer durchsetzbar sein (s. Kap. 2.1 RDBMS und die Anforderungen der Cloud-Technologie). Das Cloud-Computing-Konzept baut auf verteilten Systemen auf, für welche die Begriffe „Konsistenz“, „Verfügbarkeit“ und „Partitionstoleranz“ eine zentrale Rolle spielen (s. Kap. 2.2 Das CAP-Theorem). Diese sind jedoch erwiesenermaßen nicht gleichzeitig realisierbar, was wiederum das Aufkommen eines neuen Transaktionskonzepts und einer neuen Art von Datenbanken begünstigt hat (s. Kap. 2.3 NoSQL). Diese CloudDatenbanken sind speziell für den Betrieb in der gleichnamigen Umgebung entwickelt und ausgerichtet worden. Ihre Datenmodelle sind vielfältig (s. Kap. 3. Gegenüberstellung etablierter NoSQL-Datenmodelle) und weichen vom relationalen Tabellenmodell ab. Darüber hinaus erfolgt die Kommunikation nicht mehr über die, aus dem RDBMS bekannte Abfragesprache SQL, sondern über „gewöhnliche“ Programmiersprachen. Viele Unternehmen, insbesondere jene, die stark vom Internet abhängig sind, haben bereits eine Cloud-Datenbank mit einem NoSQL-Datenmodell übernommen. Die Überwiegende Anzahl der Datenbanken der NoSQL-Familie wird unter freier Lizenz vertrieben und kann gewöhnlich direkt von der Seite des Herstellers heruntergeladen werden. Ein weiterer Aspekt, auf welchen die rasche Verbreitung der NoSQL-Datenbanken zurück geführt werden kann, ist die relativ leichte Handhabung und der konzeptionell auf Einfachheit ausgelegte 4 Aufbau der Datenbanken. Dieser erlaubt auch weniger versierten Datenbankanwendern sich schnell zurecht finden zu können. In Anbetracht der schemafreien Struktur und der häufig sehr ausführlichen Dokumentation ist, unter Voraussetzung der Kenntnis der entsprechenden Programmiersprache, ein schneller Einstieg in die Materie möglich. Die Freiheiten, welche von den NoSQL-Datenbanken zur Verfügung gestellt werden, müssen jedoch mit einer größeren Sorgfalt seitens des Anwenders bei der Bearbeitung einhergehen, da viele absichernde Regulierungsmechanismen, wie sie das relationalen Datenmodell zur Verfügung stellt, nicht mehr vorhanden sind (s. Kap. 4. Vergleich verschiedener Datenbank). Diese Arbeit entstand vor dem Hintergrund des anhaltenden Cloud-Computing-„Hypes“ und seiner Auswirkungen auf die Datenverwaltung durch das etablierte relationale Datenmodell. Ihr Ziel ist die Untersuchung der vier NoSQL-Kern-Systeme (s. Kap. 3. Gegenüberstellung etablierter NoSQL-Datenmodelle) auf ihre konzeptionellen Unterschiede zum relationalen Datenmodell und deren Beurteilung im Hinblick eines Einsatzes in der Cloud-Umgebung. Der vorliegende Artikel setzt grundlegende Kenntnisse des Cloud Computing-Konzepts voraus. Zum besseren Verständnis empfiehlt der Autor daher die Lektüre von [Frey_2010]. 5 2. Cloud Datenbanken Viele etablierte Datenbanken, wie beispielsweise objektrelationale oder objektorientierte, besonders jedoch die relationalen Datenbanken haben zahlreiche Aufgaben in ebenso zahlreichen Bereichen wahrgenommen und tun das bis heute. Unternehmen und Institutionen aus den verschiedensten Forschungs –und Wirtschaftsbereichen sind auf eine klare, strukturierte und persistente Speicherung ihrer Daten angewiesen. Die IT-Landschaft hat bereits viele Innovationen kommen und gehen sehen. Genannt seien an dieser Stelle die E-Business Euphorie der 1990er Jahre, der dotcom-Boom 2000 oder auch das 2003 aufgekommene, neue Internetverständnis, welches unter dem Begriff „Web 2.0“ bekannt ist. Das Cloud Computing jedoch ist nach wie vor „im Kommen“ und hat bereits jetzt für weit reichende Veränderungen gesorgt. Industrie und Wirtschaft sind dem Trend gefolgt und umgestiegen. Mit dem vernetzten Cloud-Betrieb jedoch sind neue Herausforderungen einher gegangen, auf welche gerade im Datenmanagement reagiert werden muss (s. Kap. 2.1 RDBMS und die Anforderungen der Cloud-Technologie). Petabytes an Daten, die sich zudem auf verschiedenen Instanzen befinden, müssen verarbeitet und verwaltet werden während gleichzeitig eine permanente Verfügbarkeit und der Zugriff sichergestellt werden muss. Trotz dieser dezentralisierten Datenhaltung sollen Konsistenz und Verfügbarkeit gewahrt bleiben, aber das ist nicht ohne weiteres möglich (s. Kap. 2.2 Das CAP-Theorem). Die Umstellungen im Datenbankbereich sind groß, so dass man sich von manchen etablierten Schemata und Regeln verabschieden und neue wird annehmen müssen (s. Kap. 2.3.3 Funktionale Partitionierung und die ACID-Alternative). Viele Unternehmen, insbesondere jene, die stark vom Internet abhängig sind oder auf jenem basieren, haben kurzer Hand eigene Datenbanksysteme entwickelt, die speziell auf den firmeninternen Einsatzzweck zugeschnitten sind. Allerdings bringt die Freiheit eigene Entwicklungen zu nutzen, bedingt durch das gegenwärtige Fehlen von vorgeschriebenen Richtlinien oder Standards auch Nachteile bezüglich der Kompatibilität mit sich (s. Kap. 2.3 NoSQL). Die freie Verfügbarkeit der NoSQL-Datenbanken hat bereits jetzt sehr viele Unternehmen aus den verschiedensten Branchen zu einer Nutzung animiert. Allein die dokumentenorientierte NoSQL-Datenbank MongoDB wird von weit über 100 Unternehmen, unter denen sich auch namhafte Größen wie die New York Times oder Electronic Arts befinden, eingesetzt (s. Kap. 3.1 Dokumentenorientiertes Datenmodell und Kap. 4.3 CRUD-Projekt mit MongoDB).1 1 [Mong_2010] 6 2.1 RDBMS und die Anforderungen der Cloud-Technologie Aus der Unmenge der verschiedenen Datenmodelle, hat sich seit den 80er Jahren das relationale Datenmodell, sowie die dazugehörigen relationalen Datenbanken, zu dem marktbeherrschenden entwickelt. Bekannte Vertreter wie Oracle, IBM oder MySQL haben diese Entwicklung maßgeblich vorangetrieben. Jüngst jedoch, insbesondere seit dem Aufkommen des Cloud Computing-Hypes, haben sich die Fälle gehäuft, bei denen sich der Einsatz relationaler Datenbanken als schwierig herausgestellt hat. Vermehrt traten Defizite und Probleme in der Datenmodellierung, aber auch in der Skalierung über mehrere Maschinen und große Datenmengen, auf. Gegenwärtig kristallisieren sich zwei Tendenzen auf dem Datensektor heraus. Zum Einen der expotenzielle Zuwachs des Volumens, der von Nutzern, Systemen und Sensoren produzierten Datenmengen, sowie deren Konzentration auf verteilte Systeme (Amazon, Google und weitere Cloud-Systeme). Auf der anderen Seite ist eine steigende Abhängigkeit zu Daten aus verschiedenen Systemen bemerkbar, welche auf eine stetig wachsende Vernetzung und die daraus resultierende dezentralisierte Datenhaltung zurückzuführen ist. Letzterer Umstand wird insbesondere durch Techniken wie das Internet, Web 2.0 und soziale Netzwerke beschleunigt.2 Grundsätzlich gibt es in der Cloud die gleichen Möglichkeiten zur Datenspeicherung, wie in anderen On –oder Offlineumgebungen auch. Das heißt also entweder in Dateien oder in (meist relationalen) Datenbanken. Die Cloud birgt jedoch den Unterschied, dass die zu verwaltenden und zu speichernden Datenmengen um eine Beträchtliches größer sind. Das wiederum stellt neue Herausforderungen an die eingesetzte Hard –und Software, sowie die zugrunde liegenden Algorithmen. Als Beispiel sei an dieser Stelle das soziale Netzwerk Facebook.com erwähnt, dass Ende vergangenen Jahres rund 2,5 PB (!) an Daten speichern musste. Zudem beträgt der Datenzuwachs durchschnittlich etwa 15 TB am Tag. Diese Daten werden von ca. 400 Mio. Nutzern generiert und müssen permanent mit minimalen Antwortzeiten aufrufbar sein. Das Cloud Computing-Konzept zieht eine seiner Stärken aus der nahezu uneingeschränkten Verfügbarkeit der Ressourcen, sowie der starken, dezentralisierten Struktur. Mit der Dezentralisierung geht aber auch eine Verteilung der Daten auf verschiedene Rechner bzw. Standorte einher. Darüber hinaus enthält das Cloud Computing viele personalisierte Ressourcen und individualisierte Strukturen. Das bedeutet, dass sich Datenstrukturen verändern können und zwar auch gerade zur Laufzeit. Darüber hinaus sind Schemata zunehmend nicht mehr fix und selbst Datentypen können variieren. Hingegen müssen Daten bei traditionellen Datenbanken mit einem relationalen Datenmodell beispielsweise, in Tabellen abgelegt werden, die aus Spalten und Zeilen bestehen. Das Tabellenschema muss dafür vordefiniert werden, ebenso muss bei den zu verarbeitenden 2 [Neub_2010] 7 Daten eine strikte Schemakonformität zur Tabelle gewährleistet sein. Migrationszeiten steigen mit der Menge an Daten und komplexe Datenstrukturen häufen sich, was deren Abbildung erschwert. Die relative Starrheit ist daher ein weiteres Manko relationaler Datenbanksysteme im Hinblick auf den Einsatz in einem verteilten System wie der CloudUmgebung. Viele Hersteller haben zwar den Betrieb auf mehreren Servern vorgesehen, allerdings nur über interne, spezielle Kommunikationsprotokolle – dem Clustering. Dieses ist jedoch nur sehr begrenzt linear skalierbar und auf keinen Fall wurde es für einen Einsatz auf hunderten oder sogar tausenden Rechnern konzipiert. Hinzu kommt, dass die Befolgung der ACID-Eigenschaften und die Gewährleistung der Transaktionssicherheit zu kurzzeitigen Datensatzsperrungen führen. Diese wiederum können die Antwortzeiten insgesamt verlängern oder gar ein Dead-Lock hervorrufen. Eine über viele Server verteilte Datenbank arbeitet zudem noch mit umständlichen Mehrphasen-Commit-Protokollen, um die Konsistenz über alle Knoten sicherzustellen, was sich zusätzlich sehr negativ auf die Performanz im Gesamtsystem auswirkt. Nachteile dieser Art lassen sich prinzipiell auf Designentscheidungen zurückführen. Datenbankserver waren immer teure High-End-Maschinen bestehend aus hochqualitativer Hardware mit dem Ziel Fehler und Störungen möglichst vollständig auszuschließen. In Cloud-Rechenzentren kommt aber überwiegend preisgünstige Standardhardware zum Einsatz, ganz nach dem Prinzip „Masse statt Klasse“. Hardwarefehler oder Abstürze werden bewusst in Kauf genommen, da ein anderer beliebiger Server die Aufgabe des ausgefallenen Gerätes nahtlos übernehmen kann. Traditionelle DBMS können mit diesen Konditionen nur sehr schlecht umgehen, Transaktionsabbrüche oder gar fehlende Datenblöcke sind die Folge. Der Einsatz in der Cloud bedeutet insgesamt eine Verschiebung von der Komplexität hin zur Simplizität. Durch die Vernetzung und die gegenseitige „Überdeckung“ im Problemfall, ist die Transaktionssicherheit oftmals unnötig. Das Locking bremst zudem die Performanz und erschwert Replikationen. Hinzu kommt, dass Index-Updates sehr häufig „immediate“ sind und daher die Transaktion verzögern. Mehr Indizes erhöhen die Komplexität beispielsweise bei der Ausführung von Updates oder bei der Index-Auswahl für Queries. 3 Nicht unerheblich wirkt sich zudem die Virtualisierung aus, auf welcher das Cloud Computing zu einem beträchtlichen Teil basiert. Relationale Datenbanksysteme werden meist direkt auf normalen Server-Betriebssystemen, wie Windows oder Unix, betrieben. Virtuelle Maschinen, wie sie beim Cloud Computing gang und gäbe sind, verbergen aber die Komplexität sowie die zugrunde liegenden Mechanismen der CloudUmgebung vor dem DBMS.4 Die relationalen Datenbanksysteme können somit den, für den Cloud-Betrieb essenziellen, Anforderungen nicht mehr hinreichend genügen. Bezogen auf die Datenverwaltung vollführt sich in der Cloud-Umgebung ein Prioritätenwechsel. Die bisherige Daten –und Strukturkonformität, weicht einer Flexibilität und der Möglichkeit zu 3 4 [Wien_2010] [Meyer_2009] 8 Änderungen während des Betriebes. Generell lassen sich die spezifischen Anforderungen an eine Datenbank aus den konzeptionellen Stärken des Cloud Computings herleiten. Das Datenvolumen, das in der Cloud umgesetzt und verwaltet wird, muss auf mehrere Server, welche sich zudem noch auf verschiedenen Standorten weltweit befinden können, verteilt werden. Zugleich sollen Daten aber stets in der angeforderten Art und Menge zur Verfügung stehen und das noch möglichst ohne Geschwindigkeitseinbußen. Verfügbarkeit und Performanz gehören somit zu den primären Eigenschaften einer Datenbank für den Einsatz in der Cloud. Das Cloud Computing ist jedoch ein verteiltes System und als solches gibt es keine „zentrale“ Datenbank. Folglich muss auch Letztere die Fähigkeit besitzen Daten auf verteilten Servern verwalten zu können, weshalb die wichtigste Eigenschaft die Skalierbarkeit ist. Durch die Aufteilung (Partitionierung) der Daten lässt sich in einem verteilten System jedoch eine permanente Konsistenz der Daten nicht gewährleisten (s. Kap. 2.2 Das CAP-Theorem), was wiederum die Durchführung von ACID-konformen Transaktionen in ihrer bisherigen Form verhindert. Letzteres ist der Grund für das Aufkommen des BASE-Konzepts, das speziell in Cloud-Datenbanken zum Einsatz kommt (s. Kap. 2.3.3 Funktionale Partitionierung und die ACID-Alternative „BASE“).5 2.2 Das CAP-Theorem Im Juli 2000 stellte der Computerwissenschaftler und frühere Yahoo-Mitarbeiter Eric A. Brewer die CAP-Vermutung auf ([PODC_2000]). Zwei Jahre später veröffentlichten Seth Gilbert und Nancy Lynch vom MIT einen axiomatischen Beweis dieser Vermutung und etablierten diese somit zu einem Theorem ([CAP_2002]). Brewer, gegenwärtig Professor für Computerwissenschaft an der University of California in Berkeley, beschrieb das Theorem auf Grund von Forschungsergebnissen und Observierungen verteilter Systeme. CAP steht verkürzt für Consistency, Availability und Partition Tolerance. Das CAP-Theorem besagt, dass ein verteiltes System durch die drei fundamentalen Charakteristika Konsistenz, Verfügbarkeit und Partitionstoleranz, beschrieben wird und das es immer nur zwei dieser drei Charakteristika gleichzeitig erfüllen kann. Dies lässt sich mit zwei Beispielen anschaulich beschreiben: Das Online-Versandhaus Amazon möchte möglichst viele Kunden weltweit bedienen und betreibt daher ein weit verstreutes Netz an Servern. Amazon strebt folglich also eine hohe Verfügbarkeit an – muss aber dafür Einbußen bei der Konsistenz hinnehmen. Kauft A ein Buch in New York und B eins in Singapur und geschieht dies auf zwei verschiedenen Servern, sind die beiden Datenbanken nicht mehr synchron bzw. konsistent. Brewer beschreibt diesen Umstand als „eventually consistent“, da die Datenbanken später wieder synchronisiert werden. 5 [North_2010] 9 Ein großes Bankunternehmen besitzt ebenfalls viele Filialen und verteilte Server. Permanent werden Geldbeträge zwischen den Konten transferiert. Neben der Verfügbarkeit ist die Konsistenz in diesem Fall derart entscheidend, dass Einschnitte in der Distributivität vorgenommen werden. Die Bank zentralisiert diese Aktionen und steuert sie von einem einzigen Datenzentrum heraus. Die zentrale Datenbank ist durchgehend konsistent. Die „spätere Konsistenz“ wird im so genannten BASE-Konzept umgesetzt (s. Kap. 2.3.3 Funktionale Partitionierung und die ACID-Alternative „BASE“). Brewer definiert BASE als das andere Ende des Spektrums gegenüber ACID.6 Konsistenz (Consistency) Ein System, welches konsistent ist, arbeitet entweder ganz oder gar nicht. Gilbert und Lynch verwenden den Begriff „atomic“ (dt.: atomar, unteilbar) statt konsistent, was technisch gesehen mehr Sinn macht, da konsistent für das „c“ in ACID steht, den idealen Eigenschaften von Datenbanktransaktionen. Es bedeutet, dass Daten nie gegen bestimmte voreingestellte Beschränkungen (Constraints) verstoßen werden. Stellt man sich jedoch ein verteiltes System vor, welches darauf beschränkt wird, dass beispielsweise mehrfache Werte nicht für ein und den selben Datenteil erlaubt werden, wird das Problem offensichtlich. Verfügbarkeit (Availability) Verfügbarkeit bedeutet was es heißt – ein Dienst oder System ist verfügbar. Gilbert und Lynch meinten treffend, dass gerade die Verfügbarkeit jemanden genau dann im Stich lässt, wenn sie am meisten gebraucht wird. Internetseiten zum Beispiel brechen in Zeiten von erhöhtem Anfrageaufkommen zusammen, eben weil sie so stark frequentiert werden. Partitionstoleranz (Partition Tolerance) Wenn ein Programm oder eine Datenbank auf einem Rechner / Server betrieben wird, agiert dieser Rechner als eine Art atomarer Prozessor, in dem Sinne, dass er entweder funktioniert oder nicht (beispielsweise auf Grund eines Absturzes etc.). Beginnt man jedoch damit Daten und Logik auf verschiedene Rechner (auch Knoten) zu verteilen, besteht das Risiko, dass sich Partitionen formen. Als Beispiel sei eine Datenbank gegeben, die auf 100 Knoten betrieben wird, welche wiederum auf zwei Schränke verteilt sind. Nun wird die Verbindung zwischen diesen Schränken unterbrochen – die Datenbank ist damit partitioniert. Ist das System partitionstolerant, dann wird die Datenbank auch weiterhin Lese –und Schreiboperationen durchführen können. In Anbetracht der Art der Verteilungsfähigkeiten, die das Internet zur Verfügung stellt, sind temporäre Partitionen eine relativ gewöhnliche und häufige 6 [Dash_2010] 10 Erscheinung. Selbiges gilt auch für globale Unternehmen mit mehreren Datenzentren. 7 8 9 Gilbert und Lynch definieren die Partitionstoleranz nicht als die Eigenschaft einer verteilten Applikation, sondern als eine des Netzwerks, auf welchem die Applikation betrieben wird. Die Partitionstoleranz kann einem System also nicht nach belieben hinzugefügt werden. Liegt eine Partition in einem Netzwerk vor, verliert es entweder die Konsistenz (da nun auf beiden Seiten der Partition Updates erlaubt werden) oder die Verfügbarkeit (weil der defekte Bereich bis zur Fehlerbeseitigung abgeschaltet wird). Partitionstoleranz bedeutet ganz einfach die Entwicklung einer Bewältigungsstrategie, um zu entscheiden auf welche der beiden anderen Systemeigenschaften verzichtet werden soll. Dies ist die Kernaussage des CAP-Theorems.10 Relationale Datenbanksystem sind also, bezogen auf die drei Eigenschaften des CAPTheorems, primär auf strenge Konsistenz und Verfügbarkeit ausgelegt – „CA-Systeme“. In großen verteilten Systemen wie dem Cloud Computing, welches stark auf günstiger Hardware aufbaut und Ausfälle einkalkuliert werden, muss die Toleranz für Netzwerkpartitionen jederzeit gegeben sein. Folglich muss zwischen Konsistenz und Verfügbarkeit abgewogen werden.11 Tendenziell werden im Cloud Computing bei der Konsistenz Abstriche hingenommen um dafür eine höhere Verfügbarkeit zu erlangen und damit letzten Endes auch die Performanz zu steigern.12 Die meisten NoSQL-Datenbanken kommen mit diesen Abstrichen besser zurecht, da sie, im Gegensatz zu den relationalen Datenbanken, nicht an die Umsetzung der ACID-Eigenschaften gebunden werden – für sie gelten andere „Regeln“ (s. Kap. 2.3.3 Funktionale Partitionierung und die ACID-Alternative „BASE“). 2.3 NoSQL 1998 stellte der damalige IBM-Informatiker Carlo Strozzi eine nicht-relationale Datenbank vor, die speziell für den Einsatz im Betriebssystem Debian Linux entwickelt wurde. Abb. 1: NoSQL Logo Der Name dieser Datenbank war NoSQL. 2009 wurde der Begriff NoSQL („Not only SQL“) vom Rackspace-Mitarbeiter Eric Evans wieder verwendet und bezeichnet heute eine eigene Bewegung, die sich als eine Open-Source-Community versteht. Diese führt jährlich verschiedene Veranstaltungen und Treffen durch, auf welcher Meinungen, Tests und Diskussionen rund um den Bereich nichtrelationale Open Source Datenbanken, geäußert und durchgeführt werden.13 14 7 [CAP_2002] [Browne_2009] 9 [Gray_2009] 10 [Robi_2010] 11 [Mok_2009] 12 [Vogels_2008] 13 [Strozzi_2010] 8 11 2.3.1 Stärken und Schwächen der NoSQL-Datenbanken Das Angebot an NoSQL-Datenbanken hat sich rasant vervielfältigt und bietet mittlerweile eine Fülle von Datenbanklösungen mit unterschiedlichsten Datenmodellen, welche Daten auf verschiedene Weise handhaben. Von der Datenverwaltung in Form von Dokumenten, als Schlüssel-Wert-Paar bis hin zu einer grafischen Darstellungsweise steht dem Anwender ein breites Spektrum an Datenmodellen zur Auswahl (s. Kap. 3. Gegenüberstellung etablierter NoSQL-Datenmodelle). Die Entwicklung dieser Datenmodelle geht nicht zuletzt auch deshalb so schnell von statten, weil die NoSQL-Bewegung ein loser Zusammenschluss von Entwicklern und Interessenten ist, die keine festen Richtlinien oder bindende Normen vorgeben. Bisher sind keine Standardisierungsvorschriften für die NoSQL-Datenmodelle beschlossen oder herausgegeben worden. So kann praktisch Jeder, der das benötigte Wissen und die Kenntnisse besitzt, seine eigene NoSQL-Datenbank entwickeln, einsetzen oder weitergeben. Ein Beispiel für so einen Fall ist die Entwicklung von Redis (s. Kap. 3.2.2 Redis). Der daraus resultierende Nachteil ist, das jede NoSQL-Datenbank für sich einzigartig ist und es somit zu Komplikationen bei der Kompatibilität von Applikationen kommen kann, die nur für eine spezielle Datenbank geschrieben wurden. In einem solchen Fall ist auch der Open-Source-Aspekt keine Hilfe. Analysten gehen deshalb davon aus, dass sich NoSQLEntwickler in den kommenden Jahren unter anderem verstärkt auf die Ausarbeitung einer besseren Applikationskompatibilität zwischen den Datenmodellen konzentrieren werden.15 16 Die fehlende Standardisierung macht sich zudem auch im Bereich der Datensicherheit bemerkbar. Es wurden bisher keine einheitlichen Richtlinien aufgestellt, die vorgeben, welche und wie viele Möglichkeiten ein NoSQL-Datenmodell zur Verfügung stellen oder mit welchen Methoden und Mechanismen dieser Schutz gewährleistet werden soll. Zwar unterstützt jede Datenbank Sicherungsmaßnahmen wie beispielsweise das Backup für die Wiederherstellung nach einem Störfall, intern jedoch bestehen viele konzeptionelle Unterschiede. Die dokumentenorientierte Datenbank MongoDB zum Beispiel startet in einem so genannten Default-Modus, der keinerlei Einschränkungen für den Anwender beinhaltet. Das bedeutet es können nach belieben Datenbanken und Dokumente erstellt, verändert und wieder gelöscht werden. Selbiges gilt für das ebenfalls dokumentenorientierte System CouchDB. Beide bieten zwar die Möglichkeit Benutzergruppen mit unterschiedlichen Zugriffsrechten zu erstellen, allerdings erlauben diese keine Erstellung von Zugriffsbeschränkungen auf bestimmte Datenbankbereiche oder gar einzelne Dokumente. Diese Einstellungen muss der Anwender derzeit mit Hilfe von eigens programmierten 14 [Silicon_2010] [Kell_2010] 16 [Leav_2010] 15 12 Zugriffsroutinen verwirklichen.17 18 Ein Beispiel für das Fehlen jeglicher interner Sicherheitsmechanismen ist die Graphendatenbank Neo4j, deren Betrieb von einem „trusted environment“ (dt. vertraute Umgebung) ausgeht. Sämtliche Sicherheitsvorkehrungen, wie die auf der Internetpräsenz des Entwicklers vorgestellte access control list (ACL), müssen auf der Applikationsebene ausgeführt werden.19 Angemerkt sei an dieser Stelle, dass sich insbesondere die Open-Source-Datenbankprojekte nach wie vor in einer ständigen Entwicklungsphase befinden. Es ist somit nicht ausgeschlossen, dass zukünftig verbesserte Zugriffsbeschränkungen oder verfeinerte Rechtvergabesysteme installiert werden. Der gegenwärtigen Abwesendheit von Standards zum Trotz haben sämtliche NoSQLDatenbanken prinzipiell eine Gemeinsamkeit. Sie wurden primär vor dem Hintergrund entwickelt, dass sie bei der Verwaltung von immensen Datenmengen –und Größen eine hohe Performanz und Geschwindigkeit bereitstellen können. Auch die Tatsache, dass die stetig wachsenden Datenmengen langfristig Skalierungen der Datenbanken unumgänglich gemacht haben, wurde bei der Entwicklung der NoSQL-Datenbanken einbezogen (s. Kap. 2.3.2 Datenbankskalierung). 2.3.2 Datenbankskalierung Prinzipiell gibt es zwei Strategien um Skalierungen zu verwirklichen. Die erste und einfachste ist die vertikale Skalierung, also die Übertragung von Applikationen und Daten auf einen größeren Rechner. Die vertikale Skalierung funktioniert für Daten einwandfrei, ist jedoch in vielerlei Hinsicht Einschränkungen unterworfen. Die offensichtlichste ist, dass über Kurz oder Lang die Kapazitäten selbst der größten Maschine dem Datenvolumen nicht mehr gewachsen sind. Die vertikale Skalierung ist zudem kostenintensiv, da sie Investitionen in größere Maschinen erfordert, um die steigende Zahl der Transaktionen bedienen zu können. Die horizontale Skalierung offeriert eine größere Flexibilität, ist dafür aber Abb. 2: Funk. Skalierung und Sharding wiederum komplexer, da das Hinzuziehen weiterer Server mit einem größeren Verwaltungsaufwand einhergeht.20 Horizontale Skalierung kann entlang zweier Richtungen erreicht werden. Zum einen durch die funktionale 17 [Secure_2010] [Ander_2010] S. 189 – 191, Kap. 22 19 [Vick_2010] 20 [WASC_2010] 18 13 Skalierung, die eine Gruppierung der Daten nach Funktionen beinhaltet und diese funktionalen Gruppen über Datenbanken verteilt. Zum zweiten erfolgt eine Aufteilung von Daten innerhalb funktionaler Bereiche über mehrere Datenbanken – dies wird auch als „sharding“ bezeichnet. Das Beispiel in Abbildung 2 zeigt, wie beide Ansätze zu gleich in der horizontalen Skalierung verwirklicht werden. Die funktionalen Bereiche User, Produkte und Transaktionen können auf separate Datenbanken verteilt werden. Zusätzlich wird aber auch jeder Bereich auf mehrere Datenbanken verteilt, was dem Transaktionsvolumen dienlich ist. Wie die Abbildung zeigt, können die funktionalen Bereiche unabhängig voneinander skaliert werden. Die funktionale Partitionierung (s. Kap. 2.3.3 Funktionale Partitionierung und die ACID-Alternative „BASE“) ist besonders dann empfehlenswert, wenn es darum gilt ein möglichst hohes Maß an Skalierbarkeit zu erreichen – eine grundlegende Anforderung für den Cloud-Einsatz.21 2.3.3 Funktionale Partitionierung und die ACID-Alternative „BASE“ Die Skalierbarkeit stellt bei nahezu allen großen Applikationen, besonders bei Webapplikationen, ein entscheidendes Problem dar. Hat die Nutzeranzahl ein hinreichend großes Maß erreicht, gerät jede Applikation zu einem Punkt, an welchem auch eine Aufrüstung des Datenbankservers die ansteigende Belastung nicht mehr kompensieren kann. Eine Skalierung kann zum Einen durch das Clustering ermöglicht werden. Es besteht jedoch auch die Option die Daten zu partitionieren, das bedeutet die Tabellen so weit zu isolieren, dass Gruppen von Daten jeweils auf einem eigenen Server liegen. Cluster aufzusetzen und zu betreiben ist jedoch sehr aufwändig und kostenintensiv. Des Weiteren reagiert es empfindlich auf Netzwerkstörungen. Darüber hinaus unterliegt es Einschränkungen, wenn beispielsweise eine Serverart oder Applikation das Clustering nicht unterstützt.22 23 Nicht unerheblich ist zudem die Tatsache, dass Transaktionen nach wie vor zu Locks auf Bereiche der Datenbank führen können, welche während der Transaktion nicht parallel bearbeitet werden können. Selbst wenn man, mit Hilfe von mehreren Servern pro Cluster, eine theoretisch beliebige Performanzsteigerung erreichen kann, sind, über Kurz oder Lang, Probleme auf Grund gelockter Datenbankbereiche unausweichlich, so dass die Server warten werden müssen, bis der Lock aufgehoben ist. Die funktionale Partitionierung besitzt diese Probleme zwar nicht, ermöglicht dafür aber keine ACID-konformen Transaktionen, da auf Grund der einsetzenden Verteilung keine permanente Konsistenz der Datenbank mehr aufrechterhalten werden kann (s. Kap. 2.2 Das CAP-Theorem). Das würde wiederum bedeuten, dass entweder die Applikation selber in der Lage sein muss die 21 [ACM_2008] [McGe_2002] 23 [Servs_2009] 22 14 Konsistenz der Datenbank sicherzustellen oder die Partitionierung müsste immer so gewählt werden, dass keine serverübergreifenden Transaktionen nötig wären – beides ist praktisch unmöglich. Hier greift ein neues Konzept ein, welches mit der Bezeichnung BASE abgekürzt wird: Basically Available, Soft State, Eventually Consistent. Es soll also eine grundsätzliche Verfügbarkeit sichergestellt werden, bei der zwar keine „feste“ („hard state“) permanente Konsistenz besteht, diese aber dafür zu einem späteren Zeitpunkt gewährleistet wird. Sie ist also fließend. Der zugrunde liegende Gedanke des Konzepts ist, das nicht alle Operationen in einer Transaktion durchgeführt werden sollen, sonder eine Message-Queue (dt. Nachrichtenschlange) zu verwenden. In einer Transaktion werden Änderungen an der ersten Tabelle durchgeführt und zugleich eine Nachricht in einen speziellen Table geschrieben. Unabhängig davon wird ein weiterer Prozess gestartet, der jenen speziellen Table anfragt und die Änderungen ausführt, die für gewöhnlich in der ersten Transaktion ausgeführt worden wären. Das Resultat ist eine erheblich gestiegene Skalierbarkeit, die allerdings – wenn auch nur temporär – auf Kosten der Konsistenz erkauft wird. Alle Operationen werden weiterhin in echten Transaktionen ausgeführt, so dass die Datenbank früher oder später tatsächlich wieder konsistent ist. Dies ist besonders dann vorteilhaft, wenn Aktionen aufgerufen werden, die bei verschiedenen Usern sowieso unterschiedlich aussehen. Wenn beispielsweise eine Nachricht in ein Forum geschrieben wird und sich erst dann auf weitere Server ausbreitet. Ein Beispiel an dieser Stelle wäre der NewsFeed von Facebook. Dieser weist zwar deutliche Latenzen auf, allerdings stellt dieser Umstand kein Problem dar, da die Nachrichten früher oder später auf jeden Fall ankommen und ihre Zustellung nicht zeitkritisch ist. In einem Fall könnten dennoch Probleme auftreten und zwar, wenn die Partitionierung ungünstig gewählt ist und der User die Inkonsistenz der Daten bemerkt, was sein Vertrauen in das System erschüttern kann. Dies war eine Zeit lang bei der Community-Plattform StudiVZ der Fall, als zum Teil Nachrichten, die man auf eine der Pinwände geschrieben hatte, erst merklich später beim verfassenden User sichtbar wurden. Wenn aber die Partitionierung die Konsistenz für den User garantiert und Latenzen nur während den Kommunikationen untereinander auftreten, ist dies sehr viel eher hinnehmbar, als ein System, welches die Leistungsfähigkeit seiner Datenbank sprengt und schlussendlich nicht mehr ansprechbar ist.24 24 [Patz_2009] 15 3. Gegenüberstellung etablierter NoSQL-Datenmodelle Die Konkurrenz des relationalen Datenbankmanagementsystems gestaltet sich sehr vielfältig und unterschiedlich. Allerdings sind auch konzeptionelle Gemeinsamkeiten feststellbar, da bei ihrer Entwicklung besonders viel Wert auf Eigenschaften wie Verfügbarkeit und Skalierbarkeit gelegt wurde. Darüber hinaus verzichten NoSQL-Datenbanken zum Teil vollständig auf schemaspezifische Vorgaben. Nicht unerheblich ist die Tatsache, dass sie sich leicht in Web-Standards wie beispielsweise REST und vor allem in Cloud-Technologien integrieren lassen.25 Zudem sind sie, auf Grund ihrer konzeptionellen Eigenschaften und ihrem strukturellen Aufbau, häufig auf den Einsatz in bestimmten Bereichen ausgelegt und auf diese spezialisiert. Der Überbegriff „NoSQL-Familie“ lässt auf eine weitere Eigenheit schließen: Alle Datenmodelle dieser Gruppe und ihre Implementierungen rücken von der bisher vorherrschenden Anfragesprache SQL ab. Damit einhergehend entfallen auch bekannte Operationen wie Joins oder diverse Gruppierungsfunktionen, mit denen in relationalen Datenmodellen verschiedene Abfragen formuliert werden konnten. Viele Datenbanken sind in bekannten Programmiersprachen, wie C, C++ oder Java, geschrieben worden. Sie werden über diverse Programmierschnittstellen (engl. APIs) angesprochen, wobei Letztere wiederum weitere Sprachen unterstützen, was den jeweiligen Entwicklern entgegenkommt. Ihre konzeptionellen Vorteile erreichen NoSQL-Datenbanken jedoch nur dadurch, dass einige Abstriche auf Gebieten wie der Datenintegrität oder den ACID-Regeln hingenommen werden müssen. Dennoch sind diese Datenmodelle derzeit sehr erfolgreich und nehmen in vielen, überwiegend internet-basierenden Applikationen, die verschiedensten Aufgaben war. Die stetig wachsende Zahl der Abnehmer, hier besonders Unternehmen, ist ein weiterer Indikator für die Attraktivität des Open-Source-Angebots.26 27 28 Gegenwärtig lassen sich knapp ein Dutzend verschiedene NoSQL-Datenbanken unterscheiden, die von der Community geführt werden. Diese Gruppe setzt sich zum Einen aus den so genannten NoSQL Kern-Systemen (Core NoSQL Systems) und zum Anderen aus den Soft-Systemen (Soft NoSQL Systems) zusammen. Letztere definieren sich dadurch, dass sie zwar nichtrelationale Lösungen darstellen, andererseits jedoch nicht Teil der ursprünglichen NoSQLDatenmodelle sind. Zu den Soft NoSQL-Systemen gehören unter anderem Objektdatenbanken (db4o [db4o_2010], Versant [Vrsnt_2010], Objectivity [Objct_2010]), Grid-Datenbanken (GigaSpaces [GigS_2010], Hazelcast [Hzlc_2010]) und XMLDatenbanken (Mark Logic Server [MLS_2010], EMC Documentum xDB [EMCD_2010], eXist 25 [CIO_2010] [Redis_2010] 27 [Mong_2010] 28 [CSCDB_2010] 26 16 [exst_2010]).29 Die Gruppe wird von den vier Kern-Typen, welche verschiedene Ansätze und Methoden der Datenverwaltung besitzen, dominiert. In diesem Kapitel werden diese Vertreter der NoSQL-Datenmodelle vorgestellt und beschrieben. Zudem werden, in einer tabellarischen Übersicht, ausgewählte, konzeptionelle Eigenschaften und Techniken des jeweiligen Datenmodells aufgeführt. Zu diesen Eigenschaften zählen die Realisierung und Höhe von Konsistenz, Skalierbarkeit und Performanz, die Informationsdarstellung, die Unterstützung sekundärer Indizes für präzise Abfragen, die Art des Schemas und Fähigkeit für den Multi-Server-Betrieb. An dieser Stelle muss explizit darauf hingewiesen werden, dass die verschiedenen NoSQL-Produkte, auch Datenmodell übergreifend, unterschiedliche Methoden und Techniken zur Sicherstellung der genannten Eigenschaften einsetzen. Resultierend daraus lässt sich nicht jeder Punkt mit einer eindeutigen Angabe belegen. Im Anschluss erfolgt jeweils die Kurzvorstellung einer Open-Source-Implementierungen zu dem betreffenden Datenmodell. Die erwähnten Eigenschaften lassen sich auf alle vier KernTypen anwenden, was deren Präsentation in einer Gesamtübersicht ermöglicht (s. Kap. 3.5 Gesamtübersicht). Statt den, aus dem relationalen Datenmodell bekannten, Tabellen, werden Daten hier in Dokumenten (s. Kap. 3.1 Dokumentenorientiertes Datenmodell) oder Spalten (s. Kap. 3.3 Spaltenorientiertes Datenmodell) organisiert. Neben relativ einfach gehaltenen Schlüssel-Wert-Strukturen (s. Kap. 3.2 Key-Value-orientiertes Datenmodell) haben sich auch grafische Modellierungsweisen (s. Kap. 3.4 Graphorientiertes Datenmodell) etabliert. Mit einer zusammenfassenden Schlussbetrachtung schließt das Kapitel ab (s. Kap. 3.6 Fazit). 3.1 Dokumentenorientiertes Datenmodell Unter dem Begriff dokumentorientiert versteht man prinzipiell, das sämtliche Daten, die in der Datenbank abgelegt werden, aus einer Reihe von Dokumenten bestehen. Jedes dieser Dokumente wiederum kann mehrere Felder und Werte enthalten. Darüber hinaus sind alle Dokumente voneinander unabhängig und es existiert auch kein Schema, an das sie gebunden sind. Unterschiede gibt es auch bezüglich der Identifizierung von Objekten. Es gibt keine Primär –oder Fremdschlüssel in dem Sinne, wie sie aus dem relationalen Datenbankmodell bekannt sind. Auch referentielle Integritäten entfallen bei der dokumentenorientierten Datenbank. Primärschlüssel werden im RDBMS automatisch inkrementiert oder durch eine Sequenz generiert. Das stellt die Einzigartigkeit innerhalb einer Tabelle oder Datenbank sicher. Sie können also in anderen Tabellen oder Datenbanken wieder auftauchen. Wird nun zum selben Zeitpunkt eine Update-Operation auf zwei Datenbanken in separaten Netzwerken durchgeführt, können diese die nächste eindeutige 29 [Nsql_2010] 17 ID nicht ermitteln.30 Solche Fälle sind in dokumentenorientierten Datenbanken nahezu ausgeschlossen, da jedem einzelnen Dokument eine einzigartige, mehrstellige ID generiert wird. Ist eine derartige Identifikation nicht vonnöten, kann die ID auch von einem Anwender oder Programm bestimmt werden. Der Aufbau eines Dokumentes ist nur von der, in dem Dokument abgelegten Information abhängig und völlig unabhängig vom Aufbau der anderen Dokumente. Alle Daten, Informationen sowie die Beschreibung, die ein bestimmtes Dokument betreffen, werden in jenem Dokument selbst abgelegt. Die Schemafreiheit dieses Datenmodells ist eine wichtige Eigenschaft. Bei einer relationalen Datenbank muss im Voraus genau überlegt sein, wie die Datenbank modelliert werden soll, bevor sie erstellt wird. Datentypen oder Feldlängen müssen von vorneherein festgelegt werden. In der relationalen Datenbank wird zum Beispiel definiert, dass ein Nachname den Typ Text besitzt und höchstens 20 Zeichen lang sein darf. Sollte hier eine Änderung vorgenommen werden, ist eine Anpassung des gesamten Datenbankdesigns notwendig. Nachträgliche Änderungen einer SQL-Datenbank, können zu einem wahren Alptraum für den betreffenden Administrator werden, da hier oftmals verschiedene Integritäten und Abhängigkeiten in Spiel kommen. Im dokumentenorientierten Datenmodell sind alle Dokumente autark, so gibt es keine redundanten NULL-Werte und es können jederzeit neue Felder in einem beliebigen Dokument definiert werden. Zur besseren Einteilung und Übersicht bieten einige dokumentenorientierte Datenbanken Gruppierungsfunktionen an. In MongoDB beispielsweise lassen sich Dokumente in Collections zusammenfassen (s. Abb. 3) Abb. 3: Die MongoDB-Collection „Artikel“ (u.) und ihr SQL-Pendant (o.) Man kann sich dieses Datenmodell als eine Sammlung von Papierdokumenten vorstellen. Es wäre völlig sinnlos auf einem Papier ein NULL-Feld anzulegen. Wenn beispielsweise eine Person keinen zweiten Vornamen hat, wäre es jedem Sinn abträglich „Max NULL 30 [Ecdb_2009] 18 Mustermann“ zu schreiben. Der Zweitname entfällt einfach, so dass nur noch Vor –und Nachname bestehen. Das selbe Prinzip gilt für ein Dokumentenorientiertes Datenmodell.31 3.1.1 Eigenschaften dokumentenorientierter Datenmodelle Dokumentenorientierte Datenmodelle Darstellung / Format der Informationen Präzise Abfragen / Sek. Indizes Konsistenz (Methoden) MultiServerBetrieb Skalierbarkeit (Techniken) Performanz Schema Dokumente und Anhänge (oft BSON oder JSON) Präzise Abfragen möglich / Sek. Indizes werden unterstützt Mittel hoch (häufig Update-inplace oder MVCC) Betrieb auf mehreren Servern wird unterstützt Sehr hoch (oft über Replikation oder Sharding) I. d. R. Hoch (Abhängig von Konsistenzmethode u. tiefe der Abfragen – besonders bei WriteZugriffen Generell schemalos, oft zusätzl. unterstützende Gruppierungsfunktionen wie Collections oder Views 3.1.2 Apache CouchDB Im April 2005 kündigte Damian Katz, ein ehemaliger Senior Developer von Lotus Notes, in seinem Blog, die Entwicklung einer neuen Datenbank an. Er gab dem Projekt den Namen CouchDB, wobei Couch zugleich als Akronym für „Cluster Of Unreliable Commodity Hardware“ (dt. etwa. „Bündel von unzuverlässiger handelsüblicher Hardware) verstanden werden soll. Damit ist gemeint, dass CouchDB extrem skalierfähig, hoch verfügbar und zuverlässig ist und zwar auch dann, wenn das System auf einer Hardware betrieben wird, die von niederer Qualität ist und zu Ausfällen neigt. Ursprünglich ist CouchDB in C++ geschrieben worden, allerdings wechselte man im April 2008 auf die Programmiersprache Erlang, eine ehemalige hausinterne Sprache der Firma Ericsson. Eine Besonderheit der Sprache ist der größere Schwerpunkt im Bezug auf die Fehlertoleranz.32 Für den Anwender bedeutet dies jedoch, dass er für den Betrieb der Datenbank eine Erlang-Umgebung bereitstellen muss. Die dafür benötigten Programme lassen sich aber jederzeit aus dem 31 32 [Lenn_2009] S. 5 – 6, Kap. 1 [IBM_2009] 19 Internet beziehen. Entwickelt wurde CouchDB ursprünglich unter der Lizenz der Apache Software Foundation, einer freien Gemeinschaft von Entwicklern. Mittlerweile ist Katz jedoch zu IBM zurückgekehrt und darf dort die weitere Entwicklung, nun jedoch ohne jegliche Auflagen, leiten. Aktuell stellt CouchDB neben MongoDB (s. Kap. 4.1 ) einen der bekanntesten Vertreter aus der Reihe der dokumentenorientierten Datenmodelle dar. Beim Netzwerkprotokoll bedient sich CouchDB den verbreiteten Internetstandard http und verarbeitet Daten im JSON-Format, was insbesondere Web-Entwicklern sehr gelegen kommt. Passend dazu ist die Standardsprache für Anfragen JavaScript. Um die Anfragen strukturieren zu können, bietet CouchDB so genannte Views. Sie geben dem Nutzer eine bestimmte Sicht auf die Daten und können beispielsweise die Abfragen nach gewünschten Kriterien filtern. In komplexeren Fällen können Filteranfragen in Javascript definiert werden um die Ergebnismenge sukzessive auf eine überschaubare Größe zu reduzieren. Diese Methode ist auch unter der Bezeichnung Map/Reduce, einem Google-Patent, welches auch in der verteilten Datenbank BigTable angewandt wird33. Um die Konsistenz der Daten sicherzustellen, bedient sich CouchDB des MVCC-Prinzips.34 In der Datenbank werden also immer mehrere verschiedene Versionen eines Objektes bereitgehalten, die beispielsweise durch einen Zeitstempel oder fortlaufende Transaktionsnummern voneinander unterschieden werden. Jede Objektversion besitzt einen Zeitstempel vom Zeitpunkt des Schreibens durch eine Transaktion. Eine Transaktion Ti kann jeweils die aktuelle Version eines Objektes lesen, deren Zeitstempel kleiner ist als ZS(Ti), also die von der Transaktion geschrieben wurde. So wird sichergestellt, dass Transaktionen nie auf ein Datenobjekt warten müssen und ReadLocks werden ausgeschlossen.35 CouchDB wird derzeit von fast achtzig verschiedenen Quellen verwendet. Neben diversen Facebook Applikationen kommt es in mehreren Firmenwebsites zum Einsatz, unter welchen auch namhafte Größen wie beispielsweise jene der britischen Rundfunkanstalt BBC zu finden sind.36 3.2 Key-Value-orientiertes Datenmodell Mit der steigenden Popularität sozialer Medien und cloud-basierter Dienste, gewann auch das Key-Value-orientierte Datenmodell an Bedeutung. Für cloud-basierte Applikationen und Dienste, die eine internetbezogene Datenverwaltung voraussetzen, werden Key-ValueDatenbanken vermehrt ihren relationalen Pendants vorgezogen. Das Prinzip der Key-ValueStores ist sehr simpel. Ein bestimmter Schlüssel verweist auf einen Wert. In seiner einfachsten Form kann dieser wiederum eine beliebige Zeichenkette sein. Ähnlich einfach 33 [USPTO_2010] [From_2009] 35 [MVCC_2010] 36 [Cwiki_2010] 34 20 verhält es sich mit dem Schema des Key-Value-orientierten Datenmodells: Der Key ist ein String, der Wert ist ein BLOB, ansonsten liegt es ganz beim Anwender, wie er die Daten handhaben möchte. Es herrscht, wie in den meisten Datenmodellen aus der NoSQL-Welt, kein vordefiniertes Schema, aber der Benutzer selbst kann die Semantik definieren um die zu speichernden Daten nach seinen Gutdünken in der Datenbank abzulegen.37 Der Anwender bedient sich dazu einer Programmiersprache, die von einer zuvor gewählten API unterstützt wird. Besonders Open-Source-Produkte werden mit mehreren Programmierschnittstellen angeboten, um eine breite Palette an akzeptierten Programmiersprachen für die Kommunikation mit der Datenbank bereitzustellen. Im Key-Value-orientierten Datenmodell wird zudem auf sekundäre Indizes, wie beispielsweise Bitlisten-Indizes über Attribute verzichtet. Ebenso wenig werden Fremdschlüsselintegritäten gewahrt. Das bedeutet, dass ein Wert immer nur über einen bestimmten Schlüssel angesprochen werden kann. Dadurch wird das Datenmodell zwar simpler und häufig auch schneller, allerdings können sich Schwierigkeiten bei dem Versuch ergeben, komplexe Daten anzusprechen. Als Beispiel sei folgender Eintrag aus einer Benutzerliste gegeben: ID Name Alter eMail 12345 Thorger 30 [email protected] In einem relationalen Datenmodell wäre es möglich nach beliebigen „Spalten“ abzufragen. Bezogen auf ein Key-Value-Store, gestaltet sich das obige Beispiel hingegen etwas anders: 12345 ’Thorger, 30, [email protected]’ Im übertragenen Sinne „zeigt“ also ein Wert (ID) auf den kompletten Eintrag. Spezifische Abfragen, wie in diesem Fall, nach Name, Alter oder e-Mail-Adresse lassen sich hier nicht formulieren. Durch den Wegfall von Konsistenzerhaltungsmechanismen soll eine Effizienzsteigerung der Datenbank für Anwendungen mit vielen aber einfachen Daten bzw. Datentypen erreicht werden.38 Der Einsatz eines Key-Value-Stores eignet sich somit in den Fällen, in welchen die Verwaltung großer Datenmengen mit möglichst minimalen Geschwindigkeitseinbußen angestrebt wird und die Konsistenz kein entscheidender Faktor ist. Innerhalb der Key-Value-Stores werden zwei Untergruppen unterschieden. Zum einen die „in-memory“-Variante (auch in-cache-Variante), bei der die Daten primär im Hauptspeicher gelagert werden. Sie können mit schnellen Zugriffszeiten aufwarten und werden überwiegend für Applikationen eingesetzt, bei denen die Antwortzeiten ein ausschlaggebendes Kriterium darstellen. Die zweite Kategorie bilden die „on-disk“-Varianten, 37 38 [Heise_2010] [Brekle_2010] 21 bei welcher die Daten direkt auf einen persistenten Speicher, wie beispielsweise eine Festplatte, abgelegt werden. Der Vorteil des Key-Value-Datenmodells ist die Schlichtheit und Simplizität. Es ist sehr einfach eine Key-Value-orientierte Datenbank zu erstellen und ebenso leicht ist es sie zu skalieren. Auch hier wird dies über das Sharding oder die Replikationen verwirklicht. Auch ist es möglich eine sehr hohe Performanz zu erreichen, da Zugriffsmuster stark optimiert werden können. Mit der Entwicklung von Key-Value-Stores sollte beabsichtigt werden ein Datenmodell zu schaffen, dass für alltägliche (Web-)Anwendungen, wie Warenkorb –oder Lesezeichensysteme, effizient einsetzbar ist. Es ist für Applikationen gedacht, die keine beliebig komplexen Anfragen benötigen und schemafreie respektive nur leicht schematisierte Daten speichern. Im Fokus des Key-Value-Datenmodells liegt die Skalierbarkeit, hohe Verfügbarkeit, Partitionierung sowie extrem kurze Antwortzeiten. 39 Sehr häufig werden auch dokumentenorientierte Datenbanken als Key-Value-Datenbanken bezeichnet. Tatsächlich sind Erstere eine Abwandlung, da sie ebenfalls nach einem Schlüssel-Wert-Prinzip arbeiten. Der Vorteil hier ist jedoch, das man nicht nur darauf beschränkt wird nach Schlüsseln abzufragen, da dokumentenorientierte Datenbanken sekundäre Indizes und somit gründlichere Anfragemöglichkeiten bieten. 3.2.1 Eigenschaften Key-Value-orientierter Datenmodelle Key-Value-orientierte Datenmodelle Darstellung / Format der Informationen Präzise Abfragen / Sek. Indizes Konsistenz (Methoden) MultiServerBetrieb Skalierbarkeit (Techniken) Performanz Schema Sehr verschieden (häufig BLOB) I. d. R. keine I. d. R. schwach (inMemory, optimistic concurrency control) Betrieb auf mehreren Servern wird unterstützt Sehr hoch (oft über Replikation oder Sharding) Sehr hoch (Aufgrund der oft nicht vorhandenen Möglichkeiten für präzise Abfragen) Schemalos (Ausnahmen: z. Bsp.: Redis (Strings, Lists u. Sets) 3.2.2 Redis 39 [Bin_2010] S. 4, Kap. 1 22 Salvatore Sanfilippo, ein Programmierer von Webapplikationen und iPhone-Apps, begann im März 2009 mit der Entwicklung einer Datenbank, die speziell auf die Erfordernisse seiner beiden Unternehmen ausgerichtet sein sollte. Was als kleine nebenberufliche Tätigkeit gedacht war, wuchs schnell an und entwickelte sich rasch zu einem primären Projekt. Ursprünglich als hausinterne Lösung geplant, gab Sanfilippo Redis bereits nach wenigen Wochen als Open Source Software heraus. Redis fand erste Abnehmer und die Ansprüche der Nutzer wuchsen, so dass das Projekt weiter ausgebaut wurde. Sehr bald folgten die ersten Angebote von diversen Firmen und Sanfilippo ging zu VMware, einem USUnternehmen für Virtualisierungssoftware, deren großes Interesse von der Geschwindigkeit der Datenbank rührte.40 41 Mit 110000 Lese –und 81000 Schreibzugriffen in der Sekunde, gehört Redis in der Tat zu den derzeit schnellsten Datenbanken in dem Segment. Redis ist eine recht einfach gehaltene, auf Geschwindigkeit und Skalierbarkeit getrimmte, Key-Value Datenbank. Im Gegensatz zu vielen anderen Datenmodellen dieser Art, besitzt in Redis jeder Wert einen der vier folgenden Typen: - String Standardtyp, der alle möglichen Daten (Texte, Bilder, Videos usw.) enthalten kann. - List Eine List enthält mehrere Strings, die in der Reihenfolge ihrer Eingabe gespeichert werden. - Set Ein Set enthält eine unsortierte Sammlung von Lists. Doppelte Eintragungen sind nicht möglich, es wird ein neuer Set mit der entsprechenden Eintragung erstellt. - Sorted Set (seit v1.1) Ein Set, bei dem jedoch jede List einen Hashwert erhält und entsprechend sortiert wird. Das hat den Vorteil, dass, ähnlich wie bei sekundären Indizes, präzisere Abfragen nach Attributen von Lists und Sets möglich sind – einzig Attribute einzelner Strings lassen sich nicht abfragen. Die SQL-Relation „Artikel“ aus Abbildung 3 lässt sich in Redis als List darstellen, die die einzelnen Artikel als Strings beinhaltet (s. Abb. 4). Abb. 4: Abfrage aller 5 Artikel der Redis-List „Artikel“ (Index 0 – 4) 40 41 [Ablog_2009] [Pron_2010] 23 Eine weitere Besonderheit ist, das Redis die Daten im Hauptspeicher behält und im selben Moment persistent auf der Festplatte speichert – also „in-memory“ und „on-disk“ zugleich ist. Dem Anwender werden hier diverse Einstellungen angeboten. Beispielsweise kann man Redis so einstellen, dass alle 1000 Veränderungen ein Mal persistent gespeichert wird und/oder 60 Sekunden nach der letzten Änderung.42 Die bekanntesten Nutzer von Redis sind OKNOtizie, Italiens größtes Social-News-Portal und die britische Tageszeitung „The Gurdian“.43 VMware belässt Redis unter Open Source-Lizenz, eine Bedingung Sanfilippos, und plant die Datenbank in seine Cloud -und Virtualisierungstechnologien einzubinden.44 3.3 Spaltenorientiertes Datenmodell Unter dem Begriff der spaltenorientierten Datenbank (engl. Column-orientated database) versteht man zunächst die Art und Weise auf welcher die Daten auf dem eingesetzten persistenten Speichermedium, wie zum Beispiel einer Festplatte, abgelegt werden. In traditionellen Datenbanken werden dort immer alle Felder (Attribute) einer Tabellenzeile (Tupel) hintereinander abgelegt, weshalb eine solche Datenbank zutreffender Weise auch als zeilenorientiert bezeichnet wird.45 Für den Menschen stellt dies eine bequeme Sichtweise dar, denn sie passt zu der Art, wie der er selbst die Information speichert. Als Beispiel sie hier die Karteikarte genannt. Nimmt man jedoch an, dass jede Karteikarte einen Verkauf pro Vertriebsmitarbeiter belegt und man nun den Gesamtumsatz ermitteln möchte, so müsste man jede einzelne Karte durchsehen, den Verkaufsumsatz zum Gesamtergebnis hinzuaddieren und zur nächsten Karte übergehen. Selbstverständlich lässt sich eine SQLDatenbank in einem solchen Einsatzgebiet anwenden und optimieren, allerdings dauert dieser Vorgang länger, je mehr Daten zu verwalten sind. Zu bevorzugen wäre in einem solchen Fall die Möglichkeit, den jeweiligen Verkaufsumsatz eines Mitarbeiters auf einer Karte festzuhalten, diese aber zugleich auch auf einer Liste mit den Verkaufszahlen zu notieren. Um den Gesamtbetrag zu ermitteln, müsste man jetzt nur noch die Zahlen jener Liste zusammenrechnen. Dieses sehr schnelle Schema ist im Grunde das, was eine spaltenorientierte Datenbank ausmacht.46 Wenn eine hohe Performanz auch bei einer großen Anzahl an verschiedenen, simultan durchgeführten Anfragen gefordert wird, stoßen relationale Datenmodelle häufig an ihre Grenzen. Sie verwenden zusätzliche speicherintensive Indizes, um die Anfragen zu beschleunigen. Dies wird mit dem Laden unterschiedlicher Anfragen unhaltbar, auf Grund des damit einhergehenden wachsenden Bedarfes an Speicher und Rechenleistung zur Erhaltung und Verwaltung dieser Indizes. In 42 [Intro_2010] [Redis_2010] 44 [Pron_2010] 45 [GI_2010] 46 [Heise_2010] 43 24 spaltenorientierten Systemen werden Indizes vollkommen anders gestaltet. Sie sind primär dazu entwickelt worden um Daten zu speichern und dienen weniger als Referenzmechanismus, der auf einen anderen Speicherbereich mit der entsprechenden Datenzeile verweist. Resultierend daraus müssen nur die angefragten Spalten aus dem Speicher geholt werden. Spaltenorientierte Datenbanken kommen verstärkt in den Unternehmen zum Einsatz, in denen ein reger Gebrauch von analytischen Datenbanken gemacht wird. Sie dienen dort der Unterstützung des Berichtswesens, der Erstellung strategischer Analysen und vieler weiterer Aktivitäten im Bereich des Business Intelligence.47 3.3.1 Eigenschaften spaltenorientierter Datenmodelle Spaltenorientierte Datenmodelle Darstellung / Format der Informationen Präzise Abfragen / Sek. Indizes Konsistenz (Methoden) MultiServerBetrieb Skalierbarkeit (Techniken) Performanz Schema Spalten + Attribute (Rows) / oft JSON, BSON Präzise Abfragen möglich / Sek. Indizes werden unterstützt Mittel - Hoch (Variiert aufgrund des Einsatzes versch. Methoden u. a. MVCC) Betrieb auf mehreren Servern wird unterstützt Sehr hoch (oft über Replikation oder Sharding) I. d. R. Hoch (Abhängig von Konsistenzmethode u. Anzahl der Abfragen – besonders bei WriteZugriffen schemafrei 3.3.2 Cassandra Das Projekt Cassandra wurde im Juli 2008 auf Google Codes, einer Internetseite auf der Google Entwicklerwerkzeuge bereitstellt, veröffentlicht. Seit Februar diesen Jahres wird das Projekt von der ASF geleitet, die sich u. a. auch für CouchDB verantwortlich zeichnen.48 Cassandra gilt als Open-Source-Imitat von Googles hausinternem Datenbanksystem BigTable und war ursprünglich für den Einsatz im sozialen Netzwerk Facebook gedacht. 47 48 [Loshin_2009] S. 1 – 3 [DBMS_2008] 25 In Anbetracht von Facebooks über 400 Mio. Nutzern, war Cassandra primär darauf ausgelegt große Datenmengen effizient verwalten zu können. Durch die schnell ansteigende Nutzeranzahl sanken die Reaktionszeiten. Vor allem die Suchläufe auf den auf MySQL basierenden Posteingängen, auf welchen täglich mehrere Mrd. Schreibzugriffe erfolgten, nahmen immer mehr Zeit in Anspruch.49 Cassandra wurde in der Programmiersprache Java geschrieben und nutzt eine Synthese aus bekannten und etablierten Techniken, wie Partitionierung und Replikation, um die benötigte hohe Skalierbarkeit und Verfügbarkeit sicherzustellen. 50 Die Replikation kann in ihrem Umfang beschränkt werden, beispielsweise auf Datenzentren oder Serverschränke. Die Knoten des Systems wissen stets wo sie sich physisch befinden, was sehr vorteilhaft sein kann, um Latenzen gering zu halten. Der Eintritt eines neuen Knotens beginnt mit dem Kopiervorgang von Daten eines bereits ausgelasteten Knotens, was mit dem Ergebnis resultiert, dass sich beide den Schlüsselbereich und damit einhergehend die Arbeit teilen. Eine Lese –oder Schreiboperation kann auf einem beliebigen Knoten stattfinden, da dieser die Anfrage anschließend an den oder die betreffenden Knoten weiterleitet. Gewährleistet wird dies durch die Ermittlung des betroffenen Schlüssels. Die Speicherung erfolgt sowohl auf der Festplatte als auch auf dem Hauptspeicher, auf welchem zumeist die aktuellen Daten oder Indizes abgelegt werden. Jede Spalte (Column) erhält ihre eigene ID, über welche sie angesprochen werden kann (s. Abb. 5). Abb. 5: Die „Artikel“-Relation als SuperColumn in Cassandra. Darunter die einzelne SubColumn ArtNr1 Mit einem, im Hintergrund betriebenen Prozess, werden sämtliche Speicherabbilder zusammenführt und daraus ein „Superindex“ erstellt. Aus diesem lässt sich herleiten in welchen Daten ein Schlüssel vorkommt. Im Falle einer Anfrage wird zuerst im Speicher nachgesehen, ob die angefragten Daten dort noch vorhanden sind, ist dies nicht mehr gegeben, so werden die Daten an Hand der entsprechenden Indizes von der Festplatte geladen.51 Gegenwärtig wird das System in vielen Unternehmen erfolgreich eingesetzt. Neben Facebook nutzen weitere bekannte Firmen wie Cisco, Twitter, Digg oder Rackspace die Open-Source-Datenbank.52 49 [Bin_2010] S. 14, Kap. 3.1 [Malik_2009] Kap. 1 51 [Bin_2010] S. 17 – 18, Kap. 3.4, 3.5 52 [Cass_2009] 50 26 3.4 Graphorientiertes Datenmodell Graphenorientierte Datenmodelle können dadurch definiert werden, dass Datenstrukturen als Graphen oder Generalisierungen modelliert werden und Datenmanipulationen mittels graphenorientierter Operationen und Typkonstruktoren dargestellt werden. Sie sind nicht an strikte Schemata gebunden und eignen sich deshalb auch zur Verwaltung von häufig variierenden Daten(-typen) und verändernden Strukturen. Diese Modelle kamen, zusammen mit den objektorientierten Datenmodellen, in den Achtzigern und Anfang der Neunziger Jahre auf. Ihr Einfluss verschwand allmählich mit dem Aufkommen anderen Datenmodelle, namentlich den geographischen, räumlichen sowie den semi-strukturierten Datenmodellen. In jüngster Zeit stieg jedoch der Wunsch nach der Verwaltung von Informationen in einem graphähnlichen Schema. Die Anwendungsbereiche sind sehr verschieden. Zu ihnen gehören beispielsweise Applikationen aus dem GIS-Sektor, in welchem Aufgaben zur Speicherung und Darstellung geographischer Daten übernommen werden. Auf der anderen Seite bestehen auch im medizintechnischen Bereich Einsatzmöglichkeiten, zum Beispiel bei der Visualisierung von chemischen oder biologischen Daten.53 so dass dieses Modell wieder an Relevanz gewann. Datenmodelle dieser Art werden bevorzugt in den Bereichen angewandt, in denen Informationen über die Dateninterkonnektivität –oder Topologie wichtiger oder ebenso wichtig ist, wie die Daten selbst. Daten und ihre Relationen untereinander sind hier für gewöhnlich gleichwertig. Die Einführung von Graphen als Modellierungswerkzeug birgt für diesen Daten mehrere Vorteile. Zum einen sind Graphenstrukturen für den Benutzer sichtbar und erlauben eine natürlichere Handhabung von Programmdaten. Sie bieten die Möglichkeit alle Informationen über eine Entität in einem Knoten zu behalten und auf diesen Knoten bezogene Informationen durch Kanten darzustellen. Darüber hinaus können Anfragen direkt auf die Graphstruktur bezogen werden. Zu den ressourcenintensivsten und kompliziertesten Dingen, welche in einer SQL-Datenbank gespeichert werden können, sind die Beziehungen zwischen verschiedenen Elementen. Als Beispiel sei hier das Geflecht der Freunde und Bekannten in einem sozialen Netzwerk genannt. Nicht selten sind, in einer SQL-Datenbank, mehrere Abfragen notwendig, um eine solche Beziehung zu durchlaufen. Beim graphorientierten Datenmodell hingegen, können spezifische Graphoperationen aus der Anfragesprachenalgebra angewandt werden, um zum Beispiel den kürzesten Pfad zu ermitteln oder die Determinierung bestimmter Subgraphen vor zunehmen. Explizite Graphen und Graphoperationen erlauben dem Anwender Anfragen mit einem hohen Abstraktionsgrad zu formulieren. Aus einer gewissen Sicht, ist dies das Gegenteil der Graphenmanipulation in deduktiven Datenbanken, in welchen häufig komplexe Regeln geschrieben werden müssen. Im graphenorientierten Datenmodell ist es möglich wichtige Anfragen zu formulieren, ohne 53 [Wneo_2010] 27 das Wissen über die vollständige Struktur zu besitzen. Graphendatenbanken können ihre Stärken bei der Darstellung von Elementen ausspielen, bei denen die Beziehungen zueinander im Fokus stehen. Selbstverständlich lassen sich auch Informationen in einer Graphendatenbank speichern, die keinen Beziehungsbezug haben, allerdings bliebe hier ab zu wägen, in wiefern dies sinnvoll ist.54 55 3.4.1 Eigenschaften graphorientierter Datenmodelle Graphorientierte Datenmodelle Darstellung / Format der Informationen Präzise Abfragen / Sek. Indizes Konsistenz (Methoden) MultiServerBetrieb Skalierbarkeit (Techniken) Performanz Schema Knoten u. Kanten (Anhängen diverser Dateiformate möglich) Präzise Abfragen möglich / Sek. Indizes werden unterstützt Hoch (MVCC, aber auch mittels Write-Locks Betrieb auf mehreren Servern wird unterstützt Sehr hoch (oft über Replikation oder Sharding) Sehr hoch (Oft auch bei hoher Serverzahl u. tiefen Abfragen) I. d. R. schemafrei 3.4.2 Neo4j Neo4j war ursprünglich als hausinterne Technologie des kleinen, im schwedischen Malmö beheimateten, Softwareunternehmens Windh Technologies gedacht. Windh entwickelt und verkauft Dienste aus dem ECM-Bereich für den öffentlichen Sektor und die Rüstungsindustrie. Als das relationale Datenbankmodell den Ansprüchen nicht mehr genügte, begann man an einer eigenen Lösung zu arbeiten.56 Der Start der ersten Beta-Version fand im November 2007 statt und im Februar diesen Jahres schließlich wurde die Veröffentlichung von Neo4j 1.0 bekannt gegeben.57 Derzeit gibt es noch kein standardisiertes Graphenmodell, jedoch lässt sich allgemein festhalten, dass Graphenmodelle Informationen in - Knoten (engl. Nodes), - Kanten (mit Richtung und Typ) und - Eigenschaften (für Knoten und Kanten) 54 [SGDB_2008] S. 4, Kap. 2.1, S. 5, Kap. 2.2 [Heise_2010] 56 [Neo_2010] 57 [Nblog_2010] 55 28 abbilden. Gerade RDBMS-Implementationen können rekursive Strukturen, wie Dateibäume, vernetzte Verhältnisse und soziale Relationen, sehr schwer performant abfragen. Jede Kante stellt zumindest einen Join auf der Ausführungsebene eines RDBMS dar, welcher wiederum eine Mengenoperation zwischen den Tupeln zweier Tabellen erfordert, was sich nachteilig auf die Geschwindigkeit auswirkt. Eine große Stärke der graphenorientierten Datenmodelle liegt daher in der Performanz.58 Die Graphorientierte Datenbank Neo4j wurde in Java geschrieben. Wie in vielen anderen Open-Source Datenbanken aus dem NoSQL-Bereich, werden aber auch hier noch weitere Programmiersprachen, wie beispielsweise Python, Scala, JRuby oder Clojure, mit Hilfe des Einsatzes entsprechender APIAPIs, unterstützt.59 Zudem hat Neo4j mit Neoclipse ein Subprojekt ins Leben gerufen mit dem Ziel, durch Plugins für die freie Entwicklungsumgebung Eclipse, eine Möglichkeit zur graphischen Datenbankmodellierung bereitzustellen (s. Abb. 5). Abb. 6: Graphendatenbank in „Reinform“ – die SQL-Relation „Artikel“ in Neoclipse Neo4j kann mit einer starken Skalierbarkeit und Performanz aufwarten, während es zugleich ohne Schwierigkeiten mehrere Milliarden(!) Knoten, Kanten und Eigenschaften verwaltet. Durch den geschickten Einsatz von Caches werden Leseleistungen von über 2000 58 59 [Peter_2010] [OpenS_2010] 29 Kantenschritten pro Millisekunde, was also etwa 2 Mio. Schritte pro Sekunde entspricht, erreicht. In einem Vergleich mit einem Netzwerk von 1000 Personen und dem „Freundemeiner-Freunde-Problem“, konnte Neo4j eine 1000fach höhere Geschwindigkeit gegenüber einem MySQL-Gegenstück erreichen. Der Unterschied steigt dabei expotenziell mit der Größe des Graphen. Die enormen Geschwindigkeiten können dadurch erzielt werden, das die Traversierung entlang der Kanten mit einer konstanten Geschwindigkeit erfolgt und das zudem noch unabhängig von der Größe des Graphen. Es müssen somit keine Einbußen bei größeren Setoperationen, wie beispielsweise in den RDBMS-Joins, hingenommen werden. Darüber hinaus lädt Neo4j nach dem so genannten „lazy“-Verfahren. Knoten und Relationen werden also nur dann eingelesen, wenn sie wirklich im ResultSet abgefragt werden. Dies wirkt sich zusätzlich optimierend auf die Performanz speziell bei großen und tiefen Traversierungen aus.60 60 [PNeu_2010] 30 3.5 Gesamtübersicht Dokumentenorient. Datenmodell Key-Valueorient. Datenmodell Spaltenorient. Datenmodell Graphenorient. Datenmodell Dokumente und Anhänge (oft BSON oder JSON) Sehr verschieden (häufig BLOB) Spalten + Attribute (Rows) / überwiegend JSON, BSON Knoten u. Kanten (Anhängen diverser Dateiformate möglich) Präzise Abfragen / Sek. Indizes Präzise Abfragen möglich / Sek. Indizes werden unterstützt In der Regel nicht Präzise Abfragen möglich / Sek. Indizes werden unterstützt Präzise Abfragen möglich / Sek. Indizes werden unterstützt Konsistenz (Methoden) Mittel – Hoch (häufig Update-in-place oder MVCC) I. d. R. schwach (in-Memory, optimistic concur-rency control) Mittel - Hoch (Variiert aufgrund des Einsatzes versch. Methoden u. a. MVCC) Hoch (oft MVCC, Neo4j bietet ACIDIntegrität aber mit Locking Betrieb auf Mehreren Servern wird unterstützt Betrieb auf mehreren Servern wird unterstützt Betrieb auf mehreren Servern wird unterstützt Betrieb auf mehreren Servern wird unterstützt Sehr hoch (Replikation, Sharding) Sehr hoch (Replikation, Sharding Sehr hoch (Replikation, Sharding Sehr hoch (Replikation, Sharding) Performanz I. d. R. Hoch (Abhängig von Konsistenzmethode sowie tiefe der Abfragen, besonders bei WriteZugriffen Sehr hoch (Aufgrund der oft nicht vorhandenen Möglichkeiten für präzise Abfragen) I. d. R. Hoch (Abhängig von Konsistenzmethode u. Anzahl der Abfragen – besonders bei Write-Zugriffen Sehr hoch (oft auch bei hoher Serverzahl u. tiefen Abfragen) Schema Generell schemafrei, oft zusätzl. unterstützende Gruppierungsfunktionen wie Collections oder Views schemafrei schemafrei Darstellung d. Informationen / Formate Multi-ServerBetrieb Skalierbarkeit (Techniken) Schemafrei bzw. flexibel 31 3.6 Fazit Die NoSQL-Bewegung präsentiert sich mit einem hohen Maß an Kreativität und einer Fülle an neuen Ideen und Entwicklungen, die Datenbanken sind der Beweis dafür. Zwar hat dieser Artikel nur die vier bekanntesten NoSQL-Datenmodelle vorgestellt, jedoch lässt sich eindeutig erkennen wie derzeit zahlreiche NoSQL-Storage-Systeme entstehen. So vielfältig die verschiedenen Datenmodelle sind, so unterschiedlich gestalten sich die Bereiche, in denen sie zum Einsatz kommen. Zum einen lässt sich eindeutig bestimmen, dass die Zeit der „Allround-Datenbank“, die für alle Einsatzbereiche und Segmente eingesetzt wurde, vorbei ist. Der Trend geht dahin, dass ein bestimmtes Datenmodell für ein bestimmtes Einsatzgebiet zuständig ist. Auf Grund der Tatsache, dass jedes Datenmodell seine individuelle Spezialisierung besitzt, lässt sich hier ein direkter Vergleich der verschiedenen Datenmodelle schwerlich umsetzten und bewerten. Die NoSQL-Datenbanken können ihre Stärken am effektivsten ausspielen, wenn sie für die Bewältigung der entsprechenden Aufgaben benutzt werden. Hier lassen sich zum einen beispielsweise der flexible Umgang mit variablen Daten nennen, was auf das dokumentenorientierte Datenmodell (s. Kap. 3.1 Dokumentenorientiertes Datenmodell) zutreffen würde. Die Abbildung von Beziehungen und Relationen träfe auf das graphenorientierte Datenmodell (s. Kap. 3.4 Graphorientiertes Datenmodell) zu und die simple Reduzierung der Datenbank auf einen Behälter für Schlüssel-Wert-Paare ist eine Stärke des Key-Value-orientierten Datenmodells (s. Kap. 3.2 Key-Value-orientiertes Datenmodell). Viele NoSQL-Datenbanken, wie beispielsweise CouchDB oder Cassandra, lockern die Konsistenzgarantien ein Wenig auf um dafür mit Vorteilen, wie zum Beispiel der Skalierbarkeit, aufwarten zu können. Andere wiederum, wie etwa die graphenorientierten Datenbankmodelle, sind auf die Speicherung spezieller Daten optimiert, die sich in einem relationalem Datenbanksystem nur mühsam abbilden lassen würden. Deutlich macht sich bei diesen Datenmodellen jedoch die fehlende Standardisierung bemerkbar und das bei den eingesetzten Mechanismen zur Bewältigung spezifischer Anforderungen, wie auch in der Bedienung. Zwar bietet jedes Produkt die Möglichkeit auf viele verschiedene Programmiersprachen zurückgreifen zu können, eine einheitliche Abfragesprache wie die SQL aus der relationalen Welt, ist jedoch nicht verfügbar. „Umsteiger“ aus der relationalen Welt werden sich zudem auch an das Fehlen von jeglichen vorgegebenen Schemata und Strukturen gewöhnen müssen. Relationen bietet keines der Datenmodelle, genauso wenig wie beispielsweise Joins für übergreifende Abfragen. Letztere müssen eigens in der jeweiligen Programmiersprache programmiert werden. Allen Datenmodellen der NoSQL-Familie jedoch gereicht zum Vorteil, dass sie Alternativen schaffen und den Datenbankmarkt dadurch neu beleben werden. 32 4. Vergleich verschiedener Datenbanksysteme Dieses Kapitel soll dazu dienen, an Hand eines einfachen CRUD-Projektes die Funktionsweisen einer relationalen und einer NoSQL-Datenbank gegenüberzustellen und anschließend zu vergleichen. Stellvertretend für relationale Datenbanken soll an dieser Stelle der bisherige Marktführer Oracle61 mit dem gleichnamigen Produkt Oracle 11g für einen Vergleich herangezogen werden. Aus Ermangelung eines eindeutig bestimmbaren Marktführers aus der Reihe der NoSQL-Datenmodelle, mangels derzeit (Juli 2010) nicht vorhandener Marktanteilinformationen oder entsprechender Statistiken, hat sich der Autor dazu entschlossen die dokumentenorientierte Open-Source-Datenbank MongoDB für den Vergleich heranzuziehen. Als Grund sei hier auf die Referenzen der Datenbank hingewiesen, die gegenwärtig in über 100 Unternehmen, Magazinen und Projekten eingesetzt wird62. Dieser Wert wird, nach den Recherchen des Autors, aktuell von keiner anderen Datenbank aus der NoSQL-Sparte erreicht. Neben den, für die Durchführung der einzelnen Operationen des CRUD-Projekts, benötigten Befehlen, soll auch kurz auf die konzeptionellen Eigenheiten beider Datenmodelle, wie beispielsweise den Clients und Schemavorgaben, eingegangen werden. Inhalt des Projekts ist eine Artikeltabelle, die mit verschiedenen Werten und Datentypen gefüllt, bearbeitet und abschließend vollständig gelöscht wird (s. Kap. 4.2 CRUD-Projekt mit Oracle Database 11g und Kap. 4.3 CRUD-Projekt mit MongoDB). Auf Grund der häufigen Erwähnung der, ebenfalls dokumentorientierten NoSQL-Datenbank, CouchDB in dieser Arbeit, sollen der Vollständigkeit halber auch diese beiden Datenbanken verglichen und auf ihre konzeptionellen Unterschiede hin untersucht werden (s. Kap. 4.4 Gegenüberstellung von CouchDB und MongoDB). In einem anschließenden Resümee werden die gewonnenen Eindrücke zusammengefasst (s. Kap. 4.5 Fazit). 4.1 Oracle 11g in der Cloud Seit September 2008 begann Oracle damit seine Softwarepalette über die CloudInfrastruktur von Amazon (EC2) anzubieten. In diesem Angebot ist auch die relationale Datenbank Oracle 11g Standard Edition enthalten. Diese kommt, neben weiterer zusätzlicher Software, in einem Paket, dem so genannten Business Process Management (Oracle BPM). Das BPM wird als ein Amazon Machine Image (AMI) verfügbar gemacht, welches bereits vorkonfiguriert und ohne Installation nutzbar ist. Somit besitzt Oracle eine der ersten relationalen Datenbanken in einer Cloud-Umgebung. Allerdings unterliegt ihre Nutzung einigen Einschränkungen. Neben einer benötigten Softwarelizenz von Oracle, müssen 61 62 [Info_2008] [Mong_2010] 33 Nutzungsgebühren für die Inanspruchnahme der Cloud-Dienste von Amazon entrichtet werden. Darüber hinaus unterstützt EC2 (noch) keine Cluster, was die Skalierbarkeit der Datenbank somit stark begrenzt.63 64 65 4.2 CRUD-Projekt mit Oracle Database 11g 1977 gründete „Larry“ Ellison, zusammen mit den Mathematikern Bob Miner und Ed Oates, die Software Development Labs (SDL), in welcher die erste Version der Oracle-Datenbank entstand. Aus der SDL wurde zwei Jahre später die Relational Software Inc. (RSI) und 1983 benannte sich das Unternehmen, das mittlerweile die 3. Version der Datenbank veröffentlicht hatte, schließlich in Oracle um. Über die 80er und 90er Jahre hinweg, wuchs das Unternehmen an und erweiterte seine Angebotspalette sowie seine Unternehmenssparten kontinuierlich.66 Die Konkurrenz für Oracles Datenbank besteht unter anderem aus DB2 von IBM, SQL Server von Microsoft und verstärkt auftretende Opern-Source-Produkte. Die proprietäre Oracle Database 11g ist eine objektrelationale Datenbank und ihre Kommunikation erfolgt, nicht anders als bei ihren Vorgängern auch, über die etablierte Abfragesprache SQL. Als Client bietet sich der hauseigene SQL Developer an, da dieser lediglich eine Registrierung verlangt und ansonsten frei erhältlich ist. Darüber hinaus ist nach dem Download des Clients kein Installationsvorgang nötig – die EXE-Datei kann sofort ausgeführt werden. Einzige Vorraussetzung für den einwandfreien Betrieb des auf Java basierenden Clients, ist das vorhanden sein des Java Development Kits (JDK). Nachdem der Datenbanktreiber eingerichtet und die Verbindung hergestellt wurde, präsentiert sich die Benutzeroberfläche des SQL Developers in einem Design, welches dem Windows Explorer sehr ähnlich ist. Es bietet unter anderem ein spezielles Fenster für die Eingabe der SQLBefehle sowie, nach erfolgter Ausführung des Codes, ein Result-Fenster mit einer Ausgabe in tabellarischer Form. Mit dem „CREATE TABLE“-Befehl kann sogleich eine Tabelle erstellt werden. Oracle ist eine schemabasierte SQL-Datenbank, was bedeutet, dass die Tabellen bei der Erstellung in einer vordefinierten Struktur angelegt werden müssen. Die Datentypen der eingetragenen Werte, müssen also dem, in den Spalten festgelegten Typ, entsprechen, andernfalls wird die Transaktion abgebrochen und eine Fehlermeldung ausgegeben. Gefüllt wird die Tabelle mit dem „Insert“-Befehl, die Ausgabe erfolgt grundsätzlich über ein „Select“. Selbstverständlich erlaubt SQL die nachträgliche Änderung von Werten oder Datenstrukturen. Bewerkstelligt wird dies mit einem „Update“-Befehl. Ein „Delete“ löscht einzelne Zeilen aus der Tabelle, während die vollständige Tabelle mit dem „Drop“-Befehl aus der DDL, der Data Definition Language, gelöscht werden kann. 63 [Zdnet_2008] [Cptw_2008] 65 [OBPM_2010] 66 [O9i_2002] S. 4 – 12, Kap. 1 64 34 4.3 CRUD-Projekt mit MongoDB Die Computeranalysten und Wissenschaftler Dwight Merriman und Eliot Horowitz gründeten 2007 das Softwareunternehmen 10gen, das als Plattform gestaltet wurde, um Entwickler dabei zu unterstützen schnell und einfach komplexe und skalierbare Web-Applikationen zu entwickeln. Neben verschiedenen angebotenen Tools und Leistungen, wie beispielsweise Grid-Management und Applikationsserver, stellt die NoSQL-Datenbank MongoDB das derzeit bekanntestes Produkt der Firma dar und wird von vielen Unternehmen, insbesondere für Blogs und Cloud-Dienste, erfolgreich eingesetzt. Die frei verfügbare, dokumentenorientierte NoSQL-Datenbank MonoDB kann als Softwarepaket problemlos von der MongoDB-Webseite www.mongodb.org heruntergeladen werden. In der Downloadrubrik können die Binärdateien für Windows, die in einer gebündelten ZIP-Datei vorliegen, gefunden werden. Die derzeit (Stand Juni 2010) aktuellste Version der Datenbank ist v1.4.4. Sind die Dateien einmal an einem gewünschten Ort gespeichert und ausgepackt worden, ist der Installationsvorgang damit auch schon beendet. Das Paket besteht insgesamt aus drei Verzeichnissen, von denen nur das „bin“-Verzeichnis für die Anwendung interessant ist. Von den acht darin befindlichen ausführbaren EXEDateien, sind primär die Dateien Mongod und Mongo relevant. Bei der Ersten handelt es sich um den MongoDB-Datenbankprozess bzw. den Datenbankserver, der mit der zweiten Datei, dem Befehlszeilen-Shellclient angesprochen werden kann. Standardmäßig wird eine Verbindung mit einer Testdatenbank hergestellt. MongoDB nutzt im Wesentlichen die Javascript Object Notation (JSON) als Datennotation. Intern speichert MongoDB die Daten in BSON, einer binären Obermenge von JSON. Ist die Shell einmal gestartet, können sofort beliebige Funktionen oder Berechnungen mit Javascript eingegeben und ausgeführt werden. Die Kommunikation erfolgt derzeit über Kommandozeilenfenster, da eine GUI noch nicht verfügbar ist. Eine solche befindet sich in Planung und wird voraussichtlich erst in einer späteren Version der Datenbank verfügbar sein. Da MongoDB eine schemafreie Datenbank ist, gibt es keine Tabellen, wie sie aus dem relationalen Datenmodell bekannt sind. Um zusammenhängende Dokumente dennoch in einer einheitlichen Struktur unterbringen zu können, bietet MongoDB so genannte Collections an. Diese werden jedoch erst angelegt, wenn zumindest ein Dokument darin erstellt wurde. Die Collections können als ein Äquivalent zu den Tabellen eines RDBMS angesehen werden. Im dokumentenbasierten Ansatz können sie als „Ordner“ eingesetzt werden, um zusammenhängende Dokumente (Thema, Rubrik etc.) zu gruppieren und präzisere Abfragen zu ermöglichen. Beispielsweise ließe sich eine „Papierkorb“-Collection dazu nutzen, um, wie aus Microsofts Betriebssystem Windows bekannt, für den Löschvorgang bestimmte Dokumente zu speichern. Diese Funktion ist insofern interessant, als das MongoDB keine Undo-Fähigkeit besitzt, d.h. 35 gelöschte Dokumente nicht wieder hergestellt werden können. Die Befehle Insert, Update und Delete sind in MongoDB unter den Ausdrücken Insert, Save und Remove bekannt, führen jedoch meist die selben Funktionen aus. Wie bereits erwähnt, wird eine Collection erst erstellt, wenn ein Dokument angelegt wurde. Einen Create-Befehl kennt MongoDB dafür nicht, hier wird ebenfalls mit „Insert“ erstellt. Zur Veranschaulichung dient das folgende Syntaxbeispiel, in welchem ein Artikel mit mehreren Attributen in die Collection „Artikel“ eingefügt wird: > db.Artikel.insert( { „_id“ : 1, “ArtNr“ : 1, “Bez“ : “Tastatur“, “Preis“ : 10, “Bestand“ : 100} ); Es bietet sich an dieser Stelle an, dem eingefügten Dokument eine ID zu vergeben, da MongoDB ansonsten eine zufällige generiert. Diese ist jedoch häufig zwanzig oder mehr Zeichen lang, was der Übersichtlichkeit ein Wenig abträglich ist. Es lassen sich auf diese Weise beliebig viele und verschiedene Objekte hinzufügen, da die Schemafreiheit auch innerhalb der Collection besteht. Folgende Eingaben wären möglich und von MongoDB anstandslos akzeptiert: > db.Artikel.insert( { “ArtNr“ : 2, “Bez“ : “Maus“, “Preis“ : 5, “Bestand“ : 200, “_id“ : 2 } ); > db.Artikel.insert( { “_id“ : 3, “Bez“ : “Monitor“, “ArtNr“ : 3, “Preis“ : 100, “Bestand“ : 10 } ); > db.Artikel.insert( { “ArtNr“ : 4, “Bez“ : “Rechner“, “Preis“ : 200, “Bestand“ : 5 } ); Das Ergebnis dieser Eingaben kann mit dem Befehl „Find“ abgerufen werden: > db.Artikel.find() > {“_id“ : 1, “ArtNr“ : 1, “Bez“ : “Tastatur“, “Preis“ : 10, “Bestand“ : 100} > {“_id“ : 2, “ArtNr“ : 2, “Bez“ : “Maus“, “Preis“ : 5, “Bestand“ : 200} > {“_id“ : 3, “Bez“ : “Monitor“, “ArtNr“ : 3, “Preis“ : 100, “Bestand“ : 10} > {“_id“ : ObjectId(“4c500c5525460000000059f4“), “ArtNr“ : 4, “Bez“ : “Rechner“, “Preis“ : 200, “Bestand“ : 5} Der Unterstrich deklariert die ID als reservierte Bezeichnung von MongoDB. Sie wird unabhängig von der Eingabe an den Anfang gesetzt. Hingegen können die nachfolgenden Attribute beliebig versetzt und verändert werden, d.h. “ArtNr“ würde genauso akzeptiert werden wie beispielsweise “ArtikelNr“ usw. Die Objekt-ID stellt das Äquivalent zum PrimaryKey der SQL-Tabelle dar. Sie kann innerhalb der Collection nur einmal vergeben werden und ein Verstoß resultiert in der Ausgabe einer entsprechenden Fehlermeldung seitens der Shell. Im folgenden Beispiel werden nur die Informationen über Monitore aus der Collection abgerufen: 36 > db.Artikel.find( { “Bez“ : “Monitor“} ) > {“_id“ : 3, “Bez“ : “Monitor“, “ArtNr“ : 3, “Preis“ : 100, “Bestand“ : 10} Die Abfragen lassen sich mit Hilfe der Eingabe weiterer Bedingungen natürlich noch weiter präzisieren. Dazu stehen dem Anwender eine Reihe von Operatoren zur Verfügung. Diesen wird ein „$“ vorgesetzt, was so viel wie „ist enthalten in“ bedeutet. Auf Grund der Menge der Operatoren und Optionen, sowie der Tatsache, dass mit neuen Versionen von MongoDB meist auch neue Operatoren hinzukommen, soll hier nur eine Auswahl der Möglichkeiten präsentiert werden. Für ausführlichere Informationen verweist der Autor auf [Mquer_2010]. Um zu prüfen welche Artikel nicht mehr als 100€ kosten und von diesen zu gleich mehr als 10 Stück vorhanden sind, bietet sich die folgende Formulierung an: > db.Artikel.find( { “Preis“: { $lte: 100 }, “Bestand“: {$gt: 10} } ) Lte ist ein Konditionaloperator und bedeutet „less than or equal“ (dt. weniger als oder gleich). Analog dazu steht gt für „greater than“ (dt. größer als). Der $-Operator dient als Platzhalter für den zu prüfenden Wert, d.h. es wird in jedem Dokument auf diesen Wert eingegangen und mit dem angegebenen Wert (hier: 100 bzw. 10) verglichen. Das obige Beispiel lässt sich durch hinzufügen weiterer Bedingungen selbstverständlich entsprechend verfeinern. $in – prüfen, ob ein Wert oder Zeichen vorhanden ist (ähnlich „IN“ in SQL) $nin – prüfen, ob ein Wert oder Zeichen nicht vorhanden ist (ähnlich „NOT IN“ in SQL) Beide obigen Befehle eignen sich z.B. für eine Collection mit Posts oder Kommentaren, um nach bestimmten Werten, Wörtern oder Zeichen zu suchen. $or (ab v.1.5.1) – Entspricht logischem ODER > db.Artikel.find( { “Bez“ : “Monitor“, $or: [ {“Bestand“: 10}, {“Preis“: 100} ] } ) MongoDB bietet darüber hinaus noch zusätzliche Optionen, welche an die Abfragen angehängt werden können. Das Ergebnis des obigen Beispiels wird nun auf die ersten 10 Einträge begrenzt (limit(10)), sowie dem Preis nach absteigend sortiert (-1): > db.Artikel.find({ “Bez“ : “Monitor“, $or: [{“Bestand“: 10}, {“Preis“: 100} ] } ).sort({“Preis“: -1}). limit(10) 37 Neben der Erstellungsfunktion wird der Insert-Befehl zum hinzufügen eines Dokuments oder einer „Zeile“ bzw. einem Array benutzt. Der Save-Befehl ähnelt in der Syntax dem Insert und führt die selbe Aktion aus, wenn das zu ändernden Objekt ohne ID übergeben wird. Andernfalls wird nur die Änderung übernommen. Mit Save kann jedoch immer nur ein bestimmtes Objekt angesprochen werden. Um weitere Bedingungen einzufügen oder mehrere Datensätze zu verändern, ist der Update-Befehl anzuwenden. Auch hier sollen nur einige der Abfragemöglichkeiten aufgezeigt werden. Generell kann ein Update mit vier Parametern ausgeführt werden: db.collection.updage(criteria, objNew, upsert, multi). Criteria – Die Bedingung, die für ein Update erfüllt sein muss objNew – Das zumanipulierende Objekt upsert – Update falls schon vorhanden, einfügen (“Insert“), falls nicht multi – Wenn das Update für mehrere Objekte gelten soll auf Bei upsert und multi handelt es sich um boolsche Parameter, die entweder auf true oder false gesetzt werden können. Im folgenden Beispiel wird der Artikel „Monitor“ mit einem Peis von 50 gesetzt. Falls noch weitere Artikel mit dem selben Namen vorhanden sind, wird deren Preis ebenfalls auf den gleichen Wert gesetzt: > db.Artikel.update( { Bez : “Monitor“, { Bez: “Monitor“, Preis: 50 }, true, true } ) Auch hier lassen sich die Abfragen mit Hilfe diverser Operatoren ausweiten oder verfeinern. In [Aquer_2010] werden die Parameter und Operatoren eingehend erklärt. Der RemoveBefehl löscht das übergebene Objekt aus der Collection und kann mit den gleichen Parametern und Operatoren aufgerufen werden wie Find. Mit dem, auch in der SQL anzutreffenden, „Drop“ lässt sich die gesamte Collection löschen. Nach den Recherchen des Autors, sind die hier genannten Befehle nur innerhalb einer bestimmten Collection anwendbar. Operationen, die mehrere Collections betreffen, sollten jedoch über eigens programmierte Routinen erstellt werden können. 4.4 Gegenüberstellung von CouchDB und MongoDB Auf der einen Seiten weisen die NoSQL-Datenbanken CouchDB und MongoDB mehrere Gemeinsamkeiten auf. Beide gehören zur Gruppe der nicht-relationalen, dokumentenbasierten Datenbanken. Darüber hinaus sind sie zudem frei erhältliche Open-Source Produkte. Es gibt jedoch einige konzeptionelle Unterschiede in Bezug auf den Aufbau und die Umsetzung, welche die Datenbanken in bestimmten Einsatzbereichen besser bzw. 38 schlechter stellen. Im Folgenden sollen diese Unterschiede aufgelistet und beschrieben werden: Zugriffskontrolle und Updates Ein großer Unterschied zwischen den Datenbanken liegt in der Handhabung gleichzeitiger (konkurrierender) Zugriffe. CouchDB bedient sich zu diesem Zweck des MVCC-Verfahrens während MongoDB Updates sofort ausführt (Update-in-Place). MVCC (Multi Version Concurrency Control) ist sehr solide, kann aber keine 100%ige ACID-Integrität garantieren. Das Prinzip besteht darin, dass von jedem Dokument in CouchDB eine weitere Kopie (Version) existiert. Eine Transaktion T1 greift beispielsweise auf ein Dokument D lesend zu. Während dieser Zugriff noch andauert greift eine zweite Transaktion T2 auf das selbe Dokument zu allerdings schreibend. Während also T1 die erste Version ließt, ändert T2 zur gleichen Zeit die zweite Version des Dokumentes. Nach Abschluss des Updates ist jene zweite Version die „aktuelle“, so dass alle weiteren Zugriffe auf jene zweite Version erfolgen. Das bedeutet, dass die Datenbank für alle Konsistent ist, die nicht auf ein Dokument zugreifen, welches gerade geändert wird. Bei einem erneuten Zugriff sehen natürlich auch sie die Veränderungen. MVCC kommt völlig ohne Read-Locks aus und macht die Datenbank sicherer bei plötzlichen Störfällen (z.B. Stromausfall), da anschließend noch auf die letzte Version des Dokumentes zugegriffen werden kann. Auch ist dies für Offline-Datenbanken von Vorteil, die erst zu einem späteren Zeitpunkt synchronisiert werden. MongoDB wiederum benutzt das „Update-in-Place“-Verfahren, welches ohne Kopien oder Versionen der Daten auskommt. Letzteres ist somit zwar speichereffizienter, kann aber weder Write –noch ReadLocks ausschließen und ist zudem kritischer, wenn sich zum Zeitpunkt eines Updates eine Störung ereignet. Je nachdem wie lange die „Slaves“ benötigen, um ein Update durchzuführen ist „Update-in-Place“ fast ACID-konform. Horizontale Skalierung Beide Datenbanken lassen sich selbstverständlich horizontal skalieren. CouchDB wie MongoDB unterstützen zu diesem Zweck sowohl das Sharding als auch die Replikation. Bei Letzterer werden jedoch unterschiedliche Verfahren angewandt. Während CouchDB nach dem Master/Master-Verfahren repliziert, ist MongoDB auf die Master/Slave-Replikation ausgelegt. Das bedeutet, dass unter CouchDB auf jedem Server der Datenbank Lese –und Schreibzugriffe erfolgen können, wohingegen Änderungen bei MongoDB zuerst nur auf dem Mastergerät erfolgen und dann auf die Slave-Geräte weitergeleitet werden. Beide Replikationsarten haben ihre Vor –und Nachteile. In einer Master/Master (auch Multimaster)Replikation, kann jedes Gerät Updates auf der Datenbank durchführen, was das System stabiler gegenüber Ausfällen einzelner Geräte macht. Fällt der Master in der Master/Slave- 39 Repliaktion aus, muss dieser entweder wiederhergestellt werden oder ein Slavegerät übernimmt die Master-Eigenschaft. In beiden Fällen können auf der Datenbank, für den Zeitraum der Wiederherstellung, nur Lesezugriffe erfolgen. Der Nachteil beim MultimasterSystem ist, dass die Geräte meist asynchron konfiguriert sind, da jedes Gerät unabhängig Updates durchführen kann. Dadurch kann wiederum keine ACID-Konsistenz garantiert werden. Die Master/Slave-Replikation wird daher bevorzugt eingesetzt. Hier bestätigt der Master das Update und gibt dieses an alle „Slaves“ weiter. Objektspeicherung MongoDB speichert Objekte Collection-basiert (s. Kap. 4.3 CRUD-Projekt mit MongoDB). Solche oder ähnliche Gruppierungsfunktionen existieren in CouchDB (noch) nicht. Entwicklungssprache CouchDB wurde zuerst in C++ geschrieben. Während man bei MongoDB dabei geblieben ist, wechselten die Entwickler bei Apache auf die Sprache Erlang. Diese Sprache wurde, innerhalb der Firma Ericsson, primär für Anwendungen im Telekommunikationsbereich entwickelt. Bei der Entwicklung der Sprache gab es drei grundlegende Anforderungen: Die Sprache sollte Änderungen an Programmen auch während der Ausführung erlauben. Die Anwendungen mussten i. d. R. über Jahre hinweg fehlerfrei betrieben werden – im Störfall sollten sich Anwendungen daher nicht gegenseitig behindern. Zudem sollte ein, auf mehrere Rechner, verteilter Betrieb der Anwendungen möglich sein.67 Beide Hersteller bieten Programmierschnittstellen an, so dass sich Anwender bei der Kommunikation weder auf C++ noch auf Erlang festlegen müssen. Eine der Kernbotschaften der NoSQL-Bewegung ist, dass es keine Datenbank für alles mehr gibt. Dies gilt aber ebenso für NoSQL-Datenbanken untereinander. CouchDB ist nicht grundsätzlich besser als MongoDB und umgekehrt. Die Stärken können beide Datenbanken erst dann ausspielen, wenn sie unter entsprechenden Konditionen eingesetzt werden. MongoDB ist auf hohe Leistung und Geschwindigkeit zugeschnitten, was mehrere Benchmark-Tests und Vergleiche dargelegt haben.68 69 70 CouchDB kann dafür unter anderem in Szenarien mit häufigen, gleichzeitigen Zugriffen punkten. Ist die Datenbank häufig offline oder wird auf eine verteilte Master/Master-Replikation bestanden, bietet sich der Einsatz von CouchDB an. Ist dagegen hohe Performanz gefragt, beispielsweise bei der 67 [Erlng_2008] [Chap_2009] 69 [Brwn_2010] 70 [Bnch_2009] 68 40 schnellen Speicherung von Daten oder häufigen Zwischenspeicherungen von Daten aus anderen Quellen, würde MongoDB das Rennen machen.71 4.5 Fazit Der Vergleich hat verstärkt die Deutlichkeit zu Tage gefördert, wie sehr sich das relationale vom dokumentenorientierten Datenmodell unterscheidet. Beim Wortlaut des einen oder anderen Befehls, von denen einige auch die selbe Funktion besitzen, hören bereits sämtliche Gemeinsamkeiten auf. Für den versierten SQL-Anwender stellt besonders die schemafreie Struktur ein Novum dar, an welches er sich erste einmal wird gewöhnen müssen. Keine Tabellen, Spalten oder Zeilen, keine Primärschlüssel oder Fremdschlüsseleinschränkungen die es zu beachten gilt. Im umgekehrten Schluss bedeutet dies aber auch, dass bei der Erstellung beispielsweise einer Collection, also dem Tabellen-Äquivalent des dokumentenorientierten Datenmodells, die Reihenfolge der jeweiligen Eintragung eingehalten werden sollte. Wird die Eintragung nicht mit einer selbst definierten ID begonnen, sondern sofort mit der Artikelnummer zum Beispiel, stört das MongoDB überhaupt nicht. Es generiert per Zufall eine eigene ID und fügt diese einfach hinzu. Werden die Werte für „Preis“ und „Bezeichnung“ versehentlich vertauscht, ist das für MongoDB ebenfalls unerheblich – jeder Eintrag ist vom Typ JSON. Allgemein lässt sich festhalten, dass sich Datenbanken wie MongoDB gut für Anwendungen und Komponenten eignen, die Daten speichern müssen, die häufig verwendet werden und auf welche schnell zugegriffen werden muss. Websiteanalysen, Foren, Benutzereinstellungen sowie jedes System, in welchen Daten nicht vollständig strukturiert sind oder von der Struktur her flexibel sein müssen, bieten sich als Einsatzgebiet für MongoDB an. Das System aktualisiert Dokumente atomarisch, besitzt jedoch kein Transaktionskonzept, welches die Aktualisierung mehrerer Dokumente auf einmal abdeckt. Das heißt nicht, das MongoDB keine Dauerhaftigkeit verfügt, es bedeutet nur, dass eine MongoDB-Instanz einen Stromausfall weniger gut verkraftet als eine SQL Server-Instanz. In Systemen, in denen ACID-konforme Tranksaktionen erforderlich sind, sollten deshalb weiterhin relationale Datenbanken eingesetzt werden. Unternehmenswichtige Daten, wie beispielsweise Stammdaten, eignen sich nicht für die Speicherung in einer MongoDB-Instanz. Allenfalls für deren Replikation auf einem Webserver oder für die Zwischenspeicherung.72 Positiv fällt auf, wie überaus einfach der Einstieg in MongoDB ist – auch für Neulinge, die bisher eher auf dem SQL-Gebiet heimisch waren. Ein rudimentäres Verständnis einer der unterstützten Sprachen genügt bereits, um grundlegende Operationen auf dieser NoSQL-Datenbank durchführen zu können. Eine 71 72 [Merr_2010] [MSDN_2010] 41 ausführliche Dokumentation, Blogs und Foren zu verschiedenen Themen, Typen, Operationen und Funktionen der Datenbank, tragen das ihre zur Verständlichkeit bei. 42 5. Schlusswort Mit der Schemafreiheit, Dynamik, Skalierbarkeit und einem, von wenigen proprietären Umsetzungen abgesehen, freien Erwerb der NoSQL-Datenbanken, hat die gleichnamige Community definitiv eine Bresche in den Datenbankmarkt geschlagen und ihn belebt. Die NoSQL-Datenbanken können ihren relationalen Gegenparts, auf dem Cloud-Gebiet allein schon deshalb eine harte Konkurrenz bereiten, weil sie die benötigten Eigenschaften mitbringen, welche für den Einsatz in dieser Umgebung nötig sind (s. Kap. 2.1 RDBMS und die Anforderungen der Cloud-Technologie). Aber können sie die Vorherrschaft der traditionellen relationalen Datenbankmanagementsysteme beenden? Diese Frage kann eindeutig mit einem „Nein“ beantwortet werden, dem jedoch ein „aber“ folgen muss. Zum Einen ist die Verdrängung des relationalen Datenmodells nie die Intention der Community gewesen. NoSQL ist schließlich nicht die Abkürzung für „no“, sondern „not only“ SQL. Die neuen Datenmodelle sollen vielmehr als Alternativen verstanden werden, die in bestimmten Gebieten eingesetzt werden können, auf denen sie mehr Potenzial aufbieten als relationale Datenbanken dazu in der Lage sind. Und dies ist auch die Kernaussage der gegenwärtigen Entwicklung auf dem Datenbanksegment: Die Zeiten der „Eine-für-alles“-Datenbank sind vorbei. Der Trend geht dahin aus einer Vielzahl an Datenmodellen die optimale Lösung für ein Aufgabengebiet auszuwählen und das gilt auch für die verschiedenen NoSQLDatenbanken selbst (s. Kap. 3. Gegenüberstellung etablierter NoSQL-Datenmodelle). Google geht da mit gutem Beispiel voran. Der Internetgigant besitzt mit BigTable, eine der derzeit wohl ausgereiftesten NoSQL-Lösungen und betreibt doch seine Internetwerbeplattform „AdWords“ nach wie vor auf einer MySQL-Instanz. NoSQLDatenbanken werden durch die erwähnte Schemafreiheit sehr viel flexibler bei der Ablage von beliebigen Dokumenten sein. Sind genau strukturierte Tabelleninhalte von vorrangiger Bedeutung und müssen ACID-konforme Transaktionen eingehalten werden, besitzen NoSQL-Datenmodelle hier weniger gute Karten (s. Kap. 2.3.3 Funktionale Partitionierung und die ACID-Alternative „BASE“). Auf der anderen Seite sind relationale Datenbanken darauf ausgelegt auf einem zentralen Server betrieben zu werden, welcher zudem noch aus einer qualitativ hochwertigen Hardware zusammengestellt ist. Das Cloud Computing zieht eine seiner größten Stärken aber aus der Möglichkeit, Applikationen und Dienste immer und überall bereitstellen zu können. Dies wiederum setzt den Einsatz meist kleinerer einfacher Rechner und einer dezentralen Struktur voraus. Das bedeutet also, dass die Verteilung von Anfragen vermehrt an Bedeutung gewinnen wird. Die relationalen Systeme bieten an dieser Stelle zwar Cluster-Lösungen an, sind von ihrem Grunddesign her jedoch nicht dafür ausgelegt. Resultierend daraus kommt man, besonders bei neueren Webanwendungen, sogar mit jenen relationalen Clustern an ihre Grenzen. Neben verteilten Servern, spielen die 43 immensen Datenmengen eine entscheidende Rolle. Hier bieten die NoSQL-Datenbanken flexible Datenskalierungsmöglichkeiten (s. Kap. 2.3.2 Datenbankskalierung). Zum Anderen bringt diese Umstellung auch konzeptionelle Änderungen in Bezug auf die eingesetzte Hardware mit sich. Da sich die Maschinen nun gegenseitig unterstützen und die Eine im Störfall den Dienst der Anderen übernehmen kann, wird zwangläufig nicht mehr in gleicher Höhe in Qualitätshardware investiert. Ausfälle können nun eher in Kauf genommen werden und die Ausgaben werden minimiert. Auch auf diesem Gebiet tun sich relationale Datenbanksysteme, die zuvor stets auf High-End-Anlagen betrieben wurden, schwer. NoSQL-Datenbanken sind stark auf Schlichtheit und Simplizität getrimmt. Das gilt für die Handhabung als auf für ihren Funktionsumfang. Der Code von CouchDB beispielsweise ist etwa 13.000 Zeilen lang, der von MySQL liegt oberhalb der Million. Dafür sind CouchDB und Konsorten schnell eingerichtet und betriebsbereit. Schon die moderate Kenntnis einer der unterstützten Programmiersprachen reicht, um sogar einem absoluten Neuling grundlegende Befehle zu vermitteln (s. Kap. 4. Vergleich verschiedener Datenbank). Eine Sprachenvielfalt bieten relationale Datenmodelle zwar nicht, dafür können nahezu alle mit dem QuasiStandard SQL abgefragt und modelliert werden. Von Standards und Vereinheitlichungen sind wiederum die Datenmodelle der NoSQL-Familie weit entfernt. Verschiedene Ansätze und Methoden bei der Umsetzung von Eigenschaften, wie der Datenintegrität oder der Informationsdarstellung, bergen Kompatibilitätsprobleme oder eingeschränkte Portabilitätsmöglichkeiten. Im Grunde ist es mit den NoSQL-Datenmodellen ein Wenig wie mit dem Cloud Computing selbst: Beide werden definitiv neue Impulse geben bzw. haben dies schon getan, aber zugleich sind beide nur ein weiterer Schritt auf der Entwicklungsleiter der sich ständig im Wandel befindlichen Welt der IT. Viele der NoSQL-Lösungen werden zweifelsohne einen festen Platz in verschiednen hochskalierbaren Architekturen finden, doch gilt es stets neben den Möglichkeiten auch die Grenzen dieser Lösungen in Betracht zu ziehen, bevor man ihre Implementierung plant. 44 6. Abkürzungsverzeichnis ACID Atomicity Consistency Isolation Durability ACL Access Control List AMI Amazon Machine Image API Application Programming Interface ASF Apache Software Foundation AWS Amazon Web Services BASE Basically Available Soft State Eventually Consistent BBC British Broadcasting Corporation BLOB Binary Large Object BPM Business Process Management BSON Binary JSON CAP Consistency Availability Partition Tolerance CDN Content Delivery Network CRUD Create Read Update Delete DBMS Datenbankmanagementsystem DDL Data Definition Language EC2 Elastic Compute Cloud ECM Enterprise Content Management ERP Enterprise Ressource Planing GFS Google File System GUI Graphical User Interface IBM International Business Machines Corporation JDK Java Development Kit JSON Javascript Object Notation MIT Massachuesetts Institute of Technology MVCC Multiversion Concurrency Control NoSQL Not only SQL PB Petabyte (= 1000 Terrabyte) RDBMS Relational Database Management System REST Representational State Transfer RSI Relational Software Inc. SAP Aktiengesellschaft Systeme, Anwendungen und Produkte in der Datenverarbeitung SDL Software Development Labs SQL Structured Query Language 45 TB Terrabyte (= 1000 Gigabyte) 46 7. Literaturverzeichnis [Ablog_2009] Sanfilippo, S.: Reds, My New Open Source Project, antirez.com, 06. März 2009, http://antirez.com/post/Redis-my-new-open-sourceproject.html, besucht am 25. Juni [ACM_2008] Pritchett, D.: BASE: An Acid Alternative, queue.acm.org, 28.07.2008, http://queue.acm.org/detail.cfm?id=1394128, besucht am 16. Juni 2010 [Ander_2010] Anderson, J. C., Lehnardt, J., Slater, N.: CouchDB: The Definite Guide, O’Reilly Media Inc., USA 2010 [Aquer_2010] Steam, M.: Updating – MongoDB, mongodb.org, 05.08.2010, http://www.mongodb.org/display/DOCS/Updating, besucht am 6. August 2010 [Bin_2010] Bin, S.: Key Value Stores Dynamo und Cassandra, Seminararbeit Cloud Data Management, Universität Leipzig, 2010 [Bnch_2009] Chodorow, K.: CouchDB vs MongoDB Benchmark, snailinaturtleneck.com, 06.12.2009, http://www.snailinaturtleneck.com/blog/2009/06/29/couchdb-vsmongodb-benchmark/, besucht am 29. Juli 2010 [Brekle_2010] Brekle, J.: Key Value Stores, BigTable, Hadoop, CouchDB, Seminararbeit, Universität Leipzig, 2010 [Browne_2009] Browne, J.: Brewer’s CAP Theorem, julianbrowne.com, 11.01.2009, http://www.julianbrowne.com/article/viewer/brewers-cap-theorem, besucht am 13. Juni 2010 [Brwn_2010] Brown, B.: Did I mention #MongoDb is fast?!?! Way to go @mongodb, idiotsabound.com, 23.01.2010, http://www.idiotsabound.com/did-imention-mongodb-is-fast-way-to-go-mongo, besucht am 29. Juli 2010 [CAP_2002] Gilbert, S., Lynch, N.: Brewer’s Conjecture and the Feasibility of Consistent, Available, Partition-Tolerant Web, ACM SIGACT News Vol. 47 33, Issue 2, June 2002, http://.www.lpd.epfl.ch/sgilbert/pubs/BrewersConjecture-SigAct.pdf, besucht am 13. Juni 2010 [Cass_2009] o. Autor: The Apache Cassandra Project, cassandra.apache.org, 2009, http://cassandra.apache.org/, besucht am 24. Juni 2010 [Chap_2009] Chapman, B.: Evaluating key- value and document stores for short read data, bcbio.wordpress.com, 10.05.2009, http://bcbio.wordpress.com/2009/05/10/evaluating-key-value-anddocument-stores-for-short-read-data/, besucht am 29. Juli 2010 [CIO_2010] Sarrel, M.: A Few Words About ‘NoSQL’ And Other Unstructed Databases, cioupdate.com, 28. April 2010, http://www.cioupdate.com/trends/article.php/3879191/A-Few-WordsAbout-NoSQL-and-Other-Unstructured-Databases.htm, besucht am 22. Juni 2010 [Cptw_2008] Kanaracus, C.: Oracle puts its 11g database in Amazon’s Cloud, computerworld.com, 22.09.2008, http://www.computerworld.com/s/article/9115291/Oracle_puts_its_11g_ database_in_Amazon_s_cloud, besucht am 29. Juli 2010 [Crunch_2008] Hendrickson, M.: Source: Google To Launch BigTable As Web Service, techcrunch.com, 04.04.2008, http://techcrunch.com/2008/04/04/source-google-to-launch-bigtable-asweb-service/, besucht am 17. Juni 2010 [CSCDB_2010] o. Autor: Case Studies – CouchDB: The NoSQL Document Database, couch.io, 2010, http://www.couch.io/case-studies, besucht am 26. Juli 2010 [Cwiki_2010] o. Autor: CouchDB In The Wild, wiki.apache.org, 17. Juni 2010, http://wiki.apache.org/couchdb/CouchDB_in_the_wild, besucht am 23. Juni 2010 48 [Dash_2010] Dash, J.: The CAP Theorem, cloudcomputing.sys-con.com, 19.05.2010, http://cloudcomputing.sys-con.com/node/1400253, besucht am 25. Juli 2010 [db4o_2010] o. Autor: db4o :: Java & .NET Object Database :: Open Source Object Database (OODB) :: Product Information, db4o.com, 30.07.2010, http://db4o.com/about/productinformation/, besucht am 30. Juli 2010 [DBMS_2008] o. Autor: Project Cassandra – Facebook’s open sourced quasi-DBMS, dbsms2.com, 21. Juli 2008, http://www.dbms2.com/2008/07/21/projectcassandra-facebook-open-sourced-quasi-dbms/, besucht am 24. Juni 2010 [Dynamo_2007] Vogels, W.: Amazon’s Dynamo, allthingsdistributed.com, 02.10.2007, http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html, besucht am 17. Juni 2010 [Ecdb_2009] Lennon, J.: Exploring CouchDB, ibm.com, 31.03.2009, http://www.ibm.com/developerworks/opensource/library/oscouchdb/index.html, besucht am 31. Juli 2010 [EMCD_2010] o. Autor: Product: EMC Documentum xDB, emc.com, 30.07.2010, http://www.emc.com/products/detail/software/documentum-xdb.htm, besucht am 30. Juli 2010 [Erlng_2008] o. Autor: Einführung in sequentielles Erlang, fh-wedel.de, 07.05.2008, http://www.fh-wedel.de/fileadmin/mitarbeiter/uh/Erlang1.htm#Was, besucht am 29. Juli 2010 [exst_2010] o. Autor: eXist-db Open Source Native XML Database, exist-db.org, 12.04.2010, http://exist-db.org/, besucht am 30. Juli 2010 [Frey_2010] Frey, M.: Chancen und Risiken des Cloud Computing, Praxisprojektausarbeitung, FH Köln Campus Gummersbach, April 2010 49 [From_2009] Frommel, O.: Dokumentzentrierte Datenbank CouchDB, adminmagazin.de, Januar 2009, http://www.adminmagazin.de/content/dokumentenzentrierte-datenbank-couchdb, besucht am 23. Juni 2010 [GI_2010] Bösswetter, D.: Spaltenorientierte Datenbanken, gi-ev.de, 9. Februar 2010, http://www.gi-ev.de/service/informatiklexikon/informatiklexikondetailansicht/meldung/spaltenorientierte-datenbanken-267.html, besucht am 21. Juni 2010 [GigS_2010] o. Autor: GigaSpaces.com | Application Server | Application Scalability | Data Grid | Cloud PaaS, gigaspaces.com, 30.07.2010, http://www.gigaspaces.com/, besucht am 30. Juli 2010 [Gray_2009] Gray, J.: Partition Tolerance, devblog.streamy.com, 24.08.2009, http://devblog.streamy.com/tag/partition-tolerance/, besucht am 25. Juli 2010 [Heise_2010] o. Autor.: NoSQL im Überblick, heise.de, 01. Juni 2010, http://www.heise.de/open/artikel/NoSQL-im-Ueberblick-1012483.html, besucht am 20. Juni 2010 [Hoff_2009] Hoff, T.: Drop ACID and think about Data, highscalability.com, 05.05.2009, http://highscalability.com/drop-acid-and-think-about-data, besucht am 16. Juni 2010 [Hzlc_2010] o. Autor: In-Memory Data Grid – Hazelcast – Home, hazelcast.com, 30.07.2010, http://www.hazelcast.com/, besucht am 30. Juli 2010 [IBM_2009] Lennon, J.: Exploring CouchDB, ibm.com, 31. März 2009, http://www.ibm.com/developerworks/opensource/library/oscouchdb/index.html#resources, besucht am 23. Juni 2010 [Info_2008] Babcock, C.: In Database Market, Oracle Gets Bigger, Others Hang On, informationweek.com, 25.04.2008, http://www.informationweek.com/news/software/database_apps/showA rticle.jhtml?articleID=207402230, besucht am 28. Juli 2010 50 [Intro_2010] Sanfilippo, S.: README – redis – Project Hosting on Google Code, code.google.com, 05. Dezember 2009, http://code.google.com/p/redis/wiki/README, besucht am 25. Juni 2010 [Kell_2010] Kellogg, D.: Six Thoughts on The NoSQL Movement, kellblog.com, 18.06.2010, http://www.kellblog.com/2010/06/18/six-thoughts-on-thenosql-movement/, besucht am 23. Juli 2010 [Leav_2010] Leavitt, N.: Will NoSQL Databases Live Up to Their Promise?, leavcom.com, 26.01.2010, http://www.leavcom.com/pdf/NoSQL.pdf, besucht am 23. Juli 2010 [Lenn_2009] Lennon, J.: Beginning CouchDB, Apress, USA Dez. 2009 [Loshin_2009] Loshin, D.: Gaining the Performance Edge Using a Column-Oriented Database Management System, sybase.de, 2009, http://www.sybase.de/detail?id=1063191, besucht am 21. Juni 2010 [Malik_2009] Laksham, A., Malik, P.: Cassandra – A Decentralized Structured Storage System, cs.cornell.edu, 2009, http://www.cs.cornell.edu/projects/ladis2009/papers/lakshmanladis2009.pdf, besucht am 24. Juni 2010 [McGe_2002] McGehee, B.: An Introduction to SQL Server Clustering, sql-serverperformance.com, 03.04.2002, http://www.sql-serverperformance.com/articles/clustering/clustering_intro_p1.aspx, besucht am 27. Juli 2010 [Meyer_2009] Meyer, M.: Datenbanken in der Cloud – Datastorage jenseits von SQL, Peritor Consulting, 25.11.2009, http://www.cloudconf.de/downloads/cloudconfclouddatenbankenmathia smeyerperitor.pdf, besucht am 11. Juni 2010 [Merr_2010] Merriman, D.: Comparing Mongo DB and Couch DB, mongodb.org, 23.04.2010, 51 http://www.mongodb.org/display/DOCS/Comparing+Mongo+DB+and+ Couch+DB, besucht am 29. Juli 2010 [MLS_2010] o. Autor: MarkLogic: The Leading XML Server, marklogic.com, 30.07.2010, http://www.marklogic.com/, besucht am 30. Juli 2010 [Mong_2010] Gill, M.: Production Deployments, mongodb.org, 26.07.2010, http://www.mongodb.org/display/DOCS/Production+Deployments, besucht am 29. Juni 2010 [Mok_2009] Mok, W.: Consistency and Availability Tradeoff for Distributed Systems, waimingmok.wordpress.com, 26.01.2009, http://waimingmok.wordpress.com/2009/01/26/consistency-andavailability-tradeoff-for-distributed-systems/, besucht am 25. Juli 2010 [Mquer_2010] Gill, M.: Querying – MongoDB, mongodb.org, 04.08.2010, http://www.mongodb.org/display/DOCS/Querying, besucht am 06. August 2010 [MSDN_2010] Neward, T.: Der Programmierer bei der Arbeit – In Richtung NoSQL mit MongoDB, msdn.microsoft.com, Mai 2010, http://msdn.microsoft.com/de-de/magazine/ee310029.aspx, besucht am 24. Juli 2010 [MVCC_2010] o. Autor: Advanced, h2database.com, 25.07.2010, http://www.h2database.com/html/advanced.html#mvcc, besucht am 28. Juli 2010 [Nblog_2010] o. Autor: Neo4j Blog, blog.neo4j.org, 16. Februar 2010, http://blog.neo4j.org/2010/02/top-10-ways-to-get-to-know-neo4j.html, besucht am 25. Juni 2010 [Neo_2010] o. Autor: Neo4j – About, neo4j.org, 16. Februar 2010, http://neo4j.org/about/, besucht am 25. Juni 2010 [Neub_2010] Neubauer P.: Graphendatenbanken, NoSQL und Neo4j, ITRepublik.de, März 2010, http://it- 52 republik.de/jaxenter/artikel/Graphendatenbanken-NoSQL-und-Neo4j2906.html, besucht am 11. Juni 2010 [North_2010] North, K.: The NoSQL Alternative, drdobbs.com, 21.05.2010, http://www.drdobbs.com/database/224900500;jsessionid=UYD2AXIKR KM4RQE1GHPSKHWATMY32JVN?pgno=1, besucht am 27. Juli 2010 [Nsql_2010] Prof. Dr. Edlich, S.: NoSQL Databases, nosql-databases.org. 29.07.2010, http://nosql-database.org/, besucht 30. Juli 2010 [O9i_2002] Abbey, M., Corey, M., Abramson, I.: Oracle 9i A Beginner’s Guide, McGraw-Hill Professional, USA 2002 [Objct_2010] o. Autor: Database and data management soloutions by Objectivity Inc., objectivity.com, 30.07.2010, http://www.objectivity.com/, besucht am 30. Juli 2010 [OBPM_2010] Palvankar, P.: BPM 11gR1 now Available on Amazon EC2 (Oracle BPM), blogs.oracle.com, 14.06.2010, http://blogs.oracle.com/bpm/2010/06/bpm_11gr1_now_available_on_a ma.html#comments, besucht am 29. Juli 2010 [OpenS_2010] Neubauer, P.: Neo4j – die High-Performance-Graphendatenbank, entwickler.de, März 2010, http://entwickler.de/zonen/portale/psecom,id,194,online,2919,p,0.html, besucht am 23. Juli 2010 [Patz_2009] Patzwaldt, K.: Basically Available, Soft state, Eventually consistent, patzwaldt.org, 11.03.2009, http://patzwaldt.org/karsten/post/33/basically-available--soft-state-eventually-consistent.html, besucht am 16. Juni 2010 [Peter_2010] Neubauer, P.: Graphendatenbanken, NoSQL und Neo4j, it-republik.de, März 2010, http://it-republik.de/jaxenter/artikel/GraphendatenbankenNoSQL-und-Neo4j-2908.html?print=1, besucht am 25. Juni 2010 53 [PNeu_2010] Neubauer, P.: Neo4j – die High-Performance-Graphendatenbank, itrepublik.de, März 2010, http://it-republik.de/jaxenter/artikel/Neo4j-%96die-High-Performance-Graphendatenbank-2919.html, besucht am 25. Juni 2010 [PODC_2000] Brewer, E. A.: Towards Robust Distributed Systems, cs.berkeley.edu, 19.07.2000, http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODCkeynote.pdf, besucht am 25. Juli 2010 [Pron_2010] Pronschinske, M.: VMware Hires Key NoSQL Developer, architects.dzone.com, 15. März 2010, http://architects.dzone.com/articles/vmware-hires-key-nosql, besucht am 25. Juni 2010 [Redis_2010] o. Autor: redis – Project Hosting on Google Code, code.google.com, 2010, http://code.google.com/p/redis/, besucht am 25. Juni 2010 [Robi_2010] Robinson, H.: CAP Confusion: Problems with ‘partition tolerance’, cloudera.com, 26.04.2010, http://www.cloudera.com/blog/2010/04/capconfusion-problems-with-partition-tolerance/, besucht am 25. Juli 2010 [Secure_2010] Merriman, D.: Security and Authentication – MongoDB, mongodb.com, 01.07.2010, http://www.mongodb.org/display/DOCS/Security+and+Authentication, besucht am 24. Juli 2010 [Servs_2009] o. Autor: Pros and Cons of Server Clustering, serverschool.com, 15.08.2009, http://www.serverschool.com/cluster-servers/pros-andcons-of-server-clustering/, besucht am 27. Juli 2010 [SGDB_2008] Angles, R., Gutierrez C.: Survey of graph database models, ACM Computer Survey, Februar 2008, www.dcc.uchile.cl/~cgutierr/papers/surveyGDB.pdf, besucht am 20. Juni 2010 54 [Silicon_2010] Schindler, M.: NoSQL: Die schlanke Zukunft dicker Datenbanken, silicon.de, 15.02.2010, http://www.silicon.de/hardware/serverdesktops/0,39038998,41527418,00/nosql+die+schlanke+zukunft+dicke r+datenbanken.htm, besucht am 15. Juni 2010 [Strozzi_2010] Strozzi, C.: NoSQL – A Relational Database Management System, strozzi.it, 2010, http://www.strozzi.it/cgibin/CSA/tw7/I/en_US/nosql/Home%20Page, besucht am 15. Juni 2010 [TAZ_2010] o. Autor: Wendepunkt bei Amazon: Mehr Kaufhaus als Buchladen, taz.de, 23.04.2010, http://www.taz.de/1/netz/netzoekonomie/artikel/1/mehr-kaufhaus-alsbuchladen/, besucht am 17. Juni 2010 [USPTO_2010] o. Autor: United States Patent: 7650331, patft.uspto.gov, 19.01.2010, http://patft.uspto.gov/netacgi/nphParser?Sect1=PTO1&Sect2=HITOFF&d=PALL&p=1&u=/netahtml/PTO /srchnum.htm&r=1&f=G&l=50&s1=7,650,331.PN.&OS=PN/7,650,331& RS=PN/7,650,331, besucht am 3. August 2010 [Vick_2010] Vicknair, C., Macias, M., Zhao, Z., Nan, X., Chen, Y., Wilkins, D. : A Comparison of a Graph Database and a Relational Database, cs.olemiss.edu, 15. – 17.04.2010, http://cs.olemiss.edu/~ychen/publications/conference/vicknair_acmse1 0.pdf, besucht am 24. Juli 2010 [Vogels_2008] Vogels, W.: Eventually Consistent – Revisited, Allthingsdistributed.com, 23.12.2008, http://www.allthingsdistributed.com/2008/12/eventually_consistent.html, besucht am 13. Juni 2010 [Vrsnt_2010] o. Autor: Versant, Object Database, ODBMS, OODBMS, Data Management, High Performance, High Availability, High Scalability, versant.com, 30.07.2010, http://www.versant.com/, besucht am 30. Juli 2010 55 [WASC_2010] o. Autor: WebSphere Application Server-Cluster, publib.boulder.ibm.com, 29.07.2010, http://publib.boulder.ibm.com/infocenter/ramhelp/v7r2m0/index.jsp?topi c=/com.ibm.ram.installguide.doc/topics/c_clusters.html, besucht am 29. Juli 2010 [Wneo_2010] o. Autor: Neo4j In The Wild – Neo4j Wiki, wiki.neo4j.org, 13.07.2010, http://wiki.neo4j.org/content/Neo4j_In_The_Wild, besucht am 26. Juli 2010 [Wien_2010] Wienecke, S.: Relationale Cloud-DB, Universität Leipzig Institut für Informatik Abteilung Datenbanken, 30.03.2010, http://dbs.unileipzig.de/file/seminar_0910_wienecke_ausarbeitung.pdf, besucht am 11. Juni 2010 [Zdnet_2008] Dignan, L.: Amazon adds Oracle support to EC2, zdnet.com, 22.09.2008, http://www.zdnet.com/blog/btl/amazon-adds-oraclesupport-to-ec2/10122, besucht am 29. Juli 2010 56