NoSQL-Groll-Match: MongoDB vs. Couchbase Server

Die Auswahl der richtigen Datenbank für den Job kann eine entmutigende Aufgabe sein, insbesondere wenn Sie den gesamten Bereich der SQL- und NoSQL-Optionen nutzen. Wenn Sie nach einer flexiblen Allzweckoption suchen, die flüssige Schemata und komplexe verschachtelte Datenstrukturen ermöglicht, ist eine Dokumentendatenbank möglicherweise das Richtige für Sie. MongoDB und Couchbase Server sind zwei beliebte Optionen. Wie solltest du wählen?

MongoDB kombiniert die Vorteile einer immensen Beliebtheit, der Unterstützung für einfache Diagrammsuchen und der Möglichkeit, SQL-Abfragen über einen BI-Connector durchzuführen. Couchbase verfügt über eine eigene große Benutzergemeinschaft, eine performante Schlüsselwertarchitektur und eine SQL-ähnliche Abfragesprache, mit der in verschachtelten Dokumentstrukturen navigiert werden kann.

Kurz gesagt, sowohl MongoDB als auch Couchbase sind leistungsstarke und flexible dokumentenorientierte Datenbanken mit zahlreichen Extras. Das heißt, sie haben wichtige Unterschiede, die das Gleichgewicht je nach Ihren Bedürfnissen in die eine oder andere Richtung neigen. Um Ihnen bei der Entscheidung zu helfen, werden wir diese Datenbanken durch die wichtigsten Überlegungen führen und erläutern, wie sie sich in Bezug auf Installation und Einrichtung, Verwaltung, Benutzerfreundlichkeit, Skalierbarkeit und Dokumentation verhalten.

Diese Diskussion basiert auf MongoDB 3.4 und Couchbase Server 4.6. Sie können sich auch meine eigenständigen Testberichte zu MongoDB 3.4 und Couchbase Server 4.0 ansehen.

Installation und Einrichtung

Installation und Einrichtung können aus zwei Perspektiven betrachtet werden: Entwickler, die gegen eine lokale Instanz arbeiten, und Infrastrukturingenieure, die einen ersten Produktionscluster einrichten. Viele NoSQL-Datenbanken haben starke Geschichten über Entwicklerfreundlichkeit, was die Wahrscheinlichkeit erhöht, dass Entwickler das Produkt ausprobieren und es in ihre Systeme einführen. Eine einfache lokale Einrichtung ist ein starkes Verkaufsargument. Auf der anderen Seite wird sich die Datenbank letztendlich in der Produktion bewähren, daher ist das Produktionssetup genauso wichtig, um richtig zu sein.

Entwickler-Setup

Anstatt Binärdateien zu verwenden, die auf dem Bare Metal ausgeführt werden, werden wir uns ansehen, wie diese beiden Datenbanken in einer Docker-Umgebung eingerichtet werden. Das Docker-Setup für MongoDB und Couchbase ist ziemlich einfach. Für Couchbase müssen einige zusätzliche Ports verfügbar sein, aber es ist einfach, damit umzugehen. Sobald die Bilder heruntergezogen und die Container gestartet wurden, gibt es einen spürbaren Unterschied in der Entwicklererfahrung. Mit MongoDB sind Sie fertig. Sie können eine Verbindung über eine Anwendung oder die Mongo-Shell herstellen und sofort mit der Arbeit beginnen. Im Gegensatz dazu führt Sie Couchbase über die Benutzeroberfläche durch einen obligatorischen Einrichtungsprozess, bei dem Sie mit einer Reihe von Konfigurationsoptionen konfrontiert sind, die sich an Infrastrukturingenieure richten. Als Entwickler können Sie die ausgewählten Optionen beibehalten und einen Standard-Bucket verwenden, dies erhöht jedoch die Reibung.

MongoDB gewinnt diesen Titel, jedoch nicht ohne Einschränkung. Nur weil die lokale Bereitstellung einfach war, heißt das nicht, dass Sie in der Produktion dasselbe tun können. Es mag offensichtlich erscheinen, dass Produktionsumgebungen mehr Sorgfalt und Konfiguration erfordern, aber die weit verbreiteten Lösegeldangriffe auf ungesicherte, öffentlich zugängliche MongoDB-Instanzen zu Beginn dieses Jahres lassen darauf schließen, dass viele Geschäfte gefährliche Abkürzungen verwenden.

Rundensieger: MongoDB.

Produktionsaufbau

