MongoDB

MongoDB benannt nach "humongous" (gigantisch) ist eine skalierbare, hochperformante, schemafreie, dokumentenorientierte Open-Source-Datenbank, die die Dokumente im BSON-Format verwaltet. MongoDB bietet eine integrierte Query Language für einfache Abfragen, Replikation und Sharding?. Durch Sharding? und Replikation (Replica Sets) können viele nicht so leistungsstarke Rechner verwendet werden. Unterstützt werden virtuelle Umgebungen, Cloud Computing und alle gängigen Betriebssysteme (Linux, Mac OS, Windows). MongoDB bietet unterschiedliche Backup? Möglichkeiten an.

Zusätzlich ist ein kommerzieller Support verfügbar. Die Vorteile von MongoDB sind ein flexibles Datenbank Schema (Schema Design), das dynamisch angepasst werden kann. Es ermöglicht die Speicherung unterschiedlicher Dokumente, die durch die Verwendung von Indizes schnell wiedergefunden werden können, inklusive des geospatial - Indexes, der Abfragen von Geodaten wie z.B. Umgebungssuche ermöglicht.

Der größte Nachteil dieser Datenbank ist die Sicherheit beim Zugriff, die faktisch nur mit Einstellung der IP-Tables erfolgt. Ferner sind Transaktionen und Query-Operationen gegenüber einem RDBMS nur verschlankt einsetzbar.

Steckbrief

Webadressehttp://www.mongodb.org
KategorieDocument Store
APIC++, C#, Java, Java Script, PHP, Ruby , Perl, Phyton, Node.js und vieles mehr
ProtokollBSON-basiertes Protokoll
Entwicklungssprache:C++
ReplikationMaster Slave
Skalierungautomatisches Sharding?
Lizenz:GNU AGPL v3.0

Steckbrief von MongoDB, entnommen aus Boeker (2010)

Einsatzbereich

Der Einsatzbereich ist sehr vielfälltig. Hier nun ein Paar bekannte Nutzer:

  • Springer speichert Artikel und Bücherkapitel für realtime download und Anzeige in verschiedener Form
  • Disney speichert verschiedener APIs für Spiele
  • SAP nutzt MongoDB für CMS (Content Management System)
  • MTV benutzt es für CMS mit weiteren geplanten CMS für die Tochterfirmen ( Nick oder comedycentral)

Weitere Einsatzmöglichkeiten sind vor allem speichern und verarbeiten von Geodaten oder großer Datenmengen, außerdem in Bereichen, in denen schnelle Zugriffszeiten (wie z.B. realtime download) benötigt werden.

Datenbankvergleich
Datenbankvergleich: relationale vs. dokumentenorientierte

Datenbankaufbau

MongoDB speichert die Dokumente intern, hält sie im Speicher und tauscht sie mit dem Client Driver in BSON-Format. Die Vorraussetztung ist dass die Client Driver BSON-fähig sind.

Wie das Bild zeigt, ist die Struktur der Datenbank in MongoDB anders als in relationalen Datenbanken. Die Datenbank besteht aus beliebig vielen Collections in denen sich wiederum beliebig viele Dokumente befinden.

Datenbank

MongoDB Server läßt mehrere Datenbanken nebeneinader zu. Jede Datenbank wird einzeln behandelt und kann individuell eigestellt werden.

Die Datenbank besteht aus Datafiles ("Datenbankname.0, Datenbankname.1") und Namespace-File ("Datenbankname.ns"). Die Datafiles enthalten die Dokumente in BSON-Format. Namespace-File enthält die Liste aller Collections und die Metadaten.

Collection

Collections entsprechen den Tabellen eines RDBMS's. Sie werden nicht wie Tabellen bereits vorher erstellt, sondern erst bei Bedarf. Sprich wenn ein Dokument in eine neue Collection gesteckt werden soll wird dabei die neue Collection erstellt. Gruppen und Hierarchien werden durch die Punkt-Notation erstellt.

Bsp.:

users.student.informatik --> 1. Collection
users.student.maschinenbau --> 2. Collection

Dieses Beispiel zeigt, dass trotz der ähnlicher Benennung es sich um zwei verschiedene und nicht um eine Collection handelt. Die "users.student" dient lediglich der Übersicht und Zuordnung zu einer Gruppe. Die Namensgebung kann beliebig gewählt werden solange sie die Größe von max. 128 Zeichen nicht überschreitet.

Es gibt zwei spezielle Formen einer Collection: Die system Collections und die Capped Collection.

Die System Collections beinhalten die Informationen (Metainformationen, aktuelle Konfiguration) des Systems (der Datenbank).

<dbname>.system.namespaces--> speichert alle Namespaces(einsehbar)
<dbname>.system.indexes,--> speichert Indizes(einsehbar)
<dbname>.system.profile,--> verwaltet Datenbank Profile(einsehbar und löschbar)
<dbname>.system.users--> enthält alle Benutzer, die auf die Datenbank zugreifen dürfen(einsehbar und modifizierbar)
Erstellen einer Capped Collection

