Schritt-für-Schritt-Anleitung: Bereitstellung eines grundlegenden MongoDB-Sharded-Clusters
Stellen Sie einen grundlegenden MongoDB-Sharded-Cluster mit Konfigurationsservern, Shard-Replica-Sets, mongos-Routern und Sharding-Verifizierung bereit.
Schritt-für-Schritt-Anleitung: Bereitstellung eines grundlegenden MongoDB-Sharded-Clusters
MongoDB, eine beliebte NoSQL-Dokumentendatenbank, zeichnet sich durch die Verarbeitung großer Datenmengen mit hoher Leistung und Flexibilität aus. Wenn die Daten jedoch wachsen, kann ein einzelner Server oder ein Replica-Set an seine Skalierungsgrenzen stoßen. Hier kommt Sharding ins Spiel, das horizontale Skalierbarkeit ermöglicht, indem Daten auf mehrere Server (Shards) verteilt werden.
Diese Anleitung führt Sie durch ein grundlegendes MongoDB-Sharded-Cluster auf localhost zu Lernzwecken. Sie konfigurieren Konfigurationsserver, Shard-Replica-Sets und einen mongos-Router und aktivieren dann Sharding für eine Sammlung.
Grundlegendes zu MongoDB-Sharded-Clustern
Ein MongoDB-Sharded-Cluster besteht aus drei Hauptkomponenten, die zusammenarbeiten, um Daten zu verteilen und weiterzuleiten:
- Shard-Replica-Sets: Dies sind die eigentlichen datentragenden Knoten. Jeder Shard ist ein Replica-Set, um Hochverfügbarkeit und Datenredundanz zu gewährleisten. Die Daten werden auf diese Shards aufgeteilt.
- Konfigurationsserver (Config Servers): Diese speichern die Metadaten des Clusters, einschließlich der Zuordnung von Datenblöcken zu Shards. Ab MongoDB 3.2 müssen Konfigurationsserver als Replica-Set (CSRS - Config Server Replica Set) für Hochverfügbarkeit und Konsistenz bereitgestellt werden.
mongos-Router: Diese fungieren als Abfrage-Router und bieten eine Schnittstelle für Client-Anwendungen. Einemongos-Instanz leitet Client-Operationen basierend auf den Metadaten des Clusters an den/die entsprechenden Shard(s) weiter. Anwendungen verbinden sich mitmongos, nicht direkt mit den Shards.
Konzeptionelles Diagramm eines MongoDB-Sharded-Clusters (Bildnachweis: Offizielle MongoDB-Dokumentation)
Voraussetzungen
Stellen Sie vor Beginn sicher, dass Folgendes vorhanden ist:
- Mehrere Maschinen/VMs: Für ein wirklich verteiltes Sharded-Cluster benötigen Sie mindestens 6-9 Maschinen/VMs/Docker-Container. Für dieses grundlegende Tutorial können wir dies auf einer einzelnen Maschine mit verschiedenen Ports simulieren, aber denken Sie daran, dass eine Produktionsumgebung dedizierte Ressourcen erfordert.
- 3 für Konfigurationsserver (configSrv01, configSrv02, configSrv03)
- Mindestens 2-3 für jeden Shard (z. B. Shard01-RS01, Shard01-RS02, Shard01-RS03; Shard02-RS01, ...)
- 1+ für
mongos-Router
- MongoDB-Installation: Installieren Sie eine unterstützte MongoDB-Serverversion auf jeder Maschine, die
mongododermongoshosten wird. Verwenden Siemongoshfür Shell-Befehle. - Netzwerk: Stellen Sie sicher, dass alle Maschinen über die erforderlichen Ports miteinander kommunizieren können (Standard
27017,27018,27019,27020für Konfigurationsserver, Shards bzw.mongosoder benutzerdefinierte Ports). - Verzeichnisstruktur: Erstellen Sie dedizierte Daten- und Log-Verzeichnisse für jede
mongod- undmongos-Instanz.
Der Einfachheit halber verwenden wir in dieser Anleitung localhost mit verschiedenen Ports und Verzeichnissen. In einer Produktionsumgebung würden Sie tatsächliche Hostnamen oder IP-Adressen verwenden.
Empfohlene Verzeichnisstruktur (Beispiel für localhost-Setup)
mkdir -p /data/db/configdb01 /data/db/configdb02 /data/db/configdb03
mkdir -p /data/db/shard01-rs01 /data/db/shard01-rs02 /data/db/shard01-rs03
mkdir -p /data/db/shard02-rs01 /data/db/shard02-rs02 /data/db/shard02-rs03
mkdir -p /data/log/config /data/log/shard01 /data/log/shard02 /data/log/mongos
Bereitstellungsschritte
Schritt 1: Einrichten von Konfigurationsservern (Config Replica Set)
Konfigurationsserver speichern Metadaten für das Sharded-Cluster. Sie müssen als Replica-Set ausgeführt werden.
Starten Sie
mongod-Instanzen für Konfigurationsserver: Jede Instanz benötigt die Optionen--configsvrund--replSet.# Config Server 1 mongod --configsvr --replSet cfgReplSet --dbpath /data/db/configdb01 --port 27019 --bind_ip localhost --logpath /data/log/config/configdb01.log --fork # Config Server 2 mongod --configsvr --replSet cfgReplSet --dbpath /data/db/configdb02 --port 27020 --bind_ip localhost --logpath /data/log/config/configdb02.log --fork # Config Server 3 mongod --configsvr --replSet cfgReplSet --dbpath /data/db/configdb03 --port 27021 --bind_ip localhost --logpath /data/log/config/configdb03.log --forkTipp: Ersetzen Sie für die Produktion
localhostdurch tatsächliche IP-Adressen oder Hostnamen.Initialisieren Sie das Config Replica Set: Verbinden Sie sich mit einer der Konfigurationsserver-Instanzen und initialisieren Sie das Replica-Set.
mongosh --port 27019Innerhalb der Mongo-Shell:
rs.initiate({ _id: "cfgReplSet", configsvr: true, members: [ { _id : 0, host : "localhost:27019" }, { _id : 1, host : "localhost:27020" }, { _id : 2, host : "localhost:27021" } ] });Überprüfen Sie den Status:
rs.status();
Schritt 2: Einrichten von Shard-Replica-Sets
Jeder Shard im Cluster ist ein Replica-Set. Wir werden zwei Shards (shard01 und shard02) einrichten, jeder mit drei Mitgliedern.
Starten Sie
mongod-Instanzen für Shard 1-Mitglieder: Jede Instanz benötigt die Optionen--shardsvrund--replSet.# Shard 1 Member 1 mongod --shardsvr --replSet shard01 --dbpath /data/db/shard01-rs01 --port 27030 --bind_ip localhost --logpath /data/log/shard01/shard01-rs01.log --fork # Shard 1 Member 2 mongod --shardsvr --replSet shard01 --dbpath /data/db/shard01-rs02 --port 27031 --bind_ip localhost --logpath /data/log/shard01/shard01-rs02.log --fork # Shard 1 Member 3 mongod --shardsvr --replSet shard01 --dbpath /data/db/shard01-rs03 --port 27032 --bind_ip localhost --logpath /data/log/shard01/shard01-rs03.log --forkInitialisieren Sie das Shard 1 Replica Set: Verbinden Sie sich mit einer der Shard 1-Instanzen.
mongosh --port 27030Innerhalb der Mongo-Shell:
rs.initiate({ _id : "shard01", members: [ { _id : 0, host : "localhost:27030" }, { _id : 1, host : "localhost:27031" }, { _id : 2, host : "localhost:27032" } ] });Starten Sie
mongod-Instanzen für Shard 2-Mitglieder (für zusätzliche Shards wiederholen):# Shard 2 Member 1 mongod --shardsvr --replSet shard02 --dbpath /data/db/shard02-rs01 --port 27040 --bind_ip localhost --logpath /data/log/shard02/shard02-rs01.log --fork # Shard 2 Member 2 mongod --shardsvr --replSet shard02 --dbpath /data/db/shard02-rs02 --port 27041 --bind_ip localhost --logpath /data/log/shard02/shard02-rs02.log --fork # Shard 2 Member 3 mongod --shardsvr --replSet shard02 --dbpath /data/db/shard02-rs03 --port 27042 --bind_ip localhost --logpath /data/log/shard02/shard02-rs03.log --forkInitialisieren Sie das Shard 2 Replica Set: Verbinden Sie sich mit einer der Shard 2-Instanzen.
mongosh --port 27040Innerhalb der Mongo-Shell:
rs.initiate({ _id : "shard02", members: [ { _id : 0, host : "localhost:27040" }, { _id : 1, host : "localhost:27041" }, { _id : 2, host : "localhost:27042" } ] });
Schritt 3: Einrichten von mongos-Routern
mongos-Instanzen sind die Einstiegspunkte für Client-Anwendungen. Sie müssen wissen, wo sich die Konfigurationsserver befinden.
Starten Sie
mongos-Instanzen: Geben Sie die Option--configdban, die die Mitglieder des Config-Replica-Sets auflistet.# Mongos Router 1 mongos --configdb cfgReplSet/localhost:27019,localhost:27020,localhost:27021 --port 27017 --bind_ip localhost --logpath /data/log/mongos/mongos01.log --forkHinweis: Sie können mehrere
mongos-Instanzen für Lastverteilung und Hochverfügbarkeit starten. Sie verbinden sich alle mit denselben Konfigurationsservern.
Schritt 4: Mit mongos verbinden und Shards hinzufügen
Verbinden Sie sich nun mit einer mongos-Instanz und fügen Sie die Shard-Replica-Sets zum Cluster hinzu.
Mit
mongosverbinden: Verwenden Sie den Standard-MongoDB-Port27017oder den benutzerdefinierten Port, den Sie fürmongosangegeben haben.mongosh --port 27017Shards hinzufügen: Verwenden Sie den Befehl
sh.addShard(), der den Replica-Set-Namen und eines seiner Mitglieder angibt.sh.addShard("shard01/localhost:27030"); sh.addShard("shard02/localhost:27040");
Schritt 5: Sharding für eine Datenbank und Sammlung aktivieren
Sobald Shards hinzugefügt wurden, müssen Sie Sharding für bestimmte Datenbanken und dann für bestimmte Sammlungen innerhalb dieser Datenbanken aktivieren. Dies erfordert die Auswahl eines Shard-Keys.
Sharding für eine Datenbank aktivieren: Wechseln Sie zur Datenbank, die Sie sharden möchten, und führen Sie
sh.enableSharding()aus.use mydatabase; sh.enableSharding("mydatabase");Eine Sammlung sharden: Wählen Sie einen
Shard-Keyund verwenden Siesh.shardCollection().Warnung: Die Wahl eines effektiven Shard-Keys ist entscheidend für Leistung und gleichmäßige Verteilung. Ein schlechter Shard-Key kann zu Hotspots oder ineffizienten Abfragen führen. Übliche Strategien sind gehashte Keys, bereichsbasierte Keys oder zusammengesetzte Keys.
Für dieses Beispiel nehmen wir eine Sammlung
mycollectionmit einem Feld_idan.sh.shardCollection("mydatabase.mycollection", { _id: "hashed" });Ein gehashter
_id-Shard-Key ist für ein Tutorial einfach, da er Einfügungen besser über Shards verteilt als ein monoton steigender bereichsbasierter_id-Key. Wählen Sie für eine echte Anwendung den Shard-Key basierend auf Ihren Abfragemustern und der Schreibverteilung, nicht nur aus Bequemlichkeit.
Schritt 6: Überprüfen des Clusters
Führen Sie diese Befehle von mongosh aus, das mit mongos verbunden ist:
sh.status();
db.adminCommand({ listShards: 1 });
Fügen Sie dann Beispieldokumente ein und überprüfen Sie, ob die shardierte Sammlung existiert:
use mydatabase;
db.mycollection.insertMany([
{ _id: 1, name: "alpha" },
{ _id: 2, name: "beta" },
{ _id: 3, name: "gamma" }
]);
db.mycollection.getShardDistribution();
Kleine Testdatensätze werden möglicherweise nicht sofort aufgeteilt, erwarten Sie also keine perfekte Verteilung nach nur wenigen Dokumenten. Die erste wichtige Überprüfung ist, dass sh.status() beide Shards auflistet und mydatabase.mycollection als shardiert anzeigt.
Produktionshinweise
Dieses localhost-Setup ist nützlich, um die Komponenten kennenzulernen, aber die Produktion erfordert mehr Sorgfalt:
- Verwenden Sie echte Hostnamen, nicht
localhost, da Replica-Set-Mitgliedsnamen in den Cluster-Metadaten gespeichert werden. - Führen Sie Konfigurationsserver als Drei-Mitglieder-Replica-Set aus.
- Führen Sie jeden Shard als Replica-Set mit Mitgliedern aus, die über Ausfallsicherheitsdomänen verteilt sind.
- Aktivieren Sie die Authentifizierung und interne Keyfile- oder x.509-Authentifizierung, bevor Sie den Cluster freigeben.
- Sichern Sie die Metadaten der Konfigurationsserver und die Shard-Daten als Teil eines clusterbewussten Backup-Plans.
- Überwachen Sie die Chunk-Verteilung, die Balancer-Aktivität, die Replikationsverzögerung und das Festplattenwachstum.
Abschließende Erkenntnisse
Ein MongoDB-Sharded-Cluster hat drei Aufgaben: Konfigurationsserver verfolgen Metadaten, Shard-Replica-Sets speichern Daten und mongos leitet den Client-Verkehr weiter. Bringen Sie diese Rollen zuerst zum Laufen, dann verbringen Sie den größten Teil Ihrer Entwurfszeit mit dem Shard-Key, da diese Wahl bestimmt, ob Ihr Cluster die Last sauber verteilt oder heiße Shards erzeugt.