Página inicial do Docs → Desenvolver aplicações → Manual do MongoDB
Escolher uma chave de fragmentação
Nesta página
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
Observação
A partir do MongoDB 5.0, você pode alterar sua chave de fragmento e redistribuir seus dados usando o comando
reshardCollection
.Você pode usar o comando
refineCollectionShardKey
para refinar a chave de fragmento de uma coleção. O comandorefineCollectionShardKey
adiciona um campo de sufixo ou campos à chave existente para criar a nova chave de fragmento.No MongoDB 4,2 e anterior, uma vez que você fragmente uma coleção, a seleção da chave de fragmento é imutável.
A partir do MongoDB 4.2, você pode atualizar o valor da chave de fragmento de um documento, a menos que o campo da chave de fragmento seja o campo
_id
imutável.
Cardinalidade da chave de fragmento
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:
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.
Frequência da chave de fragmento
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:
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.
Chaves de fragmento que mudam monotonicamente
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:
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.
Padrões de query de compartilhamento
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.
Use o Shard Key Analyzer em 7.0 para encontrar sua chave de shard
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.
Habilitar amostragem de query
Para analisar uma chave de shard, você deve ativar a amostragem de query na collection de destino. Para mais informações, veja:
configureQueryAnalyzer
Comando de banco de dadosdb.collection.configureQueryAnalyzer()
método shell
Para monitorar o processo de amostragem da query, use o estágio $currentOp
. Para ver um exemplo, consulte Queries de amostra.
Comandos de análise da chave de shard
Para analisar uma chave de shard, consulte:
analyzeShardKey
Comando de banco de dadosdb.collection.analyzeShardKey()
método shell
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.
O campo
keyCharacteristics
contém métricas sobre a cardinalidade, a frequência e a monotonicidade da chave de shard.O campo
readWriteDistribution
contém métricas sobre os padrões de roteamento da query e a distribuição de carga das faixas de chaves de shard.