MongoDB, HBase, Redis, Apache Cassandra, Couch DB

Datenflut bereitet NoSQL den Weg

23.04.2013
Von Eberhard Wolff, Kai Spichale, Thomas  Westphal und Andreas Hartmann

MongoDB

In einer Collection werden die Dokumente abgelegt, die mit Zeilen einer relationalen Tabelle vergleichbar sind.
In einer Collection werden die Dokumente abgelegt, die mit Zeilen einer relationalen Tabelle vergleichbar sind.

MongoDB (von "humongous") ist eine in C++ geschriebene Open-Source-Datenbank der Firma 10gen nach AGPL-Lizenz, die für die meisten gängigen Plattformen bereitgestellt wird. MongoDB fällt in die Kategorie der Document Stores. Der Vorteil dieser Datenbanken ist, dass Dokumente sowohl dem natürlichen Objekt als auch dessen Repräsentation in einer objektorientierten Sprache entsprechen können und eine Transformation weitestgehend entfällt. Des Weiteren ist MongoDB schemalos, das bedeutet, dass die Dokumente und deren Aufbau nicht festgelegt sind. Felder und Datentypen können sich bei jedem Dokument ändern.

Eine MongoDB-Instanz enthält eine beliebige Anzahl von Datenbanken. Dabei beinhaltet eine Datenbank wiederum eine beliebige Anzahl von Collections. Eine Collection ist vergleichbar mit einer Tabelle aus einem RDBMS. In einer Collection werden die Dokumente abgelegt. Dokumente sind vergleichbar mit Zeilen einer relationalen Tabelle. Das Dokument besteht aus einer beliebigen Anzahl von Feldern. Der entscheidende Unterschied zu einer relationalen Datenbank ist, dass ein Dokument nicht nur eine flache Folge von Feldern ist, sondern eine hierarchische Struktur besitzen kann. Ein Dokument kann weitere "embedded" Dokumente oder Referenzen auf andere Dokumente enthalten. Zusätzlich besitzt jedes Dokument die ObjectID. Dabei handelt es sich im Normalfall um eine 12-bytige im MongoDB-Cluster eindeutige ID. Fortlaufende Sequenzen und UUIDs sind auch als ID möglich. In der nachfolgenden Abbildung ist ein Beispiel-Dokument mit einem embedded Dokument sowie Referenzen auf weitere Dokumente dargestellt.

MongoDB speichert und überträgt die Dokumente im BSON-Format. BSON ist ein binäres JSON-ähnliches Datenformat. Bei JSON (JavaScript Object Notation) handelt es ich um eine mit XML vergleichbare Datenrepräsentation, die vor allem im JavaScript-Umfeld genutzt wird, siehe auch http://de.wikipedia.org/wiki/JavaScript_Object_Notation. Zusätzlich zu den normalen JSON-Datentypen (String, Integer, Boolean, Double, Null, Array und Objekt) werden noch weitere Datentypen, wie zum Beispiel Datum, ObjectID oder binäre Daten unterstützt.

Die Datenbank stellt eine umfangreiche Query Language zur Verfügung. Dabei werden die Queries als JSON-(BSON)Objekte dargestellt. Verschiedene Vergleichs- und Meta-Operatoren, Regular Expressions und JavaScript Expressions können zur Suche benutzt werden. Um die Abfragen zu beschleunigen, sollten wie bei RDBMS Indizes angelegt werden.

Um in verteilten Umgebungen eine hohe Performance zu gewährleisten, unterstützt MongoDB keine komplexen Transaktionen. Stattdessen bietet die Datenbank atomare Operationen auf einzelne Dokumente sowie einige weitere Mechanismen wie "Update if Current", "Insert if Not Present" oder "two-phase commit" für das gemeinsame Ändern von mehreren Dokumenten.

Ausfallsicherheit durch Replica Sets

Die Ausfallsicherheit wird bei MongoDB durch sogenannte Replica Sets sichergestellt. Ein Replica Set besteht dabei mindestens aus zwei Knoten. Es gibt dann einen Master und beliebig viele Slave-Knoten, wobei der Master-Knoten die schreibenden Operationen bearbeitet und die Slaves für Lese-Operationen genutzt werden. Bei Ausfall eines Servers erfolgt ein automatischer Failover, sowohl bei lesenden als auch schreibenden Operationen. Sollte z.B. der Master-Knoten ausfallen, so wird automatisch der Slave-Knoten zum neuen Master-Knoten, der sich zuletzt mit dem ausgefallen Master-Knoten synchronisiert hat. Neue oder wiederhergestellte Knoten werden automatisch als Slave-Knoten mit aufgenommen.

Das Zusammenspiel von Replica Sets und Sharding.
Das Zusammenspiel von Replica Sets und Sharding.

MongoDB unterstützt mittels Sharding die horizontale Skalierung. Hauptvorteil der horizontalen Skalierung gegenüber der vertikalen Skalierung ist die fast beliebige Skalierbarkeit und wesentlich höhere Kosteneffizienz. Technisch umgesetzt wird dies durch die Partitionierung der Daten über mehrere Server hinweg, den sogenannten Shards. So wird durch ein Shard festgelegt, welcher Server für welchen Datenbereich verantwortlich ist. Um dieses Wissen für einen Client transparent zu gestalten, richtet dieser seine Anfragen nicht direkt an einen Shard, sondern an einen mongos-Prozess, der als Router fungiert und die Anfrage an das entsprechende Shard weiterreicht. Die Metadaten der Sharding-Konfiguration - also u.a. welcher Shard auf welchem Server liegt - werden dabei durch einen Config Server verwaltet. Die Ausfallsicherheit eines Shards wird durch die oben beschriebenen Replica Sets gewährleistet. Die verteilte und parallele Verarbeitung großer Datenbestände unterstützt MongoDB durch eine Implementierung des MapReduce-Verfahrens.MongoDB bringt von Hause aus eine Begrenzung der Dokumentgröße auf 16 GB mit sich. Um dennoch große Binärdateien verarbeiten zu können, implementiert MongoDB die GridFS Spezifikation. Eine Binärdatei wird dabei für den Client transparent auf mehrere Pakete aufgeteilt und von MongoDB verwaltet.

Das MongoDB Ökosystem ist recht vielfältig. Es stehen verschiedenste Administrations Tools wie z.B. der Mongo Explorer zur Verfügung. Eine große Anzahl von Bibliotheken (Open Source nach Apache-Lizenz) zum Ansprechen der Datenbank in verschiedenen Programmiersprachen werden offiziell von MongoDB unterstützt. Diese APIs bieten bereits eine Abstraktion vom binären BSON-Format. Aufbauend auf diesen Treibern werden von der Community weitere Sprach- und Framework-spezifische Bibliotheken bereitgestellt. Diese ermöglichen beispielsweise ein einfaches Mapping von Objekten der jeweiligen Programmiersprache in MongoDB-Dokumente, wie z.B. der Java POJO Mapper Morphia.

MongoDB

Vorteile

+ einfache Installation

+ gute Dokumentation

+ automatische Replikation

+ horizontale Skalierbarkeit

Nachteile

- kein 2-Phase Commit über verschiedene externe Ressourcen

Im Video: NoSQL-Datenbanken - MongoDB