Die Installation von MongoDB ist der erste Schritt von der Theorie zur Praxis. Während die vorherigen Kapitel Konzepte und Architekturen erklärten, wird es jetzt konkret: Eine funktionierende MongoDB-Instanz auf einem Linux-System aufsetzen, konfigurieren und erste Operationen durchführen. Diese Anleitung orientiert sich an Ubuntu, aber die Prinzipien gelten mit minimalen Anpassungen für alle gängigen Linux-Distributionen.
Wir installieren zunächst eine einzelne Standalone-Instanz – das einfachste Deployment-Modell. Dies eignet sich hervorragend für lokale Entwicklung, Experimente und erste Schritte. Später werden wir Replica Sets und Sharded Clusters aufsetzen, aber der Anfang ist bewusst schlicht. Eine funktionierende Standalone-Instanz ist die Basis für alles Weitere.
Bevor MongoDB installiert wird, sollte das System aktuell sein. Veraltete Systempakete können zu Inkompatibilitäten oder subtilen Bugs führen. Die Aktualisierung ist mit zwei Befehlen erledigt:
sudo apt update && sudo apt upgrade -yDer erste Befehl (apt update) aktualisiert die
Paketlisten – Ubuntu erfährt, welche Versionen von Software verfügbar
sind. Der zweite Befehl (apt upgrade) installiert
tatsächlich die Updates. Das -y-Flag bestätigt automatisch
alle Nachfragen, was in Scripts nützlich ist.
Diese Aktualisierung kann je nach Zustand des Systems einige Minuten dauern. Wichtige System-Libraries wie glibc oder OpenSSL werden dabei oft aktualisiert. Ein Neustart ist danach empfehlenswert, wenn Kernel-Updates dabei waren, aber nicht zwingend notwendig für MongoDB.
Ubuntu’s Standard-Repositories enthalten MongoDB, aber oft veraltete Versionen. Ubuntu 20.04 LTS liefert etwa MongoDB 3.6 aus – eine Version von 2018, die längst End-of-Life ist. Für produktive Arbeit und um aktuelle Features zu nutzen, brauchen wir die offiziellen MongoDB-Repositories.
MongoDB signiert seine Pakete mit einem GPG-Key. Dieser Key stellt sicher, dass Pakete tatsächlich von MongoDB Inc. stammen und nicht manipuliert wurden. Der Import des Keys ist der erste Schritt:
wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add -Dieser Befehl lädt den Public Key für MongoDB 7.0 herunter und fügt
ihn zum System-Keyring hinzu. Das -qO - in wget bedeutet:
leise downloaden und auf stdout ausgeben. Die Pipe leitet dies zu
apt-key add, das den Key installiert.
Mit dem Key vorhanden können wir das Repository selbst hinzufügen. Die Repository-URL ist distributionsspezifisch – Ubuntu 20.04 (“Focal”), 22.04 (“Jammy”) und 24.04 (“Noble”) haben unterschiedliche Repositories. Für Ubuntu 22.04 wäre der Befehl:
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.listDiese Zeile erstellt eine neue Datei in
/etc/apt/sources.list.d/ – dem Verzeichnis, wo Ubuntu
zusätzliche Paketquellen speichert. Die Datei enthält die URL zum
MongoDB-Repository, spezifiziert für Jammy (Ubuntu 22.04) und MongoDB
7.0. Die arch=amd64,arm64-Angabe bedeutet, dass dieses
Repository sowohl für x86_64- als auch ARM64-Systeme funktioniert.
Nach dem Hinzufügen des Repositories muss apt seine Paketlisten neu einlesen:
sudo apt updateApt kontaktiert nun das MongoDB-Repository, lädt die Paketlisten
herunter und integriert sie in seine Datenbank. Sollten Fehler auftreten
– etwa “GPG error” oder “repository not found” – sind typischerweise der
Key nicht korrekt importiert oder die URL falsch. Ein
apt-key list | grep MongoDB zeigt, ob der Key vorhanden
ist.
Mit dem Repository konfiguriert ist die eigentliche Installation trivial:
sudo apt install -y mongodb-orgDieses Meta-Paket installiert eine Handvoll Komponenten:
mongodb-org-server (mongod selbst),
mongodb-org-mongos (der Sharding-Router),
mongodb-org-shell (die Shell, mittlerweile mongosh),
mongodb-org-tools (mongodump, mongorestore und andere
Utilities) und mongodb-org-database-tools-extra
(zusätzliche Tools).
Die Installation dauert typischerweise unter einer Minute. Apt lädt
die Pakete herunter, entpackt sie, installiert Binaries nach
/usr/bin/, Konfigurationen nach /etc/, und
richtet einen systemd-Service ein. Nach Abschluss ist MongoDB
installiert, aber noch nicht gestartet.
Sollte die Installation fehlschlagen mit Abhängigkeitsproblemen, ist
oft libssl betroffen. MongoDB benötigt eine spezifische OpenSSL-Version.
Ubuntu 20.04 und 22.04 sind kompatibel, aber bei älteren oder neueren
Versionen kann es zu Konflikten kommen. Ein
apt-cache policy libssl1.1 zeigt die verfügbare
Version.
MongoDB ist installiert, läuft aber noch nicht. Der systemd-Service muss manuell gestartet werden:
sudo systemctl start mongodDieser Befehl ist synchron – er kehrt zurück, sobald mongod gestartet ist. Sollte der Start fehlschlagen, gibt systemctl einen Fehlercode zurück. Die erste Anlaufstelle für Troubleshooting ist der Service-Status:
sudo systemctl status mongodEin erfolgreich gestartetes MongoDB zeigt “active (running)” in grüner Farbe. Die letzten Log-Zeilen sind ebenfalls sichtbar und sollten etwas wie “Waiting for connections on port 27017” enthalten. Sollte der Status “failed” zeigen, geben die Logs Hinweise. Typische Probleme sind:
Das Datenverzeichnis /var/lib/mongodb existiert nicht
oder hat falsche Permissions. MongoDB läuft unter dem User
mongodb, und dieser muss Schreib- und Lesezugriff haben.
Ein sudo chown -R mongodb:mongodb /var/lib/mongodb
korrigiert dies meist.
Der Port 27017 ist bereits belegt – ein anderer Prozess lauscht
darauf. Ein sudo netstat -tlnp | grep 27017 zeigt, wer den
Port hält. Oft ist es eine alte MongoDB-Instanz, die nicht sauber
beendet wurde. Ein Kill des Prozesses und erneuter Start löst dies.
Die Konfigurationsdatei /etc/mongod.conf hat
Syntaxfehler. MongoDB startet nicht, wenn die YAML-Syntax inkorrekt ist.
Ein YAML-Validator kann helfen, oder einfach die Default-Config
wiederherstellen.
Wenn MongoDB läuft, sollte es beim Systemstart automatisch starten. Dies erreichen wir mit:
sudo systemctl enable mongodDieser Befehl erstellt einen Symlink, der systemd anweist, mongod beim Booten zu starten. Ein Reboot-Test bestätigt, dass dies funktioniert – nach dem Neustart sollte MongoDB ohne manuelle Intervention laufen.
Mit laufendem MongoDB ist der nächste Schritt die Verbindung. Die
moderne Shell ist mongosh (MongoDB Shell), die die alte
mongo-Shell seit Version 5.x ersetzt:
mongoshOhne weitere Parameter verbindet mongosh sich mit localhost:27017 – den MongoDB-Defaults. Die Shell zeigt einen Willkommenstext, die MongoDB-Version, und einen Prompt:
Current Mongosh Log ID: 65a1b2c3d4e5f6g7h8i9j0k1
Connecting to: mongodb://127.0.0.1:27017/?directConnection=true
Using MongoDB: 7.0.5
Using Mongosh: 2.1.1
test>
Dieser Prompt zeigt die aktuelle Datenbank – “test” ist der Default. Von hier können wir erste Befehle absetzen:
// MongoDB-Version anzeigen
db.version()
// Verfügbare Datenbanken listen
show dbs
// Eine neue Datenbank erstellen durch Nutzung
use handson
// Ein Dokument einfügen
db.testcollection.insertOne({
message: "Hello MongoDB",
timestamp: new Date(),
author: "Hands-On Tutorial"
})
// Das eingefügte Dokument abfragen
db.testcollection.find()Diese einfachen Operationen verifizieren, dass MongoDB funktioniert.
Das insertOne sollte erfolgreich sein und eine
acknowledged: true-Response zurückgeben, zusammen mit der
generierten _id. Das find() sollte das
Dokument zurückgeben.
Sollte die Verbindung fehlschlagen mit “connection refused”, läuft
MongoDB entweder nicht (Status prüfen) oder lauscht nicht auf dem
erwarteten Port/Interface. Die /etc/mongod.conf definiert
net.bindIp – standardmäßig 127.0.0.1, also nur
localhost. Für Remote-Verbindungen muss dies angepasst werden, aber für
lokale Tests ist der Default korrekt.
Die Konfigurationsdatei /etc/mongod.conf steuert
MongoDB’s Verhalten. Sie ist in YAML geschrieben und in thematische
Sektionen gegliedert. Ein unmodifiziertes Default-Config sieht ungefähr
so aus:
# Speicher-Konfiguration
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
# Logging
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# Netzwerk
net:
port: 27017
bindIp: 127.0.0.1
# Prozess-Management
processManagement:
timeZoneInfo: /usr/share/zoneinfoDie wichtigsten Parameter für erste Schritte:
Der dbPath definiert, wo MongoDB Daten speichert. Der
Standard /var/lib/mongodb ist sinnvoll, aber wenn mehr
Speicherplatz auf einem anderen Volume verfügbar ist, kann man dies
ändern. Nach der Änderung muss das Verzeichnis existieren und dem
mongodb-User gehören.
Die bindIp definiert, auf welchen Netzwerkinterfaces
MongoDB lauscht. 127.0.0.1 bedeutet nur localhost –
Verbindungen von anderen Maschinen werden abgelehnt. Für Entwicklung auf
einem Remote-Server oder für Anwendungen, die von anderen Hosts
verbinden, muss dies auf 0.0.0.0 geändert werden (lauscht
auf allen Interfaces) oder auf spezifische IPs. Achtung:
0.0.0.0 ohne Authentifizierung ist ein Sicherheitsrisiko.
Kapitel 35 behandelt User-Management.
Der port ist normalerweise 27017. Änderungen sind nur
nötig, wenn mehrere MongoDB-Instanzen auf demselben Server laufen oder
wenn 27017 bereits belegt ist.
Nach jeder Änderung an der Config muss MongoDB neugestartet werden:
sudo systemctl restart mongodEin Neustart bedeutet kurze Downtime – Sekunden typischerweise, aber bestehende Verbindungen werden getrennt. Für Produktionssysteme sollten Config-Änderungen geplant werden.
Manchmal ist es nützlich, mehrere MongoDB-Instanzen auf demselben Host zu betreiben – etwa um Replica Sets lokal zu simulieren oder verschiedene Versionen zu testen. Der systemd-Service managed nur eine Instanz, aber MongoDB kann auch manuell gestartet werden.
Für eine zweite Instanz brauchen wir ein separates Datenverzeichnis und einen anderen Port:
# Verzeichnis erstellen
mkdir -p ~/mongodb-data/instance1
mkdir -p ~/mongodb-data/instance2
# Erste Instanz starten (Vordergrund, für Tests)
mongod --port 27017 --dbpath ~/mongodb-data/instance1
# In neuem Terminal: Zweite Instanz
mongod --port 27018 --dbpath ~/mongodb-data/instance2Diese Befehle starten MongoDB im Vordergrund – die Shell bleibt
blockiert, Logs erscheinen direkt. Dies ist ideal für Experimente, wo
man Logs live sehen will. Für Hintergrund-Betrieb fügt man
--fork hinzu und muss dann auch --logpath
angeben:
mongod --port 27017 \
--dbpath ~/mongodb-data/instance1 \
--logpath ~/mongodb-data/instance1/mongod.log \
--forkDer --fork-Parameter weist mongod an, sich in den
Hintergrund zu forken. Der Elternprozess terminiert, das Kind läuft
weiter. Die PID wird ausgegeben – notieren, um den Prozess später zu
stoppen.
Verbindungen zu diesen Instanzen spezifizieren explizit den Port:
# Zu Instanz auf 27017 verbinden
mongosh --port 27017
# Zu Instanz auf 27018 verbinden
mongosh --port 27018Jede Instanz ist völlig isoliert – separate Datenbanken, separate Users, separate Collections. Änderungen in einer betreffen die andere nicht. Dies ist nützlich, um verschiedene Szenarien parallel zu testen oder um lokale Replica-Set-Experimente durchzuführen (Kapitel 17 behandelt dies im Detail).
Das Stoppen manuell gestarteter Instanzen erfolgt über die Shell oder direktes Kill des Prozesses:
// In mongosh verbunden mit der Instanz
use admin
db.shutdownServer()Oder direkt per Signal:
# PID finden
ps aux | grep mongod
# Graceful Shutdown mit SIGTERM
kill -TERM <pid>
# Forciertes Kill nur im Notfall
kill -9 <pid>Ein graceful Shutdown ist wichtig – SIGTERM gibt MongoDB Zeit, aktive Operationen abzuschließen und sauber zu beenden. SIGKILL (-9) terminiert sofort, was zu inkonsistentem Zustand führen kann. Nach einem Kill-9 startet MongoDB beim nächsten Start in Recovery-Mode und replayed das Journal.
MongoDB ist gesprächig. Die Logs in
/var/log/mongodb/mongod.log enthalten wertvolle
Informationen über Startup, laufende Operationen und Probleme. Nach dem
Start zeigt das Log typischerweise:
{"t":{"$date":"2024-01-15T10:23:45.123Z"},"s":"I", "c":"CONTROL", "id":23403, "ctx":"main","msg":"Build Info","attr":{"version":"7.0.5"}}
{"t":{"$date":"2024-01-15T10:23:45.234Z"},"s":"I", "c":"STORAGE", "id":22297, "ctx":"initandlisten","msg":"Using the XFS filesystem is strongly recommended with the WiredTiger storage engine"}
{"t":{"$date":"2024-01-15T10:23:45.345Z"},"s":"I", "c":"NETWORK", "id":23015, "ctx":"listener","msg":"Listening on","attr":{"address":"127.0.0.1:27017"}}
{"t":{"$date":"2024-01-15T10:23:45.456Z"},"s":"I", "c":"NETWORK", "id":23016, "ctx":"listener","msg":"Waiting for connections"}
Die Logs sind im JSON-Format, was maschinelle Verarbeitung erleichtert. Wichtige Felder:
"s" ist die Severity: “I” für Info, “W” für Warning, “E”
für Error. Warnings sollten beachtet, Errors umgehend adressiert
werden.
"c" ist die Komponente: “STORAGE” für
Storage-Engine-Messages, “NETWORK” für Netzwerk-Events, “QUERY” für
Query-Logs.
"msg" ist die eigentliche Message. “Waiting for
connections” bedeutet, MongoDB ist bereit. “Connection accepted”
erscheint bei jeder neuen Verbindung.
Sollten Probleme auftreten, sind die Logs die erste Anlaufstelle. Ein häufiges Warning: “Using the XFS filesystem is strongly recommended with the WiredTiger storage engine”. Dies erscheint, wenn MongoDB auf ext4 oder anderen Dateisystemen läuft. Es ist ein Hinweis, keine Blockade, aber für Produktion sollte XFS verwendet werden (siehe Kapitel 11).
Für Debugging kann die Log-Verbosity erhöht werden:
// In mongosh
db.setLogLevel(2, "query") // Detaillierte Query-LogsDies erzeugt deutlich mehr Output – jede Query wird geloggt mit Execution-Plan und Timing. Nützlich für Performance-Analysen, aber zu viel für normalen Betrieb. Nach dem Debugging sollte es zurückgesetzt werden:
db.setLogLevel(0, "query") // Zurück zu StandardEine Standalone-Instanz ist funktional, aber nicht produktionsreif. Kapitel 17 führt Replica Sets ein – der Standard für jedes produktive Deployment. Ein Replica Set bietet Hochverfügbarkeit und automatisches Failover, Eigenschaften, die eine Standalone-Instanz nicht hat.
Für jetzt aber ist das Ziel erreicht: MongoDB läuft, akzeptiert Verbindungen, und erste CRUD-Operationen funktionieren. Die Basis für alles Weitere steht. Die folgenden Kapitel bauen darauf auf und führen schrittweise in fortgeschrittenere Konzepte ein.