Die Capped Collection ist eine Collection mit einer festen Größe oder Dokumentenanzahl, die nach dem Verfahren"Least Recently Used"(LRU) arbeitet. Das bedeutet, wenn das Limit der Collection ( Größe oder Dokumentenanzahl) erreicht ist, werden alte Dukumente automatisch entfernt. Dabei ist wichtig, dass die neuen Dokumente exakt so groß oder kleiner sind, als die alten zu löschenden Dokumente. Diese Collection Form kommt zum Einsatz bei Speicherung vieler Daten, die nach einer begrenzten Zeit als veraltet gelten und automatisch gelöscht werden können, wie beispielweise bei Logging, Caching oder Archivierung.

Dokument

Ein Dokument entspricht einer Zeile (ROW) in einer Tabelle in RDBMS und enthält eine beliebige Anzahl an Feldern (Key) mit einem Wert (Value). Die Dokumente einer Collection können, müssen aber nicht ein identisches Schema aufweisen. Dokumentenorientierte Datenbanken zeichnet ja ein schemafreies Design aus. MongoDB bietet allerdings ein rudimenteräres Schema Design an. MongoDB kennt folgende Datentypen:

Eine Besonderheit der Dokumente ist die logische Größenbeschränkung auf Momentan 16 MB. Diese Beschränkung möchte verhindern, dass die Anfragezeiten zu lang werden. Größere Dokumente würden den RAM und/oder das Netztwerk bei vielen Anfragen zu sehr auslasten. Für größere Dokumente bietet MongoDB die Alternative GridFS.

Referenzieren

MongoDB bietet keine Joins an. Mit Referenzen können Zugehörigkeiten von Dokumeten im Vorfeld gesetzt werden. An dieser Stelle muss entschieden werden, welche Form der Verweise für die Dokumente, in Bezug auf die Abfragegeschwindigkeit, besser geeignet sind. Es gibt drei Formen der Referenzierung. Am einfachsten ist das Referenzieren über ObjectID. Dies geht aber nur innerhalb einer Collection. Soll auf eine andere Collection verwiesen werden, kann der Datentyp DBRef verwendet werden. Außerdem bietet sich der Datentyp EmbeddectDoc als Lösung an, vor allem bei einer eins zu eins Beziehung. Eine einfache Faustregel besagt:

  • Ein Dokument verweist auf ein anderes einzelnes Dokument --> EmbeddedDoc (Serverseitiges referenzieren)
  • Mehrere Dokumete verweisen auf ein Dokument in der gleichen Collection --> ObjectID
  • Mehrere Dokumete verweisen auf ein Dokument in einer anderen Collection--> DBRef (Clientseitiges referenzieren). In diesem Fall vermeidet DBRef doppelte Datensätze.

Embedded-Document

Embedded-Doc's sind Teildukumente eines Top-Level-Dokumentes. Es ist eine einfache Methode ohne Joins zu referenzieren. Dadurch werden die Anfragen performanter, ferner wird Speicherplatz, der für Referenzen benötigt wird, gespart.

Die Gefahr besteht bei unsinnigen oder zu komplexen Verschachtelungen die Übersichtlichkeit zu verlieren. Außerdem darf die logische Dokumenten Größenbeschränkung beachtet werden.

DBRef(erence)

DBRef ist ein Datentyp der in etwa dem Fremdschlüssel in RDBMS entspricht. DBRef verweist auf ein Dokument (ObjectId) in der eigenen oder einer anderern Collection(name) und erwartet zwei Parameter, den Namen der Collection und die ObjectId des Dokuments auf die sich die Referenz bezieht.Referenzieren funktioniert ausschliesslich mit der ObjectId.

ObjectId

Eine ObjectId ist exakt 12 Byte groß und wird durch den Client Driver oder die Datenbank automatisch generiert. Eine ObjectId kann auch nach eigenem Schema generiert werden. Dabei muss beachtet werden, dass die ObjectID in einer Collection einzigartig ist. Dies gilt auch für die eigene Generierung.

Aufbau einer ObjectID

