MongoDB

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
MongoDB
Entwickler MongoDB, Inc.
Erscheinungsjahr 2009
Aktuelle Version 3.2.4
(7. März 2016)
Betriebssystem Cross-platform
Programmier­sprache C++
Kategorie Dokumentenorientierte Datenbank
Lizenz GNU AGPL v3.0 (Treiber: Apache-Lizenz)
[1]

MongoDB (abgeleitet vom engl. humongous, „gigantisch“) ist eine Schema-freie, dokumentenorientierte NoSQL-Datenbank, die in der Programmiersprache C++ geschrieben ist.[1][2] Da die Datenbank dokumentenorientiert ist, kann sie Sammlungen von JSON-ähnlichen Dokumenten verwalten. So können viele Anwendungen Daten auf natürlichere Weise modellieren, da die Daten zwar in komplexen Hierarchien verschachtelt werden können, dabei aber immer abfragbar und indizierbar bleiben.

Die Entwicklung von MongoDB begann im Oktober 2007 durch das Unternehmen 10gen, welches am 27. August 2013 in MongoDB, Inc. umbenannt wurde.[3] Die Erstveröffentlichung fand im Februar 2009 statt.[4] MongoDB war 2012 die am weitesten verbreitete NoSQL-Datenbank.[5] MongoDB ist Open Source.

Systemvoraussetzungen[Bearbeiten | Quelltext bearbeiten]

Die Binärdateien sind verfügbar für Windows, Linux, OS X und Solaris. MongoDB kann auf fast jedem Little-Endian-System kompiliert werden.

Aufbau[Bearbeiten | Quelltext bearbeiten]

Datenbanken[Bearbeiten | Quelltext bearbeiten]

Ein MongoDB-Prozess kann mehrere Datenbanken verwalten und eine Datenbank kann mehrere Collections enthalten. Datenbank und Collection ergeben durch einen Punkt getrennt einen Namespace. Für eine Datenbank, die die Daten einer Firma verwalten soll, und eine Collection, die alle Mitarbeiter enthalten soll, könnte man beispielsweise den Namespace firma.mitarbeiter wählen.

Collections[Bearbeiten | Quelltext bearbeiten]

Eine Collection enthält Dokumente und ist mit einer Tabelle einer relationalen Datenbank vergleichbar. Ein wesentlicher Unterschied besteht darin, dass die Dokumente einer Collection völlig unterschiedlich aufgebaut sein können. Weder müssen sie einem Schema folgen noch müssen die Werte desselben Schlüssels vom selben Datentyp sein.

Capped Collections[Bearbeiten | Quelltext bearbeiten]

MongoDB unterstützt größenbeschränkte Dokumentensammlungen – auch capped collections genannt.[6] Eine capped collection wird mit einer bestimmten Größe und – je nach Bedarf – einer Anzahl an Elementen angelegt. Eine capped collection ist die einzige Art Dokumenten-Sammlung, die die Ordnung einhält: Sobald die spezifizierte Größe erreicht ist, verhält sich die capped collection wie ein digitaler Ringspeicher.

Eine besondere Art Cursor – genannt tailable cursor[7] – kann bei capped collections verwendet werden. Der Cursor wurde nach dem Unix-Befehl tail -f benannt. Er verschwindet nicht, sobald er die Wiedergabe der Ergebnisse beendet hat, sondern wartet und gibt neue Ergebnisse wieder, sobald neue Dokumente der Sammlung hinzugefügt werden.

System Collections[Bearbeiten | Quelltext bearbeiten]

MongoDB legt automatisch System Collections an. Eine der System Collections beinhaltet alle Indizes der Datenbank, eine weitere alle Namespaces, eine JavaScript-Code und die übrigen Informationen zum Profiling und Benutzern.

Abfragen[Bearbeiten | Quelltext bearbeiten]

Mongo erlaubt es, jedes Feld jederzeit abzufragen. Mongo unterstützt auch Bereichsabfragen, das Suchen nach regulären Ausdrücken und andere Spezialsuchabfragen zusätzlich zu Suchen anhand von Beispielen. Diese Abfragen schließen auch benutzerdefinierte JavaScript-Funktionen ein. Abfragen können sowohl spezifische Dokumentenfelder wiedergeben (anstelle des gesamten Dokuments) als auch Ergebnisse sortieren, überspringen und einschränken. Abfragen können in eingebettete Objekte und Anordnungen hineinreichen.

Jedes Abfrageergebnis wird als Cursor bereitgestellt.

Indizierung[Bearbeiten | Quelltext bearbeiten]

