Mongo Map-Reduce oder Sharding?

7

Also habe ich diese Frage gestellt:

Mongo mit Clustering einrichten

Aber ich wusste nicht genug, bis ich die Antworten gelesen und mehr recherchiert hatte. Ist es besser, Map-Reduce oder Sharding für schnelllebige Systeme mit ~ 100 Abfragen zu verwenden, die alle gleichzeitig gestellt werden? Durch das Sharding werden meine Daten über Cluster hinweg verschoben, und es scheint, dass im Wesentlichen eine Kartenreduzierung oder -sortierung durchgeführt wird. Wenn ich für solche Abfragen Map-Reduce verwenden würde, sollte ich dies auch mit einem Cluster tun? Wenn ja, wie einfach ist es, mit einem Mongo-Server zu beginnen und später einen Cluster zu verwenden und die Aufgaben zur Kartenreduzierung an den Cluster zu verteilen? Oder bin ich verwirrt in dem, was ich zu erreichen glaube?

WildBill
quelle
Ich möchte Ihnen weitere 250 Wiederholungen spenden, nachdem Sie eine Antwort darauf erhalten haben. Wenn Sie eine Frage hier gut beantworten, gebe ich Ihnen auch 250.
Jcolebrand
Soweit ich weiß, können Sie ein einzelnes Shard-System ausführen. Wenn Sie dann ein zweites Shard hinzufügen, wird es mit weniger Konfiguration verteilt. Dies ist jedoch aus einem bestimmten Grund ein Kommentar, da ich mir da nicht 100% sicher bin.
Jcolebrand
Das Abfragen des Sharded Distributed Systems führt im Wesentlichen eine MapReduce-Aktion durch, wenn Sie die Daten reduzieren oder zuordnen müssen. Es ist jedoch möglich, eine Abfrage durchzuführen, die MapReduce nicht über einen Shard hinweg erstellt.
Jcolebrand

Antworten:

6

Es ist unklar, was Sie unter dem Vergleich von Kartenreduzierung und Sharding verstehen. Aber die kurze Antwort lautet: Scherben .

Wenn Sie kartenreduzierende Abfragen entwerfen, möchten Sie nicht, dass Hunderte von kartenreduzierten Abfragen gleichzeitig ausgeführt werden. Sie würden mongo nur überladen, da dies im Wesentlichen bedeutet, dass Hunderte von vollständigen Sammlungsscans alle gleichzeitig ausgeführt werden.

Wenn Sie ein Beispiel für eine Ihrer vorhandenen Abfragen zur Kartenreduzierung haben, fügen Sie es bitte Ihrer Frage hinzu.

In Bezug auf das Sharding kommt es darauf an, was Sie für den Sharding-Schlüssel verwenden.

Wenn Sie beispielsweise eine Benutzersammlung unter dem Benutzernamen speichern,

db.users.find()

wird Mongos veranlassen, die Abfrage an alle Shards zu senden und die Ergebnismengen (intelligent) zusammenzuführen. Hinzufügen des Sharding-Schlüssels zur Abfrage:

db.users.find().sort({username: 1}).limit(100);

würde Mongos die Möglichkeit geben, mit weniger Mongod gleichzeitig zu sprechen.

Ein besseres Beispiel, wenn Sie Folgendes abfragen:

db.users.find({username: /^bob/})

Mongos senden die Abfrage an die Shards, deren Shard-Schlüssel darauf hinweisen, dass sie Antworten enthalten könnten, höchstwahrscheinlich nur einen Server. Dies führt zu einer schnellen Abfrage und ohne zusätzliche Belastung seitens der Mongos.

Vielleicht sind die obigen Beispiele für Sie keine Neuigkeit.

Die Abfragen, die Sie jetzt an mongo senden, haben dieselbe Syntax, die Sie zum Senden an eine Sharded-Datenbank verwenden würden. Das einzige, was Sie anders machen würden, ist (zuvor) zu analysieren, welche Schlüssel zu sharden sind, damit Sie bei Bedarf Ihre Abfragen so ändern können, dass sie den Sharding-Schlüssel enthalten, und damit Mongos wie ein Proxy anstelle eines Agregators agieren können.

Ein schlechter Sharding-Schlüssel oder das Ausnutzen des Shardings in den von Ihnen generierten Abfragen würde dazu führen, dass Mongos alle Mongod-Server nach allen Abfragen abfragen müssen, was zu einer hohen Auslastung und einer schlechten Leistung führt.

AD7six
quelle