2 Stimmen

Wie sollte ich meinen MongoDB-Cluster konfigurieren?

Ich betreibe eine partitionierte MongoDB-Umgebung - 3 mongod-Shards, 1 mongod-Konfiguration, 1 mongos (keine Replikation).

Ich möchte mongoimport verwenden, um CSV-Daten in die Datenbank zu importieren. Ich habe 105 Millionen Datensätze in Inkrementen von 500.000 in 210 CSV-Dateien gespeichert. Ich verstehe, dass mongoimport single-threaded ist und habe gelesen, dass ich mehrere mongoimport-Prozesse ausführen sollte, um bessere Leistungen zu erzielen. Allerdings habe ich das versucht und keine Geschwindigkeitssteigerung festgestellt:

Beim Ausführen von 3 mongoimports parallel erhielt ich etwa 6.000 Inserts/Sekunde pro Prozess (also 18.000 i/s), während ich beim Ausführen von 1 mongoimport etwa 20.000 Inserts/Sekunde erhielt.

Da diese Prozesse durch die einzelne mongod-Konfiguration und mongos geroutet wurden, frage ich mich, ob dies an meiner Cluster-Konfiguration liegt. Meine Frage ist, ob ich durch eine andere Cluster-Konfiguration bessere mongoimport-Geschwindigkeiten erzielen kann. Brauche ich mehr mongos-Prozesse? Wie viele mongoimport-Prozesse sollte ich gleichzeitig starten?

4voto

Gates VP Punkte 44457

Also, das erste, was Sie tun müssen, ist, Ihre Chunks "voraufzuteilen".

Angenommen, Sie haben bereits die Sammlung geschartet, in die Sie importieren. Wenn Sie "von Grund auf" beginnen, wird alle Daten auf einem einzelnen Knoten landen. Sobald dieser Knoten voll ist, wird MongoDB anfangen, diesen Knoten in Chunks zu unterteilen. Sobald es sich um etwa 8 Chunks handelt (das sind etwa 8x64MB Indexplatz), wird es anfangen, Chunks zu migrieren.

Grundsätzlich schreiben Sie also effektiv auf einen einzelnen Knoten und dann wird dieser Knoten verlangsamt, weil er seine Daten zu den anderen Knoten lesen und schreiben muss.

Deshalb sehen Sie keine Beschleunigung bei 3 mongoimport. Alle Daten gehen immer noch an einen einzelnen Knoten und Sie erreichen die maximale Durchsatzrate dieses Knotens.

Der Trick hierbei besteht darin, die Daten "voraufzuteilen". In Ihrem Fall würden Sie es wahrscheinlich so einrichten, dass Sie auf jede Maschine ungefähr 70 Dateien Daten erhalten. Dann können Sie diese Dateien auf verschiedenen Threads importieren und eine bessere Durchsatzrate erzielen.

Jeremy Zawodny von Craigslist hat dazu eine vernünftige Erklärung hier. Die MongoDB-Website hat hier einige Dokumente hier.

1voto

vhold Punkte 11

Ich habe festgestellt, dass einige Dinge bei Massenladungen helfen.

Aufbau von Indizes aufschieben (außer für den auf dem Shard-Schlüssel erforderlichen) bis nachdem Sie alles geladen haben.

Führen Sie einen mongos und mongoimport pro Shard aus und laden Sie parallel.

Und der größte Verbesserungsvorschlag: Voraufteilen Ihrer Chunks. Das ist ein wenig knifflig, da Sie herausfinden müssen, wie viele Chunks Sie benötigen und wie die Daten ungefähr verteilt sind. Nach dem Aufteilen müssen Sie auf den Distributor warten, der sie alle verschiebt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X