MongoDB verwendet nicht den verfügbaren Speicher
Ich experimentiere mit MongoDB für den Umgang mit einem extrem großen Datensatz, mit dem ich Abfragen durchführen möchte, und ich bin auf ein Problem gestoßen, das wie ein Konfigurationsproblem aussieht, aber ich scheine es nicht herauszufinden.
Die Einrichtung
Ich habe derzeit 4 Maschinen in meinem Cluster und alle haben die gleichen Spezifikationen (2 x 8-Core Xeon E5-2667 @ 3,5 GHz, 512 GB Ram, 100 Gbit / s Infiniband-Netzwerk). Ich verwende 1 Maschine als meinen "Client" und die anderen drei als Mongodb-Cluster. Ich verwende den Docker-Container für mongodb auf allen Cluster-Computern. Ein mögliches Problem ist die Tatsache, dass auf den Maschinen kein lokal angeschlossener Speicher vorhanden ist. Der gesamte Speicher wird über Ceph über das 100-Gbit / s-Infiniband bereitgestellt.
Ich habe etwas geschummelt und den Router und den Konfigurationsserver auf den gleichen Computer wie den ersten Mongodb-Knoten gestellt. Die anderen beiden Maschinen haben nur den Mongodb-Knoten. Da die Daten bereits über Ceph repliziert wurden, entschied ich mich, die Datenbank zu shardieren und jeden Knoten als Shard mit einem Replikatsatz einzurichten, von dem jeder nur eine Maschine hat. (Vielleicht ist dies ein Teil meines Problems, aber es hat für mich Sinn gemacht)
Ich sollte auch erwähnen, dass alle meine Anfragen / Inserts vom Client mit Pymongo ausgeführt werden.
Die Daten
Der Datensatz, den ich habe, ist ein Bündel von Zeitreihendaten. In den Daten gibt es überhaupt keine Beziehungen, daher scheint es ideal für eine No-SQL-Typ-DB zu sein. Ich versuche nur, einen Teil der Daten einzufügen, etwa 550 Datenpunkte pro Zeitschritt und etwa 600 Millionen Zeitschritte. Ich habe die Datenbank auf ein Feld aufgeteilt, das die Daten in etwa 86.000 Segmente unterteilt, so dass ich das für eine gute Wahl hielt.
Ich hatte keine Probleme beim Einfügen der Daten, die Datenbank war nicht der Engpass, der limitierende Faktor war, wie schnell mein Client die vorhandenen Dateien verarbeiten konnte (diese befinden sich derzeit in csvs).
Die Angelegenheit
Nachdem ich alle Dokumente eingefügt hatte, betrug die Datenbankgröße etwa 1,4 TB. Zwischen den 3 Knoten habe ich 1,5 TB Speicher, aber mit Overhead, Docker-Containern usw. Ich habe nicht erwartet, dass der gesamte Datensatz in den Speicher passt, aber es hätte nahe sein sollen. Wenn ich jedoch die Knoten anschaue, verwendet jeder nur irgendwo zwischen 100 GB und 150 GB Speicher. Das scheint mir falsch zu sein, ich dachte, Mongo würde so viel von der Datenbank in den Speicher einbauen. Ich habe keine Ressourcenlimits für Mongo oder Docker festgelegt.
Wenn ich ein indiziertes Feld abfrage, erhalte ich eine sehr schnelle Antwort, die zu erwarten ist. Zum Start habe ich nur das Feld indiziert, für das ich gesplittet wurde. Später fügte ich einen weiteren Index hinzu. Es dauerte eine Weile, bis ich nicht wusste, wie lange ich ihn für das Wochenende laufen ließ.
Wenn ich eine Abfrage mache, die ein nicht indiziertes Feld berührt, dauert es immer, ich habe es über Nacht laufen lassen und noch immer keine Ergebnisse erhalten.
Ich finde es seltsam, dass, wenn ich mir die Mongo-Knoten anschaue, nur ein Kern arbeitet, vielleicht bei etwa 50% Last, der Speicher immer noch weitgehend leer ist und das Netzwerk kaum genutzt wird (~ 10 MBit / s, was mich glauben lässt.) dieser Ceph ist nicht der Engpass).
Ich könnte also mehr Knoten hinzufügen, aber anscheinend scheint die Hardware nicht der Engpass zu sein. Darüber hinaus weiß ich nicht einmal, wie viel Zeit, Sekunden, Minuten oder Stunden eine angemessene Abfragezeit sein soll. Ich habe das Gefühl, wenn sich die meisten Daten im Speicher befinden, sollte dies nicht Stunden dauern.
Ich habe einfach das Gefühl, etwas zu verpassen, also dachte ich, ich würde versuchen, herauszufinden, ob es offensichtlich war oder ob ich einfach zu viel oder die falschen Dinge erwarte. Vielen Dank für jede Hilfe, die Sie geben können, ich würde es sehr schätzen.
Config Files
Hier sind die Docker-Compose-Dateien, die ich für jeden Knoten verwende.
Knoten 1:
version: '3' services: mongosn1: container_name: mongosn1 image: mongo hostname: snode1 extra_hosts: - "snode1:10.0.2.107" - "snode2:10.0.2.108" - "snode3:10.0.2.109" - "cfgnode1:10.0.2.107" - "rtnode1:10.0.2.107" command: mongod --shardsvr --replSet mongors1 --dbpath /data/db --port 27019 --smallfiles ports: - "27019:27019" expose: - "27019" volumes: - /mnt/work/db/mongo/data/shard1:/data/db - /etc/localtime:/etc/localtime:ro mongocfg1: container_name: mongocfg1 image: mongo hostname: cfgnode1 extra_hosts: - "snode1:10.0.2.107" - "snode2:10.0.2.108" - "snode3:10.0.2.109" - "cfgnode1:10.0.2.107" - "rtnode1:10.0.2.107" command: mongod --configsvr --replSet mongors1conf --dbpath /data/db -- port 27018 --smallfiles ports: - "27018:27018" expose: - "27018" volumes: - /etc/localtime:/etc/localtime:ro - /mnt/work/db/mongo/data/config1:/data/db mongort1: container_name: mongort1 image: mongo hostname: rtnode1 depends_on: - mongocfg1 extra_hosts: - "snode1:10.0.2.107" - "snode2:10.0.2.108" - "snode3:10.0.2.109" - "cfgnode1:10.0.2.107" - "rtnode1:10.0.2.107" command: mongos --configdb mongors1conf/cfgnode1:27018 --port 27017 -- bind_ip 0.0.0.0 ports: - "27017:27017" expose: - "27017" volumes: - /etc/localtime:/etc/localtime:ro
Knoten 2:
version: '3' services: mongosn1: container_name: mongo image: mongo hostname: snode2 extra_hosts: - "snode1:10.0.2.107" - "snode2:10.0.2.108" - "snode3:10.0.2.109" - "cfgnode1:10.0.2.107" - "rtnode1:10.0.2.107" command: mongod --shardsvr --replSet mongors2 --dbpath /data/db --port 27017 --smallfiles ports: - "27017:27017" volumes: - /mnt/work/db/mongo/data/shard2:/data/db - /etc/localtime:/etc/localtime:ro
Knoten 3:
version: '3' services: mongosn1: container_name: mongo image: mongo hostname: snode3 extra_hosts: - "snode1:10.0.2.107" - "snode2:10.0.2.108" - "snode3:10.0.2.109" - "cfgnode1:10.0.2.107" - "rtnode1:10.0.2.107" command: mongod --shardsvr --replSet mongors3 --dbpath /data/db --port 27017 --smallfiles ports: - "27017:27017" volumes: - /mnt/work/db/mongo/data/shard3:/data/db - /etc/localtime:/etc/localtime:ro
0 Antworten auf die Frage
Verwandte Probleme
-
1
MongoDB-Befehlszeilen-Tool
-
2
Bitte erläutern Sie diese Mongo-Statistiken
-
1
Bash-Skripthilfe | MongoDB
-
1
mongoexport csv-Ausgabefeldwerte
-
2
.tgz-Datei - tar: Nicht erkanntes Archivformat
-
0
MongoDB PHP Treiberinstallationsproblem in Red Hat Linux
-
0
Wie deinstalliere ich MongoDB unter MacOSX?
-
1
MongoDB in einem Debian-Konflikt installieren
-
4
sudo apt-key adv - keyserver keyserver.ubuntu.com --recv Der Befehl 7F0CEB10 gibt einen Fehler zurüc...
-
1
Warum nutzt Journaling so viel Platz in Mongodb?