11. Dezember 2023

MongoDB in kleinen Umgebungen laufen lassen

Gepostet am 11. Dezember 2023  •  6 Minuten  • 1161 Wörter  • Andere Sprachen:  English

Ich mag MongoDB sehr gerne und habe die Datenbank in den letzten 12 Jahren in einer Vielzahl von Projekten verwendet. So basiert MemArc beispielsweise seit seinen Anfängen auf MongoDB und ich habe diese Entscheidung niemals bereut.

In diesem Artikel gehe ich auf einige Optionen ein und erkläre, wie man Mongo in kleinen Umgebungen wie virtuellen Maschinen oder Raspberry Pis einrichten kann. Ich habe keine wirklich guten Anleitungen für diesen speziellen Anwendungsfall gefunden, also habe ich mein eigenes Tutorial verfasst.

Warum?

Warum sollte man Mongo in einer kleinen Umgebung einrichten wollen? Hier einige Ideen:

Vorbereitungen und Vorüberlegungen

Ich nehme an, dass Mongo-Datenbank auf irgendeine Weise eingerichtet wurde, entweder als Einzelserver oder als Replica Set. Es gibt viele Anleitungen im Internet dazu. Als Referenz kann außerdem die Installationsanleitung auf der Mongo Website dienen. Es spielt keine Rolle, ob der Server direkt oder als Container (Docker oder Podman) eingerichtet wurde.

In der Grundkonfiguration verhält sich Mongo folgendermaßen:

Replica Set oder nicht?

Sollten man in kleinen Umgebungen ein Replikatsatz verwenden? Nun, das hängt vom Anwendungsfall ab. Ich betreibe einige kleine Instanzen als eigenständige Server, und kann ziemlich ruhig schlafen. Ich erstelle einmal täglich ein Backup und schiebe es auf eine entfernten Maschine. Diese Instanzen sind weder geschäftskritisch noch enthalten sie viele veränderliche Daten. Und bei solchen kleinen Datensätzen sind Backups nicht wirklich umständlich, daher ist der Betrieb als einzelne Node in einem solchen Szenario meiner Meinung nach völlig in Ordnung. In den letzten 12 Jahren habe ich nie Daten auf einer Mongo-Maschine aufgrund von Softwarefehlern oder einer Beschädigung der Datenbank verloren, ich habe da durchaus Vertrauen in den Speichermechanismus von Mongo. Wenn man Replikation verwendet, sollte man sicher stellen, dass die Instanzen auf verschiedenen Maschinen laufen und die Speicherung auf unterschiedlichen physischen Speicherorten erfolgt. Andernfalls macht ein Replica Set nicht viel Sinn, außer dass es Upgrades auf der zugrunde liegenden Infrastruktur erleichtert.

Kurz, man benötigt kein Replica Set, wenn:

Wenn eine dieser Bedingungen nicht erfüllt ist, sollte man die Verwendung eines Replica Sets erwägen. Es sollte dann halt korrekt eingerichtet sein (mehrere Server, verschiedene Speicherorte usw.)!

RAM-Benutzung anpassen

Wer eine begrenzte Menge an RAM zur Verfügung hat, dem hilft die wichtigste Option des Tages: wiredTigerCacheSizeGB. In den meisten Szenarien ist ausreichend, diesen Parameter zu setzen. Der einfachste Weg erfolgt über die Kommandozeile: Starten Sie Ihren Mongo-Server einfach mit --wiredTigerCacheSizeGB 0.5, um den Cache auf 0,5 GB RAM zu begrenzen. Das Minimum beträgt 0,25 GB (was für sehr kleine Datensätze völlig ausreichend ist).

Alternativ kann der Parameter auch in der Konfigurationsdatei festgelegt werden (normalerweise /etc/mongod.conf):

storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 0.5

Weitere Informationen dazu in der offiziellen Dokumentation .

Wer diesen Wert sehr niedrig setzt, sollte verstehen, dass die Cachegröße recht begrenzt sein wird. Wenn die Datensätze wachsen, kann diese zu Performanceproblemen führen. Wer lediglich einige tausend Datensätze verwaltet, muss sich darüber in der Regel keine Gedanken machen.

Um sicher zu gehen, kann man seine Insanz(en) auf der Mongo Shell nach ihrem Befinden befragen:

db.serverStatus().tcmalloc.tcmalloc.formattedString

Dies erzeugt eine hübsche Übersicht über die aktuelle Benutzung des Speichers. Weitere Parameter können in der Dokumentation abgefragt werden.

Weitere Einstellungen

Es gibt noch einige weitere Einstellungen, die man anpassen kann. Meistens mache ich mir nicht die Mühe, sie für kleine Datensätze oder Server zu ändern. Der Vollständigkeit halber seien sie hier jedoch aufgeführt.

Als erstes sollte man über den virtuellen Speicher nachdenken und wie er auf der Maschinen gehandhabt wird. Die “dirty ratio” ist der Prozentsatz des gesamten Systemspeichers, der “schmutzige Speicherseiten” halten kann, bevor diese auf die Festplatte gebannt werden. Viele Anleitungen empfehlen für MongoDB Folgendes (in der Datei /etc/sysctl.conf oder via sysctl):

vm.dirty_background_ratio = 5
vm.dirty_ratio = 15

swappiness ist eine weitere Einstellung. Damit beeinflusst man, wie eifrig Speicherseiten auf die Festplatte auslagert werden. Die folgende Einstellung wird im Allgemeinen für Datenbankserver empfohlen (1 bedeutet, den Auslagerungsspeicher nur zu verwenden, um Probleme mit nicht ausreichendem Arbeitsspeicher (OOM) zu vermeiden):

vm.swappiness = 1

Mongo kann sich beim Start auch über die NUMA (Non-Uniform Access)-Architektur oder die Verwendung von “Transparent HugePages” beschweren. Informationen dazu finden Sie in der Dokumentation. Bei NUMA muss man den Mongo-Prozess mit numactl --interleave=all starten. Transparent HugePages können über eine Einstellung in Grub deaktiviert werden (transparent_hugepage=never).

Mongo wird sich auch beschweren, wenn man auf seinem Linux-Server kein XFS verwendet. WiredTiger und EXT4 haben einige Randprobleme in Bezug auf die Leistung. Bei kleinen Projekten würde ich mir darüber allerdings keine Gedanken machen. Wer keine Möglichkeit hat, eine hübscge XFS-Partition auf seinem virtuellen Server einzurichten, muss dies also nicht tun. Das gleiche gilt für Instanzen, die nicht auf einer SSD laufen. Kleine Instanzen laufen ohne Probleme auf der SD-Karte eines Raspis oder auf einem USB-Stick (würg).

Alle Optionen und Dinge, an die man denken sollte, befinden sich in der Dokumentation zum Betrieb von Mongo .

Fazit

Es ist völlig in Ordnung, MongoDB auf einem kleinen Server oder einer virtuellen Maschine mit sehr begrenztem Speicher laufen zu lassen. Solange die Datenmenge klein ist, gibt es in der Regel keine Probleme. Die wichtigste Einstellung in einer solchen Umgebung ist die Befehlszeilenoption wiredTigerCacheSizeGB. Sie ist Ihr Freund, um Mongo so anzupassen, dass es nicht zu viel Speicher verbraucht. Über die weiteren Einstellungen kann man sich Gedanken machen, muss man aber nicht.

Durch die Einloggen bei den Kommentaren werden zwei Cookies gesetzt. Mehr Informationen im Impressum.
Follow me