Die Software unterstützt Indexstrukturen, beispielsweise B-Bäume und Geospatial-Indizes.[8] Verschachtelte Felder (so wie oben in der Ad-hoc-Abfrage beschrieben) können gleichfalls indiziert werden. Das Indizieren von Listen ergibt eine Indizierung jedes einzelnen Elements der Liste.

Der Abfrage-Optimierer von MongoDB sucht während eines Abfragelaufs selbständig zwischen verschiedenen Auswertungsplänen aus und wählt den schnellsten; dabei findet periodisch eine Stichprobewiederholung statt. Entwickler können den verwendeten Index mittels der Funktion explain einsehen und einen anderen Index mit Hilfe der Funktion hint auswählen.

Indizes können jederzeit angelegt und gelöscht werden.

MongoDBs Indizes fehlt die Unterstützung für die übliche alphabetische Sortierung von Umlauten und anderen Unicodezeichen.[9][10]

Aggregation[Bearbeiten | Quelltext bearbeiten]

Zusätzlich zu Ad-hoc-Abfragen unterstützt die Datenbank auch andere Werkzeuge für die Aggregation einschließlich MapReduce und einer Gruppierungsfunktion ähnlich dem GROUP BY von SQL.

GridFS[Bearbeiten | Quelltext bearbeiten]

Um Dokumente speichern zu können, die das Limit von 16 MB überschreiten, kann GridFS (Grid File System) verwendet werden.[11] Dieser Dateien-Speicher-Mechanismus wurde bei Plugins für Apache,[12] nginx[13] und lighttpd[14] eingesetzt.

Abgrenzung zu relationalen (SQL) Datenbanken[Bearbeiten | Quelltext bearbeiten]

MongoDB wird als NoSQL Datenbank klassifiziert und grenzt sich als solche dadurch von traditionellen Datenbanken ab, dass sie eine weniger mächtige Abfragesprache anbietet. Dies ist Vorteil und Nachteil zugleich: Zum einen muss in der Anwendungsschicht mehr Logik vorhanden sein, um die gleichen Ergebnisse zu erzielen wie mit SQL Datenbanken. Zum anderen ist es nun möglich, den Datenbestand und die Arbeitslast über mehrere Server hinweg zu verteilen, was es MongoDB erlaubt, horizontal zu skalieren. Dies ist bei SQL Datenbanken nicht möglich, da manche Abfragen (z.b. Joins) inakzeptabel langsam wären.[15]

MongoDB zielt bei der Verteilung der Daten auf mehrere Server darauf ab, durch Replikation die Verfügbarkeit des Services zu erhöhen und durch Sharding die Arbeits- und Datenlast zu verteilen. Die Replikation bringt allerdings einen weiteren Nachteil mit sich: Wird ein Schreibzugriff von MongoDB bestätigt, dann gibt es ein Zeitfenster, in dem nachgelagerte Lesezugriffe den alten Datenbestand zurück liefern. Dieses Konsistenzmodell wird als Eventual Consistency bezeichnet.

Ein weiteres Abgrenzungsmerkmal von MongoDB zu Relationalen Datenbanken ist die Schemafreiheit. Während in Relationalen Datenbanken die Struktur eines Datenbankeintrages durch die Definition der Tabelle fest vorgeschrieben ist, können sich die Datenbankeinträge in MongoDB frei voneinander unterscheiden (auch wenn sie der gleichen Collection angehören).[15] Dieser Freiheit wird zugesprochen, dass sie eine agile Softwareentwicklung unterstützt, da es einfacher ist, auf veränderte Anforderungen zu reagieren.[16]

Abgrenzung zu anderen NoSQL Datenbanken[Bearbeiten | Quelltext bearbeiten]

Zwecks Klassifizierung von Datenbanken anhand ihrer Qualitätsmerkmalen wird oft das CAP-Theorem herangezogen. Das CAP-Theorem besagt, dass im Falle einer Netzwerk- Partitionierung sich ein verteiltes System entscheiden muss, ob es weiterhin verfügbar bleiben oder Konsistenz gewährleisten soll.[17] MongoDB entscheidet sich hier für die Konsistenz, kann die Verfügbarkeit allerdings aufrechterhalten, solange die Mehrzahl der Knoten eines Replica Sets miteinander kommunizieren können. CouchDB als Vergleich zu MongoDB mit ähnlichen Funktionalitäten stellt die Verfügbarkeit über die Konsistenz.

Verwaltungswerkzeuge[Bearbeiten | Quelltext bearbeiten]

Offizielle Werkzeuge[Bearbeiten | Quelltext bearbeiten]

