No more SQL?
Viele Entwickler verwenden heute Datenbanken, die ohne oder mit wenig SQL auskommen. Ein Trend der sich NoSQL nennt.
Der Begriff NoSQL wird zunächst durch das defniert was er nicht ist, nämlich kein SQL. Er wurde erstmalig 2009 von Eric Evans für ein Event in San Francisco verwendet. Vorrangig sollte er als provokative Phrase aufgefasst werden, als Abgrenzung zu der strukturierten Abfragesprache SQL. NoSQL hat zum Ziel, Alternativen zum allgegenwärtigen relationalen Datenbankmodell und üblichen Datenbanktechnologien aufzuzeigen, die für bestimmte Anwendungsfälle besser geeignet sind. Mit dem Web2.0 und dem damit einhergehenden Bedarf nach der Verarbeitung großer Datenmengen erfuhren NoSQL-Datenbanken ein sehr schnelles Wachstum. Die Vereinigung fast aller nicht relationaler Datenbanken unter dem Begriff NoSQL zeigte eine ernstzunehmende Alternative zu SQL-Datenbanken auf. Mittlerweile wird der Begriff von großen Teilen der Community als „Not-only-SQL“ aufgefasst, um somit die strikte Abgrenzung wieder aufzuweichen. Es gibt auch viele Hybrid-Lösungen. Je nach Anwendung gilt es die richtige Datenbank auszuwählen und in vielen (vor allem sicherheitskritischen und komplexen) Fällen ist eine relationale Datenbank auch nach wie vor die richtige Lösung. Die NoSQL-Bewegung setzt sich grundsätzlich für eine freie Datenbankauswahl ein und schärft das Bewußtsein für das große Spektrum an Datenbanken, das zur Verfügung steht.
Im NoSQL-Archiv von Dr. Prof. Stefan Edlich sind alle NoSQL-Datenbanken aufgeführt, aktuell bereits 150!
Das MapReduce-Verfahren zur Verarbeitung großer Datenmengen
Um große Datenmengen effizient zu verarbeiten wurden neue Verfahren entwickelt. Das sogenannten MapReduce-Verfahren spielt hierbei eine entscheidende Rolle. Es wurde 2004 bei Google Inc. entwickelt und 2010 erhielt Google auch das Patent darauf. Während in SQL mit Hilfe von JOIN-Abfragen auf Daten unterschiedlicher Tabellen zugegriffen wird, werden bei dem MapReduce Verfahren parallele Berechnungen über große Datenmengen durchgeführt. Die beiden Phasen Map und Reduce haben ihren Ursprung in funktionalen Programmiersprachen. Beide Funktionen dürfen keine Nebeneffekte haben, d.h. sie dürfen nicht auf Objekte außerhalb ihres aktuellen Scopes zugreifen. Dadurch wird Parallelität und Skalierbarkeit ermöglicht. Zudem arbeiten funktionale Operationen immer auf Kopien der Daten, wodurch sich unterschiedliche Operationen auf dem gleichen Datensatz nicht gegenseitig beeinflussen.
Sichere Daten oder gute Performance?
Vielen NoSQL-Projekten liegt das CAP-Theorem zugrunde. Dieses wurde 2000 das erste mal von Dr. Eric Brewer in einem Vortrag erwähnt. Dabei sprach er über Vor- und Nachteile von ACID (Atomicity, Consistency, Isolation, Durability) und BASE (Basically Available Softstate Eventual consistency) und befand, daß sich diese nicht gegenseitig ausschließen, sondern als Bausteine dienen können, die sich der Entwickler beliebig zusammenstellen kann. Diese Richtlinie nannte er CAP und sie wurde 2002 in einem axiomatischen Beweis bestätigt. CAP besteht aus Consistency, Availability und Partition Tolerance, wobei Partition Tolerance bedeutet, daß die Datenbank auf verschiedene Server verteilt werden kann. Das CAP-Theorem besagt, daß ein echtes verteiltes System nur zwei dieser drei Bausteine garantieren kann und man entweder sichere und immer konsistente Daten hat oder ständige und schnelle Verfügbarkeit. Es gilt also abzuwägen wieviel Konsistenz man zugunsten einer guten Performance bereit ist zu opfern.
Beispiel CouchDB: eine Datenbank für Webentwickler
Der Erfinder von CouchDB ist Damien Katz (*1973). Seit seinem Abschluss in Computer Science 1995 hat er bei Iris Associated, Lotus, MySQL und IBM gearbeitet. Bei Iris wurde die Software „Notes“ entwickelt, die dann bei Lotus vertrieben wurde und bis heute unter dem Namen Lotus Notes bekannt ist. Dies bildete auch die Grundlage für die Entwicklung von CouchDB. 1994 wurde Iris von Lotus und Lotus dann 1995 von IBM gekauft. Damien arbeitete bei IBM bis 2002 an allen Teilen von Notes weiter und verließ dann das Unternehmen, um etwas Eigenes zu machen. Er besann sich auf die Notes Storage Engine von Domino, die bidirektional synchronisieren kann und entwickelte daraus die Idee einer dokumentenbasierten Datenbank mit mehr Features als Notes. Da er auch parallelisierten Zugriff auf Dokumente integrieren wollte und sich das mit C++ nicht so einfach umsetzen ließ, landete er schließlich bei der Programmiersprache Erlang, die neben ihrem mythenbildenden Charakter für weniger Fehler bei verteilten und parallel laufenden Tasks sorgt. 2005 war eine erste Version von CouchDB fertig, bisher noch mit einer XML-basierten Storage Engine und einer Query Engine mit SQL-artiger Syntax. Da sich aber bisher keine finanziellen Erfolge einstellten, nahm er eine Anstellung bei MySQL an und entwickelte CouchDB privat weiter. Er ersetzte das XML-Format durch JSON und die Query Engine durch JavaScript und MapReduce.
Sein Ziel war die Verbindung des dokumentenorientierten Ansatzes von Lotus Notes mit dem MapReduce-Ansatz von Google BigTable, der verteilten High-Performance-Datenbank von Google, die als proprietäre Lösung nicht frei verfügbar ist. Mit CouchDB sollte ein schemaloses Datenbanksystem entstehen, das durch Verteilbarkeit eine hohe Performance ermöglicht.Der Name CouchDB ist ein halbironisches Backronym, das für „Cluster of unreliable commodity hardware Data Base“ steht. (Zu deutsch: „Datenbank auf einem Cluster aus unzuverlässiger Standardhardware“.)
Damien wurde bereits seit einer Weile von IBM umworben wieder bei ihnen zu arbeiten. Er wollte dies jedoch nur tun, wenn er CouchDB weiter als OpenSource-Projekt betreiben durfte. Man einigte sich schließlich auf eine Research-Position und darauf daß CouchDB zu einem Apache-Open-Source-Projekt werden sollte. IBM verfügte somit über die Fachkompetenz von Damien Katz im Bereich CouchDB und sponsorte zum anderen aber auch die Weiterentwicklung der Datenbank.
2008 wurde CouchDB, bereits mit einer beachtlichen Community und großem Interesse in der IT-Welt, ein vollwertiges Open-Source-Projekt der Apache Software Foundation. CouchDB erfreut sich von je her einer großen und aktiven Community, die sehr hilfbereit und enthusiastisch ist. Nicht zuletzt sind auch die Entwickler fast täglich im IRC-Channel oder auf der Mailingliste anzutreffen. Ende 2009 gründeten Damien Katz und einige Mitstreiter eine Startup-Firma namens Relaxed Inc. Unter ihrem Dach erfolgt die Weiterentwicklung von CouchDB
CouchDB starten und benutzen
„Apache CouchDB has started. Time to relax.“
Das ist die Ausgabe die man nach einem erfolgreichen Start der CouchDB bekommt. Ein sehr symphatischer Einstieg. Und nicht umsonst heißt die Firma des Couch-Erfinders Damien Katz auch Relaxed Inc. Der Name ist Programm: die Datenablage soll so bequem und einfach wie möglich sein. Deshalb arbeitet die CouchDB auch mit Dokumenten statt mit Taballen wie wir es von relationalen Datenbanken gewohnt sind, da die meisten Nutzer auch in ihrer Betriebssystemablage mit Dokumenten hantieren. Und zweitens arbeitet die Couch mit URLs statt SQL-Befehlen, da diese Art der Adressierung mittlerweile jedem Internetnutzer bekannt sein sollte. Gespeichert wird in dem leicht verständlichen und im Netz weit verbreiteten JSON-Format.
Man spricht HTTP
CouchDB ist vor allem für Webapplikationen geschrieben worden. Deshalb benutzt sie auch eine REST Api und komminiziert über HTTP. Nachdem die CouchDB auf dem System gestartet ist, können im Browser bereits nach Eingabe der Server-Adresse und dem Standard-Port 5984 erste Informationen über die Datenbank, wie die Version, die Art des Inhalts und das Encoding abgefragt werden. Die Antwort der CouchDB wird als JSON-Objekt im Browser angezeigt. Die Standard-HTTP-Befehle GET, PUT und DELETE stehen auch für das Aufrufen, Erstellen und Löschen von Datenbanken zur Verfügung. Mit POST können Konfigurationseinstellungen vorgenommen werden. Mit der CouchDB-eigenen Methode COPY können außerdem einzelne oder mehrere Dokumente kopiert werden.
Dokumente unterscheiden sich von anderen Objekten, da sie immer über die CRUD-Methoden verfügen (create, read, update, delete). Das macht sie besonders geeignet für HTTP-Abfragen. Das grundlegende CouchDB-Speicherprinzip ist die Speicherung von Key-Value-Paaren. Die interne Speicherung erfolgt in B-Bäumen. Einer der größten Vorteile von JSON ist der native Zugriff auf diese Datenstruktur durch JavaScript. CouchDB Dokumente können somit direkt als Objekte beim Programmieren verwendet werden. Da alle zusammengehörigen Daten in einem Dokument gespeichert sind kommt es vor, daß die gleichen Daten an mehreren Stellen abgespeichert werden. In einer dokumentenbasierten Datenbank werden die Daten aber ganz bewußt redundant abgespeichert. Das bringt das Konzept mit sich.
MapReduce Abfragen mit Views
Normalerweise werden Dokumente in der CouchDB über ihren Key gelesen. Für komplexere Abfragen werden Views benutzt. Views werden in den Design-Dokumenten, die wie eine Art Konfigurationsdokumente zu verstehen sind, definiert und gespeichert und implementieren das MapReduce-Pattern. Um das Ergebnis eines View abzufragen wird ein query auf den View ausgeführt, d.h. die entsprechende URL angesteuert.
Fazit
Sowohl NoSQL- als auch relationale Datenbanken haben ihre Stärken, die sie bei passenden Anforderungen ausspielen können. Durch ihre Schemafreiheit eignen sich NoSQL- Datenbanken besser für die Ablage von beliebigen Dokumenten. Die exakte Struktur der Tabelleninhalte, die durch ein Datenbankschema vorgegeben sind, ermöglicht dagegen in einer relationalen Datenbank (Ad-hoc-)Abfragen auf ungewöhnlichen Spaltenkombinationen. Relationale Datenbanken sind dafür gebaut, auf einem zentralen Server zu laufen. Im Zeitalter des Cloud Computing werden aber häufig viele kleinere Rechner gemeinsam verwendet, das heißt, die Verteilung von Anfragen wird immer wichtiger.
CouchDB bietet weniger Funktionalität im Vergleich zu großen relationalen Datenbanken, ist aber dafür wesentlich schlanker, schneller und einfacher zu bedienen. In CouchDB fließen viele Erfahrungen ein, die sich im Laufe der Zeit bei der Entwicklung von Web-Applikationen angesammelt haben. Deshalb wird eine REST-Api, JSON als Speicherformat und eine Spezialisierung auf verteilte Anwendungen bei der Synchronisation verwendet. Für eine einfache Webanwendung, die mit großen Mengen an Daten hantiert, ist CouchDB deshalb eine sehr gute Lösung. Allerdings wird hierbei auf absolute Konsistenz bewußt verzichtet, zugunsten eines Performance-Vorteils. Dies muss im Hinterkopf behalten werden, wenn man sich für dieses System entscheidet.
Links:
- Offizielle Seite von Apache: http://couchdb.apache.org
- Blog von Damien Katz: http://damienkatz.net
- Heise-Artikel vom 12.02.2010: http://www.heise.de/developer/artikel/CouchDB-angesagter-Vertreter-der-NoSQL-Datenbanken-929070.html
- Buch „CouchDB: The Definitive Guide“, Full Free Version: http://buhoz.net/public/libros/db/CouchDB-TheDefinitiveGuide.pdf
- Podcast zu CouchDB auf CRE.fm: http://cre.fm/cre125
I’m extremely impressed with your writing skills and also with the layout on your weblog. Is this a paid theme or did you modify it yourself? Either way keep up the excellent quality writing, it is rare to see a great blog like this one nowadays.. fedfdefeaege