8 MongoDB

8.1 Was ist MongoDB?

MongoDB ist eine kostenlose Open-Source-Datenbank, die auf Dokumenten statt auf Tabellen basiert. Die Datenbank wurde entwickelt, um modernen Internetanwendungen gerecht zu werden, indem sie robuste Skalierbarkeit, Flexibilität und Performance bietet.

8.1.1 Dokumentenorientierte Speicherung

In MongoDB erfolgt die Speicherung der Daten dokumentenorientiert, im Gegensatz zu relationalen Datenbanken, die Tabellen verwenden. Hierbei werden Daten in BSON-Format (Binary JSON) gespeichert, was eine erweiterte Version des bekannten JSON-Formats ist. Dies ermöglicht eine hohe Flexibilität, da Dokumente in einer Kollektion verschiedene Felder und Strukturen aufweisen können. Es ist nicht erforderlich, im Voraus ein Schema zu definieren. Eingebettete Dokumente und Arrays sind ebenfalls möglich, was die Modellierung komplexer Hierarchien und Beziehungen direkt in einem einzelnen Dokument erlaubt. Diese dokumentenorientierte Struktur ist besonders nützlich für Anwendungen, die schnelle Entwicklungszyklen und sich ändernde Datenstrukturen erfordern.

8.1.2 Skalierbarkeit

In Bezug auf die Skalierbarkeit ist MongoDB eine der flexibelsten und leistungsfähigsten NoSQL-Datenbanken. MongoDB unterstützt sowohl vertikale als auch horizontale Skalierung, um unterschiedliche Anforderungen an Durchsatz und Speicherplatz zu erfüllen.

Bei der vertikalen Skalierung wird die Leistung durch Hinzufügen von mehr Ressourcen wie CPU, Speicher oder I/O-Kapazitäten zu einem einzelnen Server verbessert. Diese Methode ist jedoch in der Regel teurer und hat ihre Grenzen, was die Hardware betrifft.

Die horizontale Skalierung in MongoDB ist effizienter und wird durch sogenannte Sharding ermöglicht. Dabei wird der Datenbestand in kleinere Teile, sogenannte Shards, aufgeteilt und auf mehrere Server verteilt. Dies ermöglicht es, die Datenbank über viele Server zu verteilen, wodurch die Kapazität nahezu linear erhöht werden kann. Darüber hinaus bietet MongoDB Replikationsmechanismen, um die Ausfallsicherheit zu verbessern. Mit einem Replikationsset, das aus mehreren Knoten besteht, kann die Datenbank Ausfälle und Netzwerkunterbrechungen besser bewältigen.

Ebenso unterstützt MongoDB automatische Failover-Prozesse. Wenn ein primärer Knoten ausfällt, wählt das Replikationsset automatisch einen neuen primären Knoten aus den verbleibenden sekundären Knoten aus, was die Verfügbarkeit der Daten sicherstellt.

Zusammenfassend bietet MongoDB durch seine Architektur und Funktionen eine hohe Skalierbarkeit und Ausfallsicherheit, die es ideal für den Einsatz in verschiedenen Anwendungsfällen, von kleinen Anwendungen bis hin zu großen, verteilten Systemen, machen.

8.1.3 Flexibilität

Die Flexibilität ist eines der Hauptmerkmale von MongoDB und ermöglicht eine schnelle und agile Entwicklung. Da MongoDB schemalos ist, können Entwickler ohne vorherige Definition von Tabellenstrukturen beginnen, was den Entwicklungsprozess erheblich beschleunigt. Dokumente in einer Kollektion müssen nicht alle die gleiche Struktur haben, was den Entwicklern die Möglichkeit gibt, schnell auf Änderungen in den Anforderungen zu reagieren.

Diese Flexibilität hat jedoch auch ihre Kehrseiten. Das Fehlen eines festen Schemas kann zu Inkonsistenzen in den Daten führen. Beispielsweise ist es möglich, dass unterschiedliche Dokumente unterschiedliche Datentypen für das gleiche Feld verwenden. Dies kann die Datenabfrage und -analyse erschweren.

Ein weiterer Nachteil ist, dass die Flexibilität zu einer laxen Datenintegrität führen kann. In relationalen Datenbanken erzwingen Schemata und Relationen eine gewisse Datenkonsistenz, die in MongoDB möglicherweise fehlt. Dies kann insbesondere in Anwendungen problematisch sein, die eine hohe Datenintegrität erfordern, wie beispielsweise Finanzsysteme.

Darüber hinaus kann die Freiheit, die durch die Flexibilität geboten wird, zu einer geringeren Disziplin bei der Datenmodellierung führen. Das kann wiederum die Wartbarkeit und die Performance der Anwendung beeinträchtigen, wenn sie skaliert.

Insgesamt bietet die Flexibilität von MongoDB sowohl erhebliche Vorteile als auch Herausforderungen. Während sie schnelle Entwicklungszyklen und Anpassungsfähigkeit ermöglicht, erfordert sie auch eine sorgfältige Planung und Disziplin, um potenzielle Nachteile zu minimieren.

8.1.4 Native Replikation