Mit einem laufenden MongoDB-Server kann auf verschiedenen Wegen eine Verbindung aufgebaut werden. Die Mongo Shell ist in der Distribution enthalten und ermöglicht ihrem Benutzer sowohl administrative wie auch lesende und schreibende Operationen. Eine HTTP-basierte Administrationsoberfläche sowie eine REST-Schnittstelle sind nach vorheriger Aktivierung in einem Browser aufrufbar. Schließlich stehen Programmierern Treiber für zahlreiche Programmiersprachen zur Verfügung, um die Kommunikation ihrer Anwendungen mit MongoDB zu implementieren.

Mongo Shell[Bearbeiten | Quelltext bearbeiten]

Die Mongo Shell ist ein Kommandozeilen-Client. Sie dient der Administration von MongoDB und ermöglicht ihrem Benutzer Lese- wie Schreiboperationen. Dazu erhält man einen Prompt, auf dem man Befehle in der Sprache JavaScript ausführen kann.

Treiber[Bearbeiten | Quelltext bearbeiten]

MongoDB ist mit offiziellen Treibern ausgestattet für C, C++, C#, Haskell, Java, JavaScript, Lisp, Perl, PHP, Python, Ruby und Scala.[18]

Es gibt auch zu einigen Programmiersprachen offiziell unterstützte ORMs für MongoDB, wie z. B. Mongoose für die Node.js-Plattform.[19]

Cloud-basierter Monitoring-Dienst[Bearbeiten | Quelltext bearbeiten]

MongoDB Management Service (MMS) ist eine cloud-basierte Monitoring-Lösung und Alert-Dienst für MongoDB Server.[20]

Grafische Oberflächen[Bearbeiten | Quelltext bearbeiten]

Es gibt einige grafische Oberflächen (GUIs) zur Sichtung und Bearbeitung der Daten. Dazu gehören:

Name Beschreibung Lizenz Linux Windows Mac
3T MongoChef [21] eine plattformunabhängige MongoDB GUI freie Lizenz und proprietär ✔ Ja ✔ Ja ✔ Ja
Nucleon BI Studio Business Intelligence Frontend für MongoDB proprietär ? ✔ Ja ?
Fang of Mongo [22] ein webbasiertes UI, erstellt mit Django und jQuery GNU AGPL v3.0[23] ✔ Ja ? ?
Nucleon Database Master eine Windows-basierte Datenbank-Client-Software, die auch RDMS unterstützt proprietär ? ✔ Ja ?
Futon4Mongo [24] ein Klon des CouchDB-Futon-Web-Interfaces für MongoDB ? ? ? ?
mms, Mongo Management Studio [25] sowohl plattformunabhängiges als auch webbasiertes GUI freie Lizenz und proprietär ✔ Ja ✔ Ja ✔ Ja
Mongo3 [26] ein Ruby-basiertes Interface Apache License 2.0 ✔ Ja ✔ Ja ✔ Ja
MongoHub [27] eine native OS-X-Anwendung für das Management von MongoDB ? ✘ Nein ✘ Nein ✔ Ja
Opricot [28] eine browser-basierte MongoDB-Shell, geschrieben mit PHP GNU GPL v3.0 ✔ Ja ? ?
Robomongo [29] eine plattformunabhängige MongoDB GUI GNU GPL v3.0[30] ✔ Ja ✔ Ja ✔ Ja
UMongo (JMongoBrowser) [31] eine plattformunabhängige Management-GUI, geschrieben in Java verschiedene OpenSource-Lizenzen[32] ? ? ?

Replikation[Bearbeiten | Quelltext bearbeiten]

Um Ausfälle einzelner Server zu kompensieren und die Last der Lesezugriffe auf mehrere Server zu verteilen, bietet MongoDB zwei verschieden Arten der Replikation an.

Master-Slave-Replikation[Bearbeiten | Quelltext bearbeiten]

Die Master-Slave-Replikation ist veraltet, aber noch verfügbar. Ein Master kann Lese- („Reads“) und Schreibzugriffe („Writes“) ausführen. Ein Slave kopiert die Daten vom Master und kann nur für Lesezugriffe oder Backups eingesetzt werden, nicht aber für Schreibzugriffe.

MongoDB gestattet es Entwicklern, zu garantieren, dass auf einer Per-Ablauf-Basis zumindest ein Ablauf auf N Server repliziert wurde.

Replica-Sets[Bearbeiten | Quelltext bearbeiten]

Replica-Sets ähneln dem Master-Slave-Verhältnis, enthalten aber die Möglichkeit für die Slaves, einen neuen Master zu wählen, wenn der derzeitige ausfällt.

