Kapitel 1. Einführung

Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com

MongoDB ist eine leistungsstarke, flexible und skalierbare Allzweckdatenbank. Sie kombiniert die Fähigkeit zur Skalierung mit Funktionen wie sekundären Indizes, Bereichsabfragen, Sortierung, Aggregationen und geografischen Indizes. Dieses Kapitel behandelt die wichtigsten Designentscheidungen, die MongoDB zu dem gemacht haben, was sie ist.

Benutzerfreundlichkeit

MongoDB ist eine dokumentenorientierteDatenbank, keine relationale Datenbank. Der Hauptgrund für die Abkehr vom relationalen Modell ist die einfachere Skalierung, aber es gibt auch noch andere Vorteile.

Eine dokumentenorientierte Datenbank ersetzt das Konzept der "Zeile" durch ein flexibleres Modell, das "Dokument". Da der dokumentenorientierte Ansatz eingebettete Dokumente und Arrays zulässt, ist es möglich, komplexe hierarchische Beziehungen mit einem einzigen Datensatz darzustellen. Das passt natürlich zu der Art und Weise, wie Entwickler in modernen objektorientierten Sprachen über ihre Daten denken.

Es gibt auch keine vordefinierten Schemata: Die Schlüssel und Werte eines Dokuments haben keine festen Typen oder Größen. Ohne ein festes Schema ist es einfacher, Felder nach Bedarf hinzuzufügen oder zu entfernen. Das macht die Entwicklung im Allgemeinen schneller, da die Entwickler/innen schnell iterieren können. Es ist auch einfacher zu experimentieren. Die Entwickler können Dutzende von Modellen für die Daten ausprobieren und dann das beste auswählen.

Skalierbar

Die Datenmengen für Anwendungen wachsen in rasantem Tempo. Immer mehr verfügbare Bandbreite und billige Speicherung haben eine Umgebung geschaffen, in der selbst kleine Anwendungen mehr Daten speichern müssen, als viele Datenbanken bewältigen können. Ein Terabyte an Daten, früher eine unerhörte Menge an Informationen, ist heute alltäglich.

Da die Datenmengen, die Entwickler speichern müssen, immer größer werden, stehen sie vor einer schwierigen Entscheidung: Wie sollen sie ihre Datenbanken skalieren? Bei der Skalierung einer Datenbank muss man sich entscheiden, ob man sie vergrößern (eine größere Maschine kaufen) oder verkleinern (die Daten auf mehrere Maschinen verteilen) will. Die Aufwärtsskalierung ist oft der Weg des geringsten Widerstands, hat aber auch Nachteile: Große Maschinen sind oft sehr teuer, und irgendwann ist eine physikalische Grenze erreicht, an der eine leistungsstärkere Maschine nicht mehr ohne weiteres gekauft werden kann. Die Alternative ist die Skalierung nach unten: Um Speicherplatz hinzuzufügen oder den Durchsatz für Lese- und Schreibvorgänge zu erhöhen, kaufst du zusätzliche Server und fügst sie deinem Cluster hinzu. Das ist sowohl billiger als auch skalierbarer, allerdings ist es schwieriger, tausend Maschinen zu verwalten als eine einzige.

MongoDB wurde entwickelt, um skalierbar zu sein. Das dokumentenorientierte Datenmodell macht es einfacher, Daten auf mehrere Server zu verteilen. MongoDB kümmert sich automatisch um den Daten- und Lastausgleich in einem Cluster, indem es die Dokumente automatisch umverteilt und Lese- und Schreibvorgänge an die richtigen Rechner weiterleitet, wie in Abbildung 1-1 dargestellt.

Abbildung 1-1. Skalierung von MongoDB mit Sharding über mehrere Server

Die Topologie eines MongoDB-Clusters oder ob es sich tatsächlich um einen Cluster und nicht um einen einzelnen Knoten am anderen Ende einer Datenbankverbindung handelt, ist für die Anwendung transparent. So können sich die Entwickler auf die Programmierung der Anwendung konzentrieren und nicht auf deren Skalierung. Wenn die Topologie eines bestehenden Einsatzes geändert werden muss, um z. B. eine höhere Last zu bewältigen, kann die Anwendungslogik unverändert bleiben.

Reich an Features...

