2 Stimmen

Mongodb sharding auto-erhöhung shard-schlüssel

Nachdem ich die Dokumentation zu Sharding, Shard-Keys und Chunk-Migration gelesen habe, verstehe ich immer noch ein Konzept nicht.

Jeder, der das Konzept beschreibt, warum man KEINEN auto-inkrementellen Shard-Key wählen sollte, sagt mir, dass dies darauf zurückzuführen ist, dass MongoDB immer auf den gleichen Shard schreiben wird, und daher die Belastung erhöht wird, da dieser Shard sowohl aufeinanderfolgende Schreibvorgänge als auch Chunks migrieren wird.

Meine Frage ist, warum ist das so? Warum wird ein auto-inkrementierter Wert dazu führen, dass Schreibanfragen immer an einen bestimmten Shard geroutet werden? Sollte nicht der Sinn des Sharding sein, dass mongos sich dessen bewusst sein sollten, auf welchem Shard "am wenigsten" balanciert ist und stattdessen auf diesen Shard schreiben sollten, oder verstehe ich das falsch?

Vielen Dank im Voraus

3voto

James Gan Punkte 6408

Der aktuelle Shard-Mechanismus hat dieses Problem. Grundsätzlich wird jeder Shard Daten bedienen, deren Schlüssel in aufeinanderfolgenden Bereichen liegt. Wenn wir einen automatisch inkrementierenden Schlüssel wählen, werden alle Schreibvorgänge nur an einen Shard geroutet, der Daten mit einem Schlüssel bedient, der größer ist als alle anderen Shards.

Dies ist ein Problem für Sammlungen mit automatisch inkrementellem Schlüssel. Glücklicherweise können wir jeden beliebigen Attribut als Shardingschlüssel wählen. In den meisten Fällen sind wir nicht gezwungen, "_id" als Sharding-Schlüssel zu verwenden. Wenn ein Objekt ein geeignetes Attribut hat, wie z.B. "Benutzername" für eine Blog-Anwendung, können wir es als Sharding-Schlüssel verwenden. Wenn kein geeignetes Attribut vorhanden ist, können wir jedem Objekt eine Attributspalte als Sharding-Schlüssel hinzufügen. Dieses Attribut kann mithilfe eines einfachen Hash-Algorithmus berechnet werden. Zum Beispiel, wenn wir ein autoinkrementelles _id haben, können wir den Shardingschlüssel so einfach berechnen:

sharding_key = _id % 257

Der obige Hash sollte ausreichen, bevor Sie mehr als 257 Shards haben.

Übrigens ist die automatisch generierte Objekt-ID keine gute Wahl für den Sharding-Schlüssel, da sie zeitbasiert ist.

Es gibt auch eine neue Funktion in MongoDB 2.3 zur Unterstützung von Hash-Schlüsseln (Siehe https://jira.mongodb.org/browse/SERVER-2001 und MongoDB 2.4 Versionshinweis).

2voto

Vladimir Perevalov Punkte 4009

Das Problem ist, dass Mongo keine Schlüsselbereiche für das Sharding festlegen kann, wenn Sie monoton steigende Schlüssel verwenden. Hier ist ein Beispiel:

Angenommen, Sie haben eine Sammlung mit den Schlüsseln 10,20,30,40,50,60 Wenn Mongo zwei Shards erstellen muss, kann es die Schlüsselbereiche als: [10,30] und [31,60] (oder ähnlich) annehmen. Aber wenn Sie weiterhin größere Schlüssel schreiben, werden sie immer in den zweiten Bereich gehen. Mongo wird die Bereiche anpassen, aber es kann nie wissen, was der nächste Schlüssel sein wird, und er wird immer in den letzten Bereich gelangen. Andererseits, wenn Sie einen Schlüssel mit guter Verteilung verwenden, wird Ihre Schreibfolge mehr wie folgt aussehen: 10, 60, 30, 40, 50... Und direkt nach dem Schreiben der ersten beiden Schlüssel wird Mongo die obigen Bereiche erstellen, und Ihre nächsten Schlüssel werden entweder in den ersten oder den zweiten passen. Dies führt zu einer besseren Leistung der Verteilung unter den Mongos und zwingt Mongo nicht zum Neuausgleich.

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