MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Fragmentos do MongoDB e cargas de agregação desbalanceadas

A estrutura de agregação é uma engrenagem vital na infraestrutura do MongoDB. Ele ajuda você a analisar, resumir e agregar os dados armazenados no MongoDB. Consulte esta postagem do blog para obter mais detalhes sobre a estrutura de agregação no MongoDB 2.6.

Na versão 2.6, o MongoDB fez uma mudança sutil, mas significativa, na maneira como os pipelines de agregação subjacentes são executados em um ambiente fragmentado. Ao trabalhar com coleções fragmentadas, o MongoDB divide o pipeline em dois estágios. O primeiro estágio ou a fase “$match” é executado em cada fragmento e seleciona os documentos relevantes. Se o planejador de consulta determinar que um estilhaço não é relevante com base nas chaves de estilhaço, essa fase não será executada nesse estilhaço.

Os estágios subsequentes são executados apenas no fragmento "primário" da coleção. Esse estilhaço mescla os dados dos outros estilhaços e executa o restante do pipeline. Isso resulta em uma carga consideravelmente maior no shard primário da coleção que está sendo agregada. Veja um exemplo de um de nossos clientes executando três fragmentos e usando principalmente consultas de agregação:

Como você pode ver, a carga no primeiro shard é consistentemente 3-4 vezes o outro motivo. Este é um exemplo extremo, pois caso o segundo e o terceiro fragmentos tenham sido adicionados posteriormente, portanto, o fragmento principal para todas as coleções é o primeiro fragmento. Então, essencialmente, os estágios subsequentes de todos os nossos trabalhos de agregação são executados apenas no Shard1. Se você examinar os logs no estilhaço primário, verá vários comandos de "mesclar" recuperando dados de outros estilhaços.

Antes da versão 2.6, os estágios subsequentes do pipeline de agregação costumavam ser executados nos servidores MongoDB e não no fragmento principal.

Então, como você lida com essa distribuição desigual de carga? Você tem algumas opções:

  1. Se você estiver executando agregações em várias coleções, certifique-se de que os "fragmentos primários" das coleções estejam distribuídos uniformemente pelos seus fragmentos.
  2. Se você tiver uma carga de agregação alta em apenas uma coleção, talvez seja necessário usar máquinas um pouco maiores para seu estilhaço principal.

Como sempre, se você tiver dúvidas ou comentários, envie um email para [email protected].