Die Bereitstellung einer verteilten Datenbank für die Produktion erfordert in der Regel viele Schritte und ein angemessenes Maß an Koordination. MongoDB und Couchbase unterscheiden sich nicht. In beiden Fällen hängt die Schwierigkeit der Einrichtung von den Anforderungen der Bereitstellung ab, wobei unterschiedliche Leistungskompromisse unterschiedliche Komplexitätsstufen mit sich bringen.  

MongoDB-Cluster bestehen entweder aus einem Replikatsatz oder einem Sharded-Cluster. Ein Replikatsatz ist eine Gruppe von MongoDB-Servern, die alle dieselben Daten enthalten, während ein Sharded-Cluster Daten auf mehrere Replikatsätze verteilt. Replikatsätze sind einfach zu konfigurieren und bestehen aus einem einzelnen Servertyp, der bereitgestellt werden soll. Sharded-Cluster sind stärker involviert und erfordern die Bereitstellung von drei verschiedenen Servertypen, von denen jeder repliziert wird. Cluster können über Befehlszeilenflags, Konfigurationsdateien und Datenbankbefehle konfiguriert werden.

Couchbase-Cluster können abhängig von den Leistungsmerkmalen, die Sie vom Cluster benötigen, aus einem einzelnen Servertyp oder mehreren Servertypen bestehen. Die Couchbase-Architektur besteht aus verschiedenen Diensten, die pro Knoten aktiviert oder deaktiviert werden können. In einem einfachen Szenario aktivieren Sie alle Dienste auf allen Knoten. Wenn Sie jedoch die Anforderungen jedes Dienstes anpassen möchten oder jeden Dienst unabhängig skalieren möchten, müssen Sie verschiedene Servertypen konfigurieren, Standardhardware für den Datendienst zuweisen, SSDs für den Indexdienst, CPU-optimiert für den Abfragedienst und so weiter. Cluster können über die integrierte Web-Benutzeroberfläche, die Befehlszeilenschnittstelle und die REST-API konfiguriert werden.

In Bezug auf den Produktionsaufbau der Dateninfrastruktur sind sowohl MongoDB als auch Couchbase ziemlich eindeutig. Sicher, Sie können in Konfigurations- und Optimierungsoptionen eintauchen und kommen nie heraus, aber in den meisten Fällen sind diese für Infrastrukturingenieure am einfachsten.

Rundensieger: Unentschieden. 

Verwaltung

Sobald die Datenbank in der Produktion ausgeführt wird und Datenverkehr akzeptiert, wird die Verwaltung zu einem zentralen Anliegen. Um die einfache Verwaltung zu bewerten, werde ich mich mit dem Sicherungsprozess, Datenbank-Upgrades und Überwachungsansätzen befassen.

Backups

Backups sind ein wichtiger Bestandteil der Hygiene von Produktionsdatenbanken, und das Ausführen von Datenbanken auf hochverfügbare, verteilte Weise ändert daran nichts.

MongoDB bietet verschiedene Optionen zum Sichern von Daten eines laufenden Clusters. Wenn das zugrunde liegende Betriebssystem Snapshots zu bestimmten Zeitpunkten unterstützt, können Sie sich auf diese Funktion verlassen, um ein Backup zu einem bestimmten Zeitpunkt zu erfassen. Das Sichern von Sharded-Clustern ist etwas schwierig, da Sie gleichzeitig einen sekundären Snap von jedem Shard und einem Konfigurationsserver erstellen müssen.

Tools auf Systemebene wie cp oder rsync können verwendet werden, um die Datenbankdateien an einen anderen Speicherort zu kopieren. Aufgrund der Art dieser Tools müssen die Schreibvorgänge jedoch während des Vorgangs angehalten werden. Obwohl MongoDB mit Befehlszeilentools zum Sichern und Wiederherstellen von Datenbanken geliefert wird, werden diese Tools für größere Cluster nicht empfohlen. Alternativ können Sie für Cloud Manager oder Ops Manager bezahlen oder über die MongoDB Atlas DBaaS-Plattform bereitstellen, um UI-basierte Tools zu erhalten, die Backups und Wiederherstellungen für Sie erledigen.

Couchbase wird mit Befehlszeilentools geliefert, mit denen Daten von den verschiedenen Diensten gesichert werden können. Diese können so konfiguriert werden, dass vollständige Sicherungen oder zwei Arten von inkrementellen Sicherungen ausgeführt werden. Inkrementelle Sicherungen können entweder inkrementell von der letzten vollständigen Sicherung (kumulativ inkrementell) oder inkrementell von der letzten Sicherung jeglicher Art (differenziell inkrementell) sein. Dies ermöglicht komplexe Sicherungsstrukturen, die unterschiedliche Ebenen des Speicherplatzes erfordern und unterschiedliche Ebenen der Wiederherstellungskomplexität erfordern.

