MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB-Shards und unausgeglichene Aggregationslasten

Das Aggregations-Framework ist ein wichtiges Rädchen in der MongoDB-Infrastruktur. Es hilft Ihnen, die in MongoDB gespeicherten Daten zu analysieren, zusammenzufassen und zu aggregieren. Weitere Informationen zum Aggregationsframework in MongoDB 2.6 finden Sie in diesem Blogpost.

In Version 2.6 hat MongoDB die Art und Weise, wie die zugrunde liegenden Aggregationspipelines in einer fragmentierten Umgebung ausgeführt werden, subtil, aber signifikant geändert. Beim Arbeiten mit fragmentierten Sammlungen teilt MongoDB die Pipeline in zwei Phasen auf. Die erste Stufe oder die „$match“-Phase läuft auf jedem Shard und selektiert die relevanten Dokumente. Wenn der Abfrageplaner basierend auf den Shard-Schlüsseln feststellt, dass ein Shard nicht relevant ist, wird diese Phase nicht auf diesem Shard ausgeführt.

Die nachfolgenden Phasen werden nur auf dem „primären“ Shard für die Sammlung ausgeführt. Dieser Shard führt die Daten der anderen Shards zusammen und führt den Rest der Pipeline aus. Dies führt zu einer erheblich höheren Belastung des primären Shards der Sammlung, die aggregiert wird. Hier ist ein Beispiel von einem unserer Kunden, der drei Shards ausführt und hauptsächlich Aggregationsabfragen verwendet:

Wie Sie sehen, ist die Last auf dem ersten Shard durchgängig 3-4 mal so hoch wie der andere Grund. Dies ist ein extremes Beispiel, da dies der Fall ist, wenn der zweite und der dritte Shard später hinzugefügt wurden, daher ist der primäre Shard für alle Sammlungen der erste Shard. Im Wesentlichen laufen die nachfolgenden Phasen aller unserer Aggregationsjobs also nur auf Shard1. Wenn Sie die Protokolle auf dem primären Shard untersuchen, sehen Sie eine Reihe von „Merge“-Befehlen, die Daten von den anderen Shards abrufen.

Vor 2.6 liefen die nachfolgenden Phasen der Aggregationspipeline auf Ihren MongoDB-Servern und nicht auf dem primären Shard.

Wie gehen Sie also mit dieser ungleichmäßigen Lastverteilung um? Sie haben mehrere Möglichkeiten:

  1. Wenn Sie Aggregationen für mehrere Sammlungen ausführen, stellen Sie sicher, dass die „primären Shards“ der Sammlungen gleichmäßig über Ihre Shards verteilt sind.
  2. Wenn Sie eine hohe Aggregationslast auf nur einer Sammlung haben, müssen Sie möglicherweise etwas größere Computer für Ihr primäres Shard verwenden.

Wenn Sie Fragen oder Kommentare haben, senden Sie uns bitte wie immer eine E-Mail an [email protected].