Einrichten und Optimieren einer MongoDB auf öffentlichen Cloud-Servern

Die Tage, in denen die MongoDB als das ’new kid on the block‘ galt, sind schon lange vorbei. Damals war MongoDB die „Go-to“-Lösung für viele, die relationale Datenbanken hinter sich lassen wollten. Im folgenden Artikel soll es nicht darum gehen, warum Sie MongoDB anstelle von {andere NoSQL-Datenbank einfügen} nutzen sollten oder warum Sie eine NoSQL-Datenbank statt einer relationalen Datenbank verwenden sollten. Ich gehe einfach davon aus, dass Sie Ihre Due Diligence erledigt haben und entschieden haben, dass die MongoDB für Sie am besten passt.

Lassen Sie uns zunächst einen Schritt zurück machen und einen Blick auf die verschiedenen Komponenten der MongoDB werfen. Um es nicht zu kompliziert zu machen, lassen wir fortgeschrittene Themen wie Sharding dabei außen vor.

Wenn Sie eine MongoDB in der Produktion einführen, sollten Sie einen sogenannten Replikatsatz verwenden. abei handelt es sich um das Äquivalent einer MongoDB zu einem Master-/Slave-Setup in der relationalen Welt. Im Gegensatz dazu ist die Einrichtung allerdings sehr unkompliziert, da alles bereits integriert ist.

Planung Ihres MongoDB-Cloud-Server-Clusters

Um einen Replikatsatz einzurichten, benötigen Sie drei Knoten (oder alternativ zwei Knoten und einen Arbiter). Diese Knoten können mehr oder weniger beliebige Betriebssysteme ausführen. Im folgenden Leitfaden verwenden wir Ubuntu 14.04. Die meisten dieser Tipps passen jedoch für alle Linux-Distributionen. Es ist auch wichtig, dass Sie allen die gleichen Ressourcen zuordnen, da jede von ihnen die primäre werden kann (MongoDB-Ausdruck für ‚Master‘).

Bei einem Replikatsatz geht es einzig und allein darum, dass der Cluster überleben soll, sollte ein einzelner Knoten ausfallen. Daher wäre es ziemlich sinnlos, wenn sich alle Server auf dem gleichen physischen Host befinden. Glücklicherweise bieten wir so genannte Verfügbarkeitsgruppen an. Das bedeutet, dass Sie unser System anweisen können, alle drei Ihrer Server in verschiedene Gruppen einzuordnen. Auf diese Weise werden sie sich nie auf dem gleichen physischen Host befinden. Nähere Informationen hierzu finden Sie hier.

Es ist auch wichtig, dass Sie eine 64-Bit-Version von Linux verwenden. Der Grund dafür ist einfach, dass die MongoDB nicht gut mit 32-Bit-Systemen zurechtkommt (mehr dazu hier).

Installation der MongoDB in der Cloud

Dieser Abschnitt ist ziemlich einfach. Entweder verwenden Sie eines der vorkonfigurierten Ubuntu 14.04-Images oder Sie installieren es selbst.

Die Konfiguration von CPU, RAM und Festplatte hängt von Ihrer Last ab. Für eine kleinere Installation sollten 4 Ghz CPU, 4 GB RAM und 40 GB Festplatte (für das System) ausreichen. Stellen Sie sicher, dass Sie VirtIO verwenden, wenn Sie Ihre Festplatten anschließen. Wenn Sie IDE verwenden, wird die Performance erheblich beeinträchtigt. Da wir einen Replikatsatz erstellen, müssen außerdem alle Knoten (und App-Server) auf demselben VLAN vorliegen.
Contrary to many other cloud vendors, there’s no need to configure your storage with RAID10 or similar to improve performance. Since we don’t use any magnetic disks (only SSD), you’ll get amazing performance out-of-the-box.

Im Gegensatz zu vielen anderen Cloud-Anbietern besteht keine Notwendigkeit, Ihren Speicher mit RAID10 oder ähnlich zu konfigurieren, um die Performance zu verbessern. Da wir keine Magnetplatten (nur SSD) verwenden, ist außerordentliche Performance Standard.