Unternehmenskunden können auf das Dienstprogramm cbbackupmgr zurückgreifen, das verschiedene zugrunde liegende Datenstrukturen verwendet, um beim Sichern von Daten eine bessere Leistung zu erzielen.

Rundensieger: Couchbase aufgrund seiner größeren Flexibilität und Unterstützung für inkrementelle Backups.

Upgrade durchführen

Ein Cluster mit langer Laufzeit sollte einen klaren, einfachen Upgrade-Pfad haben. Je schwieriger ein Upgrade ist, desto unwahrscheinlicher ist es, dass es auf dem neuesten Stand gehalten wird. Das bedeutet, dass Entwickler und Administratoren neue Funktionen verpassen werden.

MongoDB-Upgrades lassen sich am besten anhand der Replikatsatzstufe verstehen. Wenn Sie einen Sharded-Cluster ausführen, befolgen Sie meistens die Schritte zum Aktualisieren von Replikatsätzen für jeden Shard. Innerhalb eines Replikatsatzes wird jede Sekundärseite heruntergefahren, an Ort und Stelle aktualisiert und gestartet. Sobald die Sekundärteile in Betrieb sind und mit dem Primärsystem übereinstimmen, wird ein Failover ausgelöst, und das erstere Primärsystem kann heruntergefahren und aktualisiert werden. Es wird als sekundäres System erneut gestartet und holt die fehlenden Schreibvorgänge im Offline-Modus nach. Upgrades sind daher meistens ein Online-Prozess, aber das primäre Failover führt wahrscheinlich zu 10 bis 20 Sekunden ohne Schreibvorgänge. Daher ist ein Wartungsfenster mit akzeptablen Ausfallzeiten erforderlich.

Couchbase geht bei Upgrades genauso vor, wie Sie einen Knoten zu einem Cluster hinzufügen oder daraus entfernen würden. Alle Daten des Upgrade-Knotens müssen im gesamten Cluster neu verteilt und dann nach Abschluss des Upgrades erneut ausgeglichen werden, und der Knoten tritt dem Cluster wieder bei. Dieser Neuausgleichsprozess muss für jeden Knoten im Cluster nacheinander durchgeführt werden. Dies wird viel länger dauern als das Upgrade eines MongoDB-Clusters, da alle Daten verschoben werden müssen. Eine andere Möglichkeit besteht darin, den gesamten Cluster offline zu schalten, jeden Knoten zu aktualisieren und alle wieder online zu schalten.

Während der Couchbase-Upgrade-Pfad keine Ausfallzeiten erfordert, ist der Prozess langwierig und erfordert eine große Menge an Datenmischungen, um zu funktionieren.

Rundensieger: Unentschieden. Tiebreaker: Wenn Wartungsausfälle akzeptabel sind, gewinnt MongoDB. Wenn nicht, ist Couchbase die einzige Wahl.

Überwachung

Die Sichtbarkeit eines laufenden Clusters ist offensichtlich für eine erfolgreiche Datenbankverwaltung von entscheidender Bedeutung. Wenn etwas schief geht, ist nichts schlimmer als eine eingeschränkte Sicht auf die Wahrheit im Cluster.

MongoDB bietet CLI-Tools und -Befehle innerhalb der Shell, die Metriken zur Instanzaktivität und -leistung bereitstellen. Darüber hinaus verweist MongoDB Sie hilfreich auf Tools von Drittanbietern oder eigene Unternehmensprodukte (Cloud Manager, Ops Manager, Atlas).

Couchbase hingegen wird mit einer Web-Benutzeroberfläche geliefert, die Statistiken und Visualisierungen für Instanzen, Knoten, Abfrageleistung und mehr enthält. Darüber hinaus kann Couchbase so konfiguriert werden, dass E-Mail-Benachrichtigungen gesendet werden, wenn bestimmte Statistiken außerhalb des Bereichs liegen.

Rundensieger: Couchbase für sofort einsatzbereite Visualisierungen und Warnungen.

Benutzerfreundlichkeit

Nachdem die Datenbank eingerichtet und alle Verwaltungsanforderungen erfüllt wurden, verlagert sich das Hauptanliegen vom Betrieb zur Nutzung. Ich werde das auf Datenmodellierung, Indexdesign, grundlegende Abfragen und Aggregationen aufteilen.