Bei einer Datenbankanfrage muss der Datentyp „ObjectId“ immer mitangegeben werden, sonst wird nach einem String gesucht und das Dukument wird nicht gefunden.
Bsp.: >db.users.count(ObjectId(„4c121a2c|a917ba|523e|000002“)

Grundlegender Aufbau eines Beispieldokuments

{

        "_id" : ObjectId("4dcd3ebc9278000000005158"),
        "date" : ISODate("2011-05-13T14:22:46.777Z"),
        "binary" : BinData(0,""),
        „string“: „Willy Wonka“,
	„integer“: 1234, 
	„float“: 1.2, 
	„array“: [1, 2, 3],
	„doc“: {„number“: 1, „name“: charlie}

}

Kommandoübersicht

MongoDB bietet eine Reihe von Kommandos an, die vom Anlegen eines Dokumentes, über Veränderungen in diesem bis hin zum Löschen von Dokumenten gehen. Eine Kommandouebersicht findet sich hier.

Map and Reduce
Map and Reduce

Map and Reduce

Map and Reduce entspricht dem Group Operator. Map and Reduce wird im Bereich Sharding verwendet. Map geht alle Server durch, sucht nach den Ergebnissen und verarbeitet sie in einzelnen Tasks. Reduce gruppiert die Ergebnisse und fasst sie zu einem Ergebnis zusammen.

Sicherheit

Bzgl. Sicherheit bietet MongoDB drei Möglichkeiten an, die am besten alle genutzt werden. Standardmässig horcht der MongoDB-Dienst nicht nur auf localhost, sondern auf allen verfügbaren Interfaces. Deshalb muss der MongoDB-Server abgesichert werden. Zu Beginn bietet es sich erstmal an MongoDB nur noch auf Anfragen reagieren zu lassen die auf localhost (127.0.0.1) ankommen, somit ist sichergestellt, dass sich kein anderes System außer der lokale Rechner mit der MongoDB verbinden kann und dies auch ohne großes Authentifizierungssystem. Gleichzeitig hat dies den Nachteil, dass kein anderes externes System mehr mit dem MongoDB verbinden kann, dies kann aber durch einen VPN-Tunnel umgangen werden.

Zusätzlich bietet es sich an, die MongoDB über iptables abzusichern, somit kann das Problem behoben werden, dass mehrere Applikationsserver sich mit dem MongoDB-Server nicht verbinden können, da diese sich untereinander nicht finden können. Bei iptables werden alle evtl. alten schon vorhandenen Regeln entfernt und neue angelegt, die jeglichen Zugriff über die Ports 27017 (MongoDB-Standardport) und 28017 (REST-Interface) untersagen. Damit einzelne gezielte Systeme nun auf den MongoDB-Server zugreifen können, werden diese der Reihe nach über Ihre IP-Adresse freigeschaltet.

Zum Schluss kann das MongoDB interne Authentifizierungssystem genutzt werden, welches über einen Parameter beim Start des MongoDB-Servers mit gestartet werden kann. Die Kommunikation ist zwar leider nicht verschlüsselt, deckt aber die grundlegensten Funktionen ab. Hierbei ist es wissenswert, dass Sharding? und Replica Sets in der momentanen MongoDB-Version nicht mit aktivierter Authentifizierung funktionieren.

Fazit

MongoDB ist vielfälltig einsetzbar, einfach zu konfigurieren und schnell einsatzfähig. Die Datenbank bietet sich sowohl für kleinere Projekte (Web/Mobile Apps) wie auch für große Unternehmen ( große Datenmengen verarbeiten und Auswerten, replizieren und skalieren). Diese Datenbank kann vor allem für neue noch nicht ausgereifte oder wachsende und dadurch oft ändernde Datenstruktur (Schema) gut genutzt werden, da Änderungen an der Datenstruktur/Schema kein Problem darstellen. Auf der anderen Seite bietet MongoDB auch einiges aus dem RDBMS Bereich an. Die Verwendung von vielen Operationen und Referenzen ermöglichen eine vereinfachte Suche, die Indizes schnelleren Zugriff. Durch den geospatial - Index können auch die Geodaten promblemlos verarbeitet werden.

MongoDB hat noch vereinzelte Nachteile, vor allem im Bereich der Zugriffssicherheit, an dieser wird aber bereits für die nächsten Versionen aktiv gearbeitet. Transaktionen und Query-Operationen sind im vergleich zu RDBMS nur eingeschränkt möglich. Desweiteren gibt es keine Trigger, Constraints und Volltextsuche (nur regex). Die Datenkonsistenz wird zugunsten von schnellen Zugriffs- und Bearbeitungszeiten und der Ausfallsicherheit nachrangig behandelt.

Quellen

  • Edlich et. Al.(2011), 2.Aufl.: „NoSQL – Einstieg in die Welt nichtrelationaler Web 2.0 Datenbanken „ Carl Hanser Verlag, München
  • Marc Boeker (2010), "MongoDB - Sag ja zu NoSQL", entwickler.press, Frankfurt
  • Peter Membrey und Tim Hawkins (2010), "The definitive Guide to MongoDB, Eelco Plugge", Springer Verlag
  • Internet: 10gen: MongoDB URL: http://www.mongodb.org (Stand: 20.08.2012)

Weiterführende Links

http://www.mongodb.orgallgemeine Infos zu MongoDB
http://www.bsonspec.orgInfos zur BSON-Spezifikation
http://www.mongodb.org/display/DOCS/TutorialTutorials
http://www.mongodb.org/display/DOCS/QuickstartQuickstart
http://www.mongodb.org/display/DOCS/dbshell+ReferenceShellkommandos
http://www.mongodb.org/display/DOCS/DBA+Operations+from+the+Shellnoch mehr Shellkommandos
https://github.com/Fiedzia/Fang-of-MongoWebfrontend Fang-of-Mongo
http://www.10gen.com/mongodb-monitoring-serviceMongoDB Monitoringservice
http://de.wikipedia.org/wiki/MongoDB

Kategorie: Neue DB-Entwicklungen, Dokument-DB, NoSQL, M