Wir empfehlen Ihnen jedoch, Ihre MongoDB-Daten auf einem separaten Laufwerk zu speichern. Der Grund dafür ist einfach: Sie müssen einige Dateisystem-Optimierungen vornehmen, die Sie sicher nicht für Ihr gesamtes Dateisystem durchführen wollen.

n diesem Sinne ist es am einfachsten, dieses Laufwerk erst hinzuzufügen, wenn Sie Ihre Server eingerichtet haben. Zunächst sollten Sie sich nur auf die Systeminstallation konzentrieren. Wenn Sie es selbst installieren (anstatt die vorkonfigurierten Systeme zu verwenden), empfehle ich, dass Sie F4 im Startmenü drücken und ‚Install a minimal virtual machine‘ auswählen.

Verbinden Sie Ihr Datenlaufwerk, sobald Sie mit der Installation fertig sind. Seine Größe hängt stark von Ihrer Nutzung ab. Für ein kleines System sollten 20 GB ausreichend sein. Da es jedoch manchmal schwer ist vorherzusagen, wie viele Daten gespeichert werden sollen, verwenden wir LVM. So können Sie einfach später ein anderes Laufwerk hinzufügen, ohne von vorn anfangen zu müssen. Alternativ können Sie ein einziges Laufwerk nutzen und später mit `resize2fs` skalieren.

Wenn Laufwerk mit dem System verbunden ist (erscheint als `/dev/vdb`), können wir dieses Laufwerk optimal einstellen. Zuerst müssen wir das Laufwerk initiieren. Sie können Ihr bevorzugtes Werkzeug nutzen; ich bevorzuge fdisk. Mit fdisk müssen Sie einfach das hier ausführen:

[bash] $ sudo fdisk /dev/vdb
[/bash]

Die Navigation innerhalb von fdisk ist auch ziemlich einfach:

Command (m for help): n <enter>
Select (default p): <enter>
Partition number (1-4, default 1): <enter>
First sector (x-y, default x): <enter>
Last sector, +sectors or +size{K,M,G} (x-y, default y): <enter>
Command (m for help): w

Wenn die Platte partitioniert ist, müssen wir den LVM-Pool erstellen. Das ist unkompliziert. Ersetzen Sie ‚N‘ im Befehl ‚lvcreate‘ durch die Größe Ihrer Festplatte.

[bash] $ sudo pvcreate /dev/vdb1
$ sudo vgcreate mongodb /dev/vdb1
$ sudo lvcreate -n db -L Ng mongodb
[/bash]

Nach dem Ausführen der oben genannten Befehle, haben Sie nun ein neues Gerät namens `/dev/mongodb/db` erstellt. Jetzt müssen Sie dieses Gerät mit ext4 formatieren (besser nicht ext3, da es viel langsamer ist). Führen Sie dazu einfach Folgendes aus:

[bash] $ sudo mkfs.ext4 /dev/mongodb/db
[/bash]

Wir sind jetzt fast fertig mit dem Setup. Jetzt muss nur noch der Mount-Punkt erstellt, die Platte zu fstab hinzugefügt und abschließend die Platte gemounted werden. Auf geht’s:

[bash] $ sudo mkdir /mongodb
$ echo -e ‚/dev/mongodb/dbt/mongodbtext4tdefaults,auto,noatime,noexec,nodiratimet0t0‘ | sudo tee -a /etc/fstab
$ sudo mount /mongodb
[/bash]

Installieren von MongoDB

Wenn das System so vorbereitet wurde, kann die Installation der MongoDB erfolgen. Wir empfehlen, statt der Ubuntu-Version die offizielle MongoDB-Version, da das Ubuntu-Repository mit den Releases ziemlich weit hinterherhinkt. Wenn Sie das Beste aus der MongoDB herausholen möchten, sollten Sie sich an die offiziellen Releases halten.

Da die MongoDB ein eigenes Repository anbietet, können wir es einfach zu unserem System hinzufügen und dann MongoDB wie gewohnt installieren:

[bash] $ sudo apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv 7F0CEB10
$ echo &amp;amp;quot;deb http://repo.mongodb.org/apt/ubuntu &amp;amp;quot;$(lsb_release -sc)&amp;amp;quot;/mongodb-org/3.0 multiverse&amp;amp;quot; | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
$ sudo apt-get update
$ sudo apt-get install -y mongodb-org
[/bash]

