Menu Docs

Escolher uma chave de fragmentação

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:

Observação

  • A partir do MongoDB 5.0, você pode alterar sua chave de shard e redistribuir seus dados utilizando o comando reshardCollection.

  • Você pode usar o comando refineCollectionShardKey para refinar a chave de fragmento de uma coleção. O comando refineCollectionShardKey adiciona um campo de sufixo ou campos à chave existente para criar a nova chave de fragmento.

  • Você pode atualizar o valor da chave de fragmento de um documento, a menos que o campo de chave de fragmento seja o campo de _id imutável.

Importante

Se você alterar regularmente o valor da chave de shard de um documento para que o valor esteja em um intervalo de chaves de shard de propriedade de um shard diferente, isso poderá impacto o desempenho do cluster devido aos recursos adicionais envolvidos na migração do documento entre shards. Para obter detalhes, consulte Particionamento de dados com blocos e db.collection.updateOne().

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:

Diagram of poor shard key distribution due to low cardinality
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 de 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:

Diagram of poor shard key distribution due to high frequency
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 de 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 uma parte 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á uma parte 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:

Diagram of poor shard key distribution due to monotonically increasing or decreasing shard key
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.