Sharding[Bearbeiten | Quelltext bearbeiten]

MongoDB skaliert horizontal unter Verwendung eines Systems, welches als horizontale Fragmentierung bezeichnet wird und das dem BigTable- und PNUTS-Skalierungssystem sehr ähnlich ist. Der Entwickler wählt einen Fragmentierungsschlüssel, der festlegt, wie die Daten in einer Ansammlung verteilt werden. Die Daten werden in Bereiche aufgeteilt (unter Zugrundelegung des Fragmentierungsschlüssels) und über mehrere Instanzen verteilt.

Die Anwendung bzw. ihr Entwickler muss wissen, dass die Kommunikation bei bestimmten Abläufen mit einem fragmentierten Cluster erfolgt. So muss eine „findAndModify“-Abfrage den Fragmentierungsschlüssel zum Beispiel beinhalten, wenn die angefragte Sammlung horizontal fragmentiert ist. Die Anwendung kommuniziert mit einem speziellen Routing-Prozess, der „mongos“ genannt wird und der genauso wie ein einzelner MongoDB-Server aussieht. Dieser „mongos“-Prozess weiß, welche Daten von welcher Instanz verwaltet werden, und routet die Abfrage dementsprechend. Alle Abfragen fließen durch diesen Prozess: Dieser leitet nicht nur die Abfragen und Antworten weiter, sondern führt auch alle notwendigen, finalen Datenver- und -entflechtungen durch. Jede beliebige Anzahl an „mongos“-Prozessen kann gestartet werden, allerdings wird gewöhnlich nur eine pro Anwendungsserver empfohlen.

Technische Grundlagen[Bearbeiten | Quelltext bearbeiten]

Bei Lese- und Schreibzugriffen werden die Daten zunächst im RAM abgelegt und erst nach einer bestimmten Zeit (per Voreinstellung alle 60 Sekunden) vom Betriebssystemdienst mmap auf Disk synchronisiert. Dies ergibt einen Geschwindigkeitsvorteil, da auf den RAM in Nanosekunden zugegriffen werden kann, auf Dateien hingegen im dreistelligen Millisekundenbereich. Ein Nachteil ist, dass etwa bei einem Serverabsturz alle nur im RAM vorhandenen Daten verloren gehen. MongoDB begegnet diesem Nachteil mit einem sogenannten Journaling.[33]

Aufgrund der Nutzung von mmap ist auf 32-Bit-Rechnern die Datengröße auf 2 GB begrenzt (64-Bit-Rechner besitzen eine viel höhere Datengröße).[34] Der MongoDB-Server kann nur auf Little-Endian-Systemen benutzt werden, obwohl die meisten Treiber sowohl auf Little-Endian- als auch auf Big-Endian-Systemen laufen.

Weitere Merkmale sind:

  • UTF-8-Kodierung der Dokumente. Nicht-UTF-8-Daten können mittels eines speziellen Binärdatentyps gespeichert, angefragt und abgerufen werden.
  • Unterstützung von Datum, regulären Ausdrücken, Code und binären Daten (allesamt BSON-Kategorien).
  • Server-seitige JavaScript-Ausführung: JavaScript ist die Verkehrssprache von MongoDB und kann für Abfragen und Aggregationsfunktionen (wie beispielsweise MapReduce) verwendet werden, außerdem kann JavaScript direkt zur Datenbank geschickt und dort ausgeführt werden.

Lizenzierung und Support[Bearbeiten | Quelltext bearbeiten]

MongoDB ist frei erhältlich unter der GNU Affero General Public Lizenz. Die Sprachtreiber sind erhältlich unter einer Apache-Lizenz.[35]

Sicherheit[Bearbeiten | Quelltext bearbeiten]

Im Februar 2015 entdeckten drei Studenten schwerwiegende Sicherheitsprobleme von rund 40.000 im Internet frei zugänglichen Datenbanken mit MongoDB.[36][37] Ursache war mutmaßlich die Standard-Installation, bei der zunächst nur ein Zugriff von einem lokalen System aus möglich ist. Passwortsicherheit und andere Sicherheitsmechanismen werden hier nicht konfiguriert. Wird die Datenbank später auf einen anderen Server verlegt und die Konfiguration nicht angepasst, kann auf Daten von außen frei zugegriffen werden. Der Hersteller der kommerziellen Variante hat inzwischen reagiert und Maßnahmen zur Absicherung empfohlen.[38]

Bekannte Anwender[Bearbeiten | Quelltext bearbeiten]

