sql >> Database >  >> NoSQL >> MongoDB

MongoDB-scherven en ongebalanceerde aggregatieladingen

Het aggregatieraamwerk is een essentieel radertje in de MongoDB-infrastructuur. Het helpt u bij het analyseren, samenvatten en aggregeren van de gegevens die zijn opgeslagen in MongoDB. Raadpleeg deze blogpost voor meer informatie over het aggregatieframework in MongoDB 2.6.

In de 2.6-release heeft MongoDB een subtiele maar belangrijke wijziging aangebracht in de manier waarop de onderliggende aggregatiepipelines worden uitgevoerd in een shard-omgeving. Bij het werken met shard-collecties splitst MongoDB de pijplijn in twee fasen. De eerste fase of de "$match"-fase wordt uitgevoerd op elke shard en selecteert de relevante documenten. Als de queryplanner op basis van de shardsleutels bepaalt dat een shard niet relevant is, wordt deze fase niet op die shard uitgevoerd.

De volgende fasen worden alleen uitgevoerd op de 'primaire' shard voor de verzameling. Deze shard voegt de gegevens van de andere shards samen en voert de rest van de pijplijn uit. Dit resulteert in aanzienlijk meer belasting op de primaire scherf van de verzameling die wordt geaggregeerd. Hier is een voorbeeld van een van onze klanten die drie shards uitvoert en voornamelijk aggregatiequery's gebruikt:

Zoals je ziet, is de belasting van de eerste shard consequent 3-4 keer de andere reden. Dit is een extreem voorbeeld, aangezien dit voor het geval de tweede en derde shard later zijn toegevoegd, dus de primaire shard voor alle collecties de eerste shard is. Dus in wezen draaien de volgende fasen van al onze aggregatietaken alleen op Shard1. Als u de logboeken op de primaire shard bekijkt, ziet u een aantal "samenvoeg"-opdrachten die gegevens ophalen uit de andere shards.

Vóór 2.6 werden de volgende fasen van de aggregatiepijplijn gebruikt op uw MongoDB-servers en niet op de primaire shard.

Hoe ga je om met deze ongelijke verdeling van de belasting? Je hebt een aantal opties:

  1. Als u aggregaties uitvoert voor meerdere collecties, zorg er dan voor dat de 'primaire shards' van de collecties gelijkmatig over uw shards worden verdeeld.
  2. Als u een hoge aggregatiebelasting heeft voor slechts één verzameling, moet u mogelijk iets grotere machines gebruiken voor uw primaire shard.

Zoals altijd, als je vragen of opmerkingen hebt, stuur dan een e-mail naar [email protected].


  1. HDFS-wiscodering in Big Data Hadoop

  2. Loop door alle Mongo-verzamelingen en voer de query uit

  3. Cassandra vs. MongoDB

  4. Laravel - Welsprekend cachen met regelmatige updates