Datenmodellierung

Als Dokumentendatenbanken können weder MongoDB noch Couchbase die Herausforderung vermeiden, mit relationalen Daten umzugehen. Beide bieten die Möglichkeit, relationale Daten als verschachtelte, denormalisierte Daten sowie in Form von Verweisen auf andere Dokumente der obersten Ebene zu speichern. Dieser Ansatz zur Datenspeicherung ist letztendlich der Hauptüberlegungspunkt für die Datenmodellierung für beide Datenbanken, obwohl jede eine zunehmende Breite von Anwendungsfällen, Funktionen und Abfragemustern unterstützt.

Rundensieger: Unentschieden.

Indexdesign

Indizes erfüllen in Dokumentdatenbanken dieselbe Funktion wie in relationalen Datenbanken. Das heißt, sie repräsentieren bestimmte Daten auf effizientere Weise, um die Abfrageleistung zu verbessern. MongoDB und Couchbase verfolgen sehr unterschiedliche Ansätze bei der Indexgestaltung und -erstellung.

MongoDB unterstützt die Indexerstellung für ein oder mehrere Felder in einem Dokument, sodass Sie die Reihenfolge und Richtung (aufsteigend oder absteigend) von Standardindizes festlegen können. Es ist auch möglich, spezielle Geodatenindizes und Volltextindizes als Teil derselben Syntax einzuschließen. Die Abfrage-Engine verwendet diese Indizes, Präfixe dieser Indizes oder eine Kombination mehrerer Indizes, um Anforderungen zu beschleunigen.

Couchbase stützt sich auf zwei verschiedene Mechanismen zur Verbesserung der Abfrageleistung: MapReduce-Ansichten und den Global Secondary Index (GSI). MapReduce-Ansichten bestehen aus benutzerdefiniertem JavaScript-Code, der Daten beim Durchlaufen des Systems wie eine inkrementelle Voraggregation verarbeitet. MapReduce-Ansichten können so einfach sein wie das Zulassen von Dokumentensuchen in einem inneren Feld, oder sie können eine komplexere Logik enthalten, die Berechnungen und Aggregationen für die Daten in Dokumenten ausführt.

Das Schreiben von MapReduce in JavaScript zur Unterstützung von Abfragen ist etwas unhandlich. Daher sollten Sie im Allgemeinen die GSI verwenden, wo dies möglich ist. Indizes in der GSI werden mit N1QL (ausgesprochen „Nickel“) beschrieben, einer partiellen SQL-Implementierung auf Couchbase. Die N1QL-Syntax ist ziemlich klar und N1QL-Abfragen sind weitaus besser als MapReduce, aber Sie müssen den Index auf einem bestimmten Knoten platzieren. Wenn ein Index hoch verfügbar sein soll, müssen Sie diesen Index manuell auf mehr als einem Knoten erstellen.

Rundensieger: MongoDB für seine konsolidierte Indexierungs-API und die Fähigkeit, MapReduce insgesamt zu vermeiden.

Grundlegende Fragen

Bei einem geeigneten Datenmodell sind die meisten Abfragen an die Datenbank in der Regel einfach. Über CRUD-Operationen hinaus, bei denen die ID des betreffenden Dokuments bekannt ist, ist es wichtig, verschiedene Arten der Filterung von Dokumenten ausdrücken und auswählen zu können, an welchen Feldern wir interessiert sind.

MongoDB beschreibt Abfragen in JSON und bietet eine deklarative Syntax zum Festlegen von Bedingungen und Filtern für Felder. Das Abfragedokument kann aus einer beliebigen Anzahl von Abfrageselektoren bestehen, die beschreiben, wie die Ergebnismenge aussehen soll. In diesem Abfragedokument können Bereiche, Gleichheit, Textsuche und Geodatenabfragen definiert werden. Das Dokument unterstützt Boolesche Operatoren, so dass mehrere Abfrageklauseln können logisch zusammen mit verbunden werden AND, ORund so weiter. Das Abfragedokument kann schnell zu einem stark verschachtelten JSON-Dokument werden, was manchmal überwältigend sein kann und definitiv gewöhnungsbedürftig ist. Es ist auch möglich, Projektionen in Abfragen zu verwenden, sodass Sie nur die Felder zurückgeben können, die Sie interessieren, und die Gesamtergebnisgröße über die Leitung verringern können.