MongoDB ist eine Allzweckdatenbank. Neben dem Erstellen, Lesen, Aktualisieren und Löschen von Daten bietet sie die meisten Funktionen, die du von einem Datenbankmanagementsystem erwarten würdest, und viele weitere, die sie von anderen abheben. Dazu gehören:

Indizierung

MongoDB unterstützt generische sekundäre Indizes und bietet darüber hinaus Funktionen für eindeutige, zusammengesetzte, raumbezogene und Volltext-Indizes. Sekundäre Indizes für hierarchische Strukturen wie verschachtelte Dokumente und Arrays werden ebenfalls unterstützt und ermöglichen es Entwicklern, die Möglichkeiten der Modellierung in vollem Umfang zu nutzen, so dass sie am besten für ihre Anwendungen geeignet sind.

Aggregation

MongoDB bietet ein Aggregations-Framework, das auf dem Konzept der Datenverarbeitungspipelines basiert. Mit Aggregationspipelines kannst du komplexe Analyse-Engines aufbauen, indem du Daten in einer Reihe von relativ einfachen Schritten auf der Serverseite verarbeitest und dabei die Vorteile von Datenbankoptimierungen voll ausnutzt.

Besondere Erhebungs- und Indexarten

MongoDB unterstützt Time-to-Live (TTL)-Sammlungen für Daten, die nach einer bestimmten Zeit ablaufen sollen, wie z. B. Sitzungen, und Sammlungen mit fester Größe (Capped), um aktuelle Daten zu speichern, wie z. B. Protokolle. MongoDB unterstützt auch partielle Indizes, die sich auf die Dokumente beschränken, die einem Kriterienfilter entsprechen, um die Effizienz zu erhöhen und den benötigten Speicherplatz zu reduzieren.

Speicherung von Dateien

MongoDB unterstützt ein einfach zu bedienendes Protokoll zum Speichern großer Dateien und Dateimetadaten.

Einige Funktionen, die in relationalen Datenbanken üblich sind, sind in MongoDB nicht vorhanden, insbesondere komplexe Joins. MongoDB unterstützt Joins nur in sehr begrenztem Umfang durch die Verwendung des Aggregationsoperators $lookup, der in der Version 3.2 eingeführt wurde. In der Version 3.6 sind komplexere Joins mit mehreren Join-Bedingungen und unverbundenen Subqueries möglich. Die Behandlung von Joins in MongoDB war eine architektonische Entscheidung, um eine bessere Skalierbarkeit zu ermöglichen, da diese beiden Funktionen in einem verteilten System nur schwer effizient bereitgestellt werden können.

...ohne Abstriche bei der Geschwindigkeit

Die Leistung ist ein wichtiges Ziel von MongoDB und hat einen Großteil des Designs bestimmt. MongoDB nutzt opportunistisches Locking in der WiredTiger Speicherung, um die Gleichzeitigkeit und den Durchsatz zu maximieren. MongoDB nutzt so viel Arbeitsspeicher wie möglich als Cache und versucht, automatisch die richtigen Indizes für Abfragen zu wählen. Kurz gesagt, fast jeder Aspekt von MongoDB wurde entwickelt, um eine hohe Leistung zu gewährleisten.

Obwohl MongoDB sehr leistungsfähig ist und viele Funktionen von relationalen Systemen enthält, soll sie nicht alles tun, was eine relationale Datenbank tut. Für einige Funktionen verlagert der Datenbankserver die Verarbeitung und Logik auf die Client-Seite (entweder über die Treiber oder über den Anwendungscode des Nutzers). Die Beibehaltung dieses schlanken Designs ist einer der Gründe, warum MongoDB eine so hohe Leistung erzielen kann.

Die Philosophie

Im Laufe dieses Buches werden wir uns die Zeit nehmen, die Gründe und Motive für bestimmte Entscheidungen bei der Entwicklung von MongoDB zu erläutern. Wir hoffen, dass wir dadurch die Philosophie hinter MongoDB vermitteln können. Am besten lässt sich das MongoDB-Projekt jedoch zusammenfassen, wenn man sich auf seinen Hauptfokus bezieht: einen vollwertigen Datenspeicher zu schaffen, der skalierbar, flexibel und schnell ist.

Get MongoDB: Das ultimative Handbuch, 3. Auflage now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.