2013-05-04 7 views
5

Ich kann das Shard-Schlüssel-Konzept in einem MongoDB Sharded Cluster nicht wirklich verstehen, da ich gerade angefangen habe, MongoDB zu lernen.Relation zwischen Shardschlüsseln und Chunks in MongoDB sharded cluster?

die Dokumentation MongoDB Unter Hinweis:

A chunk ist ein zusammenhängender Bereich von Schlüsselwerte Scherbe auf eine insbesondere Scherbe zugeordnet. Wenn sie über die konfigurierte Chunk-Größe hinaus wachsen, spaltet ein Mongo den Chunk in zwei Chunks auf.

Es scheint, dass die Chuck-Größe etwas mit einem bestimmten Shard zu tun hat, nicht mit dem Cluster selbst. Habe ich recht?

Sprechen über die Mächtigkeit einer Scherbe Schlüssel:

Betrachten wir die Verwendung eines Zustandsfeldes als Scherbe Schlüssel:

Der Wert des Statusschlüssel hält den US-Staat für einen bestimmten Adressdokument. Dieses Feld hat eine niedrige Kardinalität, da alle Dokumente, die den gleichen Wert im Feld haben, sich auf demselben Shard befinden müssen, auch wenn ein bestimmter Zustand Chunk die maximale Chunk-Größe überschreitet.

Da es eine begrenzte Anzahl möglicher Werte für das Statusfeld gibt, kann MongoDB Daten ungleichmäßig auf eine kleine Anzahl von festen Chunks verteilen.

Meine Frage ist, wie sich der Shard-Schlüssel auf die Chunk-Größe bezieht.

Es scheint mir, dass, mit nur zwei Shard-Servern, es nicht möglich wäre, die Daten zu verteilen, weil gleichen Wert im Statusfeld auf dem gleichen Shard befinden müssen. Mit drei Dokumenten mit Staaten wie Arizona, Indiana und Maine, wie Daten unter nur zwei Shards verteilt werden?

Antwort

0

Es gibt definitiv eine Beziehung zwischen Shard-Schlüssel und Chunk-Größe. Sie möchten einen Shard-Schlüssel mit hoher Kardinalität wählen. Das heißt, Sie möchten einen Shard-Schlüssel, der viele mögliche Werte haben kann, im Gegensatz zu etwas wie State, das im Grunde nur in 50 möglichen Werten gesperrt ist. Shard-Schlüssel mit niedriger Kardinalität können zu Chunks führen, die nur aus einem der Shard-Schlüsselwerte bestehen und daher in einem Balancing-Vorgang nicht geteilt und in einen anderen Shard verschoben werden können.

Hohe Kardinalität des Shard-Schlüssels (wie die Telefonnummer einer Person im Gegensatz zu ihrem Staat oder Postleitzahl) ist wichtig, um eine gleichmäßige Verteilung der Daten zu gewährleisten. Shard-Schlüssel mit niedriger Kardinalität können zu größeren Blöcken führen (weil Sie zusammenhängende Werte haben, die zusammengehalten werden müssen), die nicht geteilt werden können.

5

Um die Antwort auf Ihre Frage zu verstehen, müssen Sie die bereichsbasierte Partitionierung verstehen. Wenn Sie N Dokumente haben, werden diese in Chunks partitioniert. Die Art und Weise, wie die Splitpunkte ermittelt werden, basiert auf Ihrem Shard Key.

Da der Shard-Schlüssel ein Feld in Ihrem Dokument ist, werden alle möglichen Werte des Shard-Schlüssels berücksichtigt und alle Dokumente werden (logisch) in Chunks/Bereiche aufgeteilt, je nachdem, welcher Wert der Shard-Schlüssel eines Dokuments ist.

In Ihrem Beispiel gibt es 50 mögliche Werte für "state" (okay, wahrscheinlich eher wie 52), so dass es höchstens 52 Chunks geben kann. Die Standard-Chunk-Größe beträgt 64 MB. Stellen Sie sich nun vor, Sie sammeln eine Sammlung mit zehn Millionen Dokumenten, die jeweils 1K groß sind. Jeder Chunk sollte nicht mehr als 65 KB Dokumente enthalten. Zehn Millionen Dokumente sollten in mehr als 150 Chunks aufgeteilt werden, aber wir haben nur 52 verschiedene Werte für den Shard-Schlüssel! Deine Brocken werden also sehr groß sein. Warum ist das ein Problem? Nun, um den Chunk zwischen Shards automatisch auszugleichen, muss das System Chunks zwischen Shards migrieren und wenn der Chunk zu groß ist, kann er nicht verschoben werden. Und da es nicht geteilt werden kann, werden Sie mit unausgewogenem Cluster stecken bleiben.

Verwandte Themen