Literatur[Bearbeiten | Quelltext bearbeiten]

Weblinks[Bearbeiten | Quelltext bearbeiten]

Einzelnachweise und Anmerkungen[Bearbeiten | Quelltext bearbeiten]

  1. MongoDB. Abgerufen am 20. November 2013.
  2. MongoDB-Website. Abgerufen am 22. Juni 2012.
  3. 10gen Announces Company Name Change to MongoDB, Inc. 27. August 2013, abgerufen am 28. August 2013.
  4. MongoDB Blog - March 2010. Abgerufen am 22. Juni 2012.
  5. DB-Engines Ranking. Abgerufen am 5. November 2012.
  6. Capped collections. Abgerufen am 22. Juni 2012.
  7. Tailable cursors. Abgerufen am 22. Juni 2012.
  8. Geospatial indexes. Abgerufen am 22. Juni 2012.
  9. Derick Rethans: Natural Language Sorting with MongoDB. 26. August 2014, abgerufen am 26. Oktober 2015.
  10. Sort by collation. In: MongoDB's Jira. 11. Oktober 2010, abgerufen am 26. Oktober 2015.
  11. GridFS. Abgerufen am 15. Januar 2016.
  12. mod_gridfs. Abgerufen am 19. November 2014.
  13. nginx. Abgerufen am 22. Juni 2012.
  14. lighttpd. Abgerufen am 22. Juni 2012.
  15. a b Vor- und Nachteile von MongoDB. Abgerufen am 30. Januar 2016.
  16. Wozu Schemafreiheit? Abgerufen am 30. Januar 2016.
  17. CAP-Theorem. Abgerufen am 30. Januar 2016.
  18. Drivers. Abgerufen am 22. Juni 2012.
  19. Node.js MongoDB Driver docs.mongodb.org
  20. Mongo Cloud, Zugriff am 17. Oktober 2015
  21. 3T MongoChef. Abgerufen am 1. Oktober 2014.
  22. Fang of Mongo. Abgerufen am 22. Juni 2012.
  23. Fang-of-Mongo/LICENCE at fom_object Fiedzia/Fang-of-Mongo – GitHub
  24. Futon4Mongo. Abgerufen am 22. Juni 2012.
  25. Mongo Management Studio. Abgerufen am 1. September 2014.
  26. Mongo3. Abgerufen am 22. Juni 2012.
  27. MongoHub. Archiviert vom Original am 7. Februar 2015, abgerufen am 22. Juni 2012.
  28. Opricot. Abgerufen am 22. Juni 2012.
  29. robomongo. Abgerufen am 27. Januar 2015.
  30. robomongo/LICENSE at master paralect/robomongo – GitHub
  31. UMongo. Abgerufen am 22. Juni 2012.
  32. umongo/README.rst at master agirbal/umongo – GitHub
  33. Tobias Trelle: MongoDB. Der praktische Einstieg, dpunkt, Heidelberg 2014, S. 21.
  34. 32-bit limitations. Abgerufen am 22. Juni 2012.
  35. The AGPL - MongoDB Blog: May 5, 2009. Abgerufen am 22. Juni 2012.
  36. Berichte Sicherheitsprobleme. Abgerufen am 18. Februar 2015.
  37. FAZ. Abgerufen am 18. Februar 2015.
  38. Informatik Aktuell. Abgerufen am 18. Februar 2015.
  39. MongoDB Powering MTV's Web Properties. 10. Mai 2011. Abgerufen am 6. Juli 2011.
  40. Disney Central Services Storage: Leveraging Knowledge and skillsets. 24. Mai 2011. Archiviert vom Original am 11. Juni 2011. Abgerufen am 6. Juli 2011.
  41. MongoDB at foursquare - Presentation at MongoNYC. 21. Mai 2010. Abgerufen am 28. Juni 2010.
  42. Jacqueline Maher: Building a Better Submission Form, NYTimes Open Blog. 25. Mai 2010. Abgerufen am 28. Juni 2010. 
  43. How Python, TurboGears, and MongoDB are Transforming SourceForge.net. PyCon 2010. 20. Februar 2010. Archiviert vom Original am 19. August 2010. Abgerufen am 22. Juni 2012.
  44. MongoDB at Etsy. Code as Craft: Etsy Developer Blog. 19. Mai 2010. Abgerufen am 28. Juni 2010.
  45. Holy Large Hadron Collider, Batman!. The MongoDB NoSQL Database Blog. 3. Juni 2010. Abgerufen am 3. August 2010.
  46. AppScale - Supported Datastores. Abgerufen am 22. Juni 2012.