Native Replikation in MongoDB bezieht sich auf die eingebaute Fähigkeit des Systems, Daten über mehrere Server oder Knoten zu replizieren. Das bedeutet, dass Sie keine zusätzliche Software oder komplexe Konfigurationen benötigen, um eine Replikationsarchitektur einzurichten. MongoDB verwendet ein Replikationsset, das aus einem primären Knoten und mehreren sekundären Knoten besteht. Änderungen an den Daten werden zuerst im primären Knoten vorgenommen und dann an die sekundären Knoten weitergeleitet.

Die Native Replikation in MongoDB ist im Vergleich zu vielen anderen Datenbankmanagement-Systemen einfacher einzurichten und zu verwalten. Ein Grund dafür ist die Verwendung des Oplog (Operations Log), das alle Datenänderungen speichert und an die sekundären Knoten weiterleitet. Dies ermöglicht eine effiziente und nahtlose Replikation.

Die Einfachheit der nativen Replikation in MongoDB bietet jedoch auch einen Kontrast zu den oft komplexeren, aber auch flexibleren Replikationsmechanismen, die in einigen relationalen Datenbanksystemen gefunden werden können. In relationalen Systemen kann die Konfiguration der Replikation oft kompliziert sein, und sie erfordert in der Regel mehr manuelles Eingreifen.

Eines der Hauptziele von MongoDB ist es, Skalierbarkeit und Ausfallsicherheit zu vereinfachen, und die native Replikation ist ein Schlüsselmerkmal, das dazu beiträgt. Sie ermöglicht eine hohe Verfügbarkeit und Ausfallsicherheit, indem sie die Lastverteilung verbessert und die Daten an mehreren Orten speichert.

8.1.5 Sharding

Sharding ist ein Prozess der horizontalen Datenpartitionierung in MongoDB. Es ermöglicht die Verteilung von Daten über mehrere Server oder „Shards“. Jedes Shard fungiert als eigenständige Datenbank und hält einen Teil des gesamten Datensatzes. Sharding wird hauptsächlich verwendet, um die Skalierbarkeit zu erhöhen und die Last besser zu verteilen.

8.1.5.1 Funktionsweise

MongoDB verwendet einen „Shard Key“, um zu entscheiden, wie die Daten auf die verschiedenen Shards verteilt werden. Der Shard Key ist ein Feld, das in jedem Dokument der zu shardenden Kollektion vorhanden sein muss. MongoDB verwendet den Wert dieses Schlüssels, um Dokumente in „Chunks“ zu gruppieren, die dann auf verschiedene Shards verteilt werden.

8.1.5.2 Sharding-Konfiguration

Die Einrichtung von Sharding in MongoDB umfasst im Allgemeinen die folgenden Schritte:

  1. Shard-Server initialisieren: Jeder Shard-Server wird als eigenständige mongod-Instanz initialisiert.

    mongod --shardsvr --dbpath /path/to/shard/data --port 27018
  2. Konfigurationsserver starten: Ein oder mehrere mongod-Prozesse werden als Konfigurationsserver gestartet.

    mongod --configsvr --dbpath /path/to/config/data --port 27019
  3. MongoS starten: Der MongoDB Shard Router (mongos) ist für die Weiterleitung von Clientanfragen an die entsprechenden Shards verantwortlich.

    mongos --configdb configServerAddress --port 27017
  4. Shards hinzufügen: Fügen Sie die Shards zum Cluster hinzu.

    mongos> sh.addShard("shardServerAddress")
  5. Shard Key auswählen und Sharding aktivieren: Wählen Sie ein Feld als Shard Key aus und aktivieren Sie Sharding für eine Kollektion.

    mongos> sh.shardCollection("database.collection", { "shardKeyField" : 1 })

8.1.5.3 Beispiel

Angenommen, Sie haben eine MongoDB-Kollektion namens orders und möchten das Feld orderID als Shard Key verwenden.

mongos> sh.shardCollection("mydb.orders", { "orderID" : 1 })

Dies würde die orders-Kollektion so konfigurieren, dass sie auf der Grundlage des orderID-Felds auf die verschiedenen Shards verteilt wird.

Insgesamt ist Sharding ein wirksames Mittel zur Verbesserung der Skalierbarkeit und Performance in MongoDB, erfordert jedoch eine sorgfältige Planung und Konfiguration.

8.1.6 Intuitive Abfragesprache

Die Abfragesprache von MongoDB ist für viele Entwickler als intuitiv zu bezeichnen, da sie auf JSON-ähnlichen Dokumenten operiert, die leicht zu verstehen und zu verwenden sind. Anfragen und Befehle können als einfache JavaScript-Objekte formuliert werden. Zudem bietet MongoDB eine Vielzahl an Operatoren für Sortierung, Filterung und Aggregation, die die Sprache flexibel und mächtig machen.

Beispiele für MongoDB-Abfragen:

Die Abfragesprache ermöglicht es auch, komplexe Operationen mit nur wenigen Zeilen Code durchzuführen. Das macht die Interaktion mit der Datenbank sowohl für Entwickler als auch für Administratoren wesentlich einfacher und intuitiver im Vergleich zu SQL-basierten Systemen, in denen Joins und Unterabfragen oft kompliziert sein können.