Escolher uma chave de fragmentação
Nesta página
A escolha da chave de fragmento afeta a criação e a distribuição de partes nos 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:
a cardinalidade da chave do fragmento
a frequência com que os valores da 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.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().
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 de 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 de 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 fragmento
A partir de 7.0, o MongoDB facilita a escolha da sua chave de fragmento. Você pode usar analyzeShardKey
, que calcula métricas para avaliar uma chave de fragmento de uma coleção fragmentada ou não fragmentada. As métricas são baseadas em queries de amostra, permitindo que você faça uma escolha orientada por dados para sua chave de fragmento.
Habilitar amostragem de query
Para analisar uma chave fragmentada, você precisa habilitar a amostragem de query na coleção de destino. Para mais informações, veja:
configureQueryAnalyzer
Comando de banco de dadosdb.collection.configureQueryAnalyzer()
método shell
Para monitorar o processo de amostragem de queries, use o estágio $currentOp
. Para obter um exemplo, consulte Queries de amostra.
Comandos de análise para chave de fragmento
Para analisar uma chave de fragmento, 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 fragmento e sua distribuição de leitura e escrita. As métricas são baseadas em queries de amostra.
O campo
keyCharacteristics
contém métricas sobre a cardinalidade, a frequência e a monotonicidade da chave de fragmento.O campo
readWriteDistribution
contém métricas sobre os padrões de roteamento de query e sobre a distribuição de carga dos intervalos de chaves de fragmento.