Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

Escolher uma chave de fragmentação

Nesta página

  • Cardinalidade da chave de fragmento
  • Frequência da chave de fragmento
  • Chaves de fragmento que mudam monotonicamente
  • Padrões de query de compartilhamento
  • Use o Shard Key Analyzer em 7.0 para encontrar sua chave de shard
  • Habilitar amostragem de query
  • Comandos de análise da chave de shard

A escolha da chave de fragmento afeta a criação e a distribuição de fragmentos entre os fragmentos disponíveis. A distribuição de dados afeta a eficiência e o desempenho das operações dentro do cluster fragmentado.

A chave de fragmento ideal permite que o MongoDB distribua documentos uniformemente em todo o cluster, ao mesmo tempo em que facilita padrões de consulta comuns.

Ao escolher sua chave de fragmento, considere:

  • acardinalidade da chave do fragmento

  • a frequência com que os valores de chave de fragmento ocorrem

  • se uma chave de fragmento potencial cresce monotonicamente

  • Padrões de query de compartilhamento

  • Limitações da chave de fragmento

Observação

A cardinalidade de uma chave de fragmento determina o número máximo de pedaços que o balanceador pode criar. Sempre que possível, escolha uma chave de fragmento com alta cardinalidade. Uma chave de fragmentação com baixa cardinalidade reduz a eficácia do dimensionamento horizontal no cluster.

Cada valor de chave de fragmento exclusivo não pode existir em mais do que um único bloco em um determinado momento. Considere um conjunto de dados que contenha dados de usuário com um campo continent. Se você optou por fragmentar em continent, a chave de fragmento teria uma cardinalidade de 7. Uma cardinalidade de 7 significa que não pode haver mais de 7 blocos dentro do cluster fragmentado, cada um armazenando um valor de chave de fragmento exclusivo. Isso também limita o número de fragmentos efetivos no cluster a 7 - adicionar mais de sete fragmentos não traria nenhum benefício.

A imagem seguinte ilustra um cluster fragmentado utilizando o campo X como a chave fragmentada. Se o X tiver baixa cardinalidade, a distribuição de inserções poderá parecer semelhante ao seguinte:

Diagrama de má distribuição de chaves de shard devido à baixa cardinalidade
clique para ampliar

Se o seu modelo de dados exigir o compartilhamento de uma chave com baixa cardinalidade, considere utilizar um composto indexado de campos para aumentar a cardinalidade.

Uma chave de fragmentação com alta cardinalidade não garante, por si só, a distribuição uniforme de dados pelo cluster fragmentado. A frequência da chave do fragmento e o potencial para alterar os valores da chave do fragmento monotonicamente também contribuem para a distribuição dos dados.

O frequency da chave de fragmento representa com que frequência ocorre um determinado valor da chave de fragmento nos dados. Se a maioria dos documentos contiver apenas um subconjunto dos possíveis valores principais de fragmentação, os blocos que armazenam os documentos com esses valores poderão se tornar um gargalo dentro do cluster. Além disso, à medida que esses pedaços crescem, eles podem se tornar pedaços indivisíveis , pois não podem mais ser divididos. Isso reduz a eficácia do dimensionamento horizontal dentro do cluster.

A imagem seguinte ilustra um cluster fragmentado utilizando o campo X como a chave fragmentada. Se um subconjunto de valores para X ocorrer com alta frequência, a distribuição de inserções poderá ser semelhante à seguinte:

Diagrama de distribuição deficiente de chaves fragmentadas devido à alta frequência
clique para ampliar

Se o seu modelo de dados exigir a fragmentação em uma chave que tem valores de alta frequência, considere utilizar um índice composto utilizando um valor de frequência único ou baixo.

Uma chave de fragmento com baixa frequência não garante, por si só, a distribuição uniforme dos dados no cluster fragmentado. A cardinalidade da chave do fragmento e a possibilidade de alterar monotonicamente os valores da chave do fragmento também contribuem para a distribuição dos dados.

Uma chave de fragmento em um valor que aumenta ou diminui monotonicamente tem maior probabilidade de distribuir inserções em um único bloco dentro do cluster.

Isso ocorre porque cada cluster tem um bloco que captura um intervalo com um limite superior de MaxKey. maxKey sempre se compara como mais alto que todos os outros valores. Da mesma forma, há um bloco que captura um intervalo com um limite inferior de MinKey. minKey sempre se compara como menor do que todos os outros valores.

Se o valor da chave de fragmento estiver sempre aumentando, todas as novas inserções serão roteadas para o bloco com maxKey como o limite superior. Se o valor da chave de fragmento estiver sempre diminuindo, todas as novas inserções serão roteadas para o bloco com minKey como o limite inferior. O fragmento que contém esse bloco se torna o gargalo para operações de escrita.

Para otimizar a distribuição de dados, os blocos que contêm o maxKey global (ou minKey) não permanecem no mesmo fragmento. Quando um bloco é dividido, o novo bloco com o maxKey (ou minKey) é localizado em um fragmento diferente.

A imagem seguinte ilustra um cluster fragmentado utilizando o campo X como a chave fragmentada. Se os valores de X estiverem aumentando monotonicamente, a distribuição das inserções pode ser semelhante à seguinte:

Diagrama de uma distribuição deficiente de chaves de shard devido ao aumento ou diminuição monotônico da chave de shard
clique para ampliar

Se o valor da chave do fragmento estivesse diminuindo monotonicamente, todas as inserções seriam roteadas para Chunk A.

Se o seu modelo de dados exigir fragmentação em uma chave que muda monotonicamente, considere usar a fragmentação com hash.

Uma chave de fragmento que não muda monotonicamente não garante, por si só, a distribuição uniforme de dados pelo cluster fragmentado. A cardinalidade e a frequência da chave de fragmento também contribuem para a distribuição dos dados.

A chave de fragmentação ideal distribui os dados uniformemente pelo cluster de fragmentação e, ao mesmo tempo, facilita os padrões de query comuns. Ao escolher uma chave de fragmento, considere seus padrões de query mais comuns e se uma determinada chave de fragmento os abrange.

Em um cluster fragmentado, o mongos encaminha as queries somente para os fragmentos que contêm os dados relevantes se as queries contiverem a chave do fragmento. Quando as queries não contêm a chave do fragmento, elas são transmitidas para todos os fragmentos para avaliação. Esses tipos de queries são chamados de queries dispersas. As queries que envolvem vários fragmentos para cada solicitação são menos eficientes e não são dimensionadas linearmente quando mais fragmentos são adicionados ao cluster.

Isso não se aplica a queries de agregação que operam em uma grande quantidade de dados. Nesses casos, a dispersão-coleta pode ser uma abordagem útil que permite que a query seja executada em paralelo em todos os fragmentos.

A partir de 7.0, o MongoDB facilita a escolha da chave de shard. Você pode usar analyzeShardKey , que calcula métricas para avaliar uma chave de shard para uma collection não fragmentada ou fragmentada. As métricas são baseadas em queries de amostra, permitindo que você faça uma escolha baseada em dados para sua chave de shard.

Para analisar uma chave de shard, você deve ativar a amostragem de query na collection de destino. Para mais informações, veja:

Para monitorar o processo de amostragem da query, use o estágio $currentOp . Para ver um exemplo, consulte Queries de amostra.

Para analisar uma chave de shard, consulte:

analyzeShardKey Retorna métricas sobre as principais características de uma chave de shard e sua distribuição de leitura e escrita. As métricas são baseadas em queries amostradas.

Dica

Veja também:

← Fragmentar uma Coleção