Angenommen, Sie hatten keine Probleme mit der Ausführung dieser Befehle, sollten Sie jetzt die MongoDB auf Ihrem System installiert haben. Jetzt müssen wir sie konfigurieren, um die Daten auf dem Laufwerk, das wir oben erstellt haben, zu speichern.

[bash] $ sudo service mongodb stop
$ sudo mkdir /mongodb/data
$ sudo chown -R mongodb:mongodb /mongodb/data
$ sudo sed -i ’s/dbpath=/var/lib/mongodb/dbpath=/mongodb/data/g‘ /etc/mongodb.conf
$ sudo service mongodb start
[/bash]

Die MongoDB sollte jetzt fertig sein und laufen, wobei die Daten auf dem Laufwerk gespeichert sind, das wir erstellt haben. Wenn Sie mit hohen Lasten und/oder vielen Verbindungen rechnen, müssen Sie möglicherweise die ulimit-Werte erhöhen.

Wenn Sie mehr Einblick in Ihre Daten erhalten möchten, können Sie sich auch für MMSvon MongoDB anmelden, einen kostenlosen cloudbasierten Überwachungsdienst für MongoDB.

Erstellen des Replikatsatzes für Ihre MongoDB-Cloud

Bevor wir mit dem Einrichten des Replikatsatzes beginnen können, müssen wir sicherstellen, dass alle drei Knoten im internen Netzwerk miteinander kommunizieren können. Die Einstellung, die dies ermöglicht, hängt von der Verteilung und der Struktur Ihres Netzwerks ab. Die entsprechenden Anweisungen für Ubuntu finden Sie hier.

Ich gehe davon aus, dass Sie Ihr Netzwerk jetzt richtig eingerichtet haben. Der Einfachheit halber nehmen wir an, dass Sie die Server mongo0, mongo1 und mongo2 benannt haben. Weiterhin gehe ich davon aus, dass entweder ein DNS-Setup vorgenommen oder die Einträge zu `/etc/hosts` hinzugefügt haben, so dass sie einander per Name auflösen und an pingen.

Wenn Sie die Firewall aktiviert haben (was Sie wirklich tun sollten), stellen Sie sicher, dass die Knoten TCP-Traffic auf der internen Schnittstelle auf Port 28017 und 27017 senden und empfangen können.

Wenn das alles erledigt ist, müssen wir jetzt die MongoDB konfigurieren, um sie als Replikatsatz zu verwenden. Hierzu sind zwei Schritte erforderlich: Zuerst müssen wir der MongoDB sagen, dass sie Teil eines Replikatsatzes ist (und ihr einen Namen geben) und zweitens müssen wir den Replikatsatz initiieren.

Beginnen wir mit der Aktivierung der Replikatsatzfunktion und rufen unseren Replikatsatz ‚MyReplSet‘ auf:

[bash] $ echo -e ‚replSet = MyReplSet‘ | sudo tee -a /etc/mongodb.conf
$ sudo service mongodb restart
[/bash]

Die MongoDB „weiß“ jetzt, dass sie Teil eines Replikatsatzes ist. Dies muss auf allen Knoten im Cluster gemacht werden.

Anschließend müssten wir den Replikatsatz initiieren. Dies geschieht im MongoDB-Interpreter. Es kann von jedem Knoten aus durchgeführt werden, aber in diesem Beispiel machen wir es von ‚mongo0‘ aus.

[bash] $ mongo
[/bash]

Innerhalb des MongoDB-Interpreters müssen wir die beiden anderen Knoten zum Replikatsatz hinzufügen:

> rs.initiate()
> rs.add('mongo1')
> rs.add('mongo2')

Sie können den Status mit dem Kommando `rs.status()` überwachen.

Das war’s dann aber auch wirklich. Ihr MongoDB-Cluster sollte jetzt auf unserer superschnellen Cloud laufen.

About Viktor Petersson

Former VP of Business Development at CloudSigma. Currently CEO at WireLoad and busy making a dent in the Digital Signage industry with Screenly. Viktor is a proud geek and loves playing with the latest technologies.