Menu Docs

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

Fragmentação em hash

A fragmentação hasheada usa um único índice com hash de campo ou um índice composto hasheado como chave de fragmentação para particionar dados em seu cluster fragmentado.

Fragmentação em um índice hashed de campo único

A fragmentação hashed fornece uma distribuição de dados mais uniforme em todo o cluster fragmentado, ao custo de reduzir as operações direcionadas em relação às operações de transmissão. Pós-hash, documentos com valores da chave de shard "próximos" provavelmente não estarão no mesmo chunk ou shard. É mais provável que mongos execute operações de transmissão para atender a uma determinada query à distância. mongos pode direcionar queries com correspondências de igualdade para um único shard.

Diagrama da segmentação baseada hasheada

Os índices hashed calculam o valor de hash de um único campo como o valor do índice; esse valor é usado como sua chave de shard. [1]

Fragmentação em um índice hashed composto

O MongoDB inclui suporte para a criação de índices compostos com um único campo hasheado. Para criar um índice composto hasheado, especifique hashed como valor para qualquer chave de índice única ao criá-lo.

O índice hashed composto calcula o valor de hash de um único campo no índice composto; esse valor é usado junto com os outros campos no índice como sua chave de shard.

A fragmentação hasheada composta suporta funcionalidades como a fragmentação de zona, onde o(s) campo(s) não hasheados do prefixo (ou seja, o primeiro) suportam faixas de zonas, enquanto o campo hasheado suporta uma distribuição mais uniforme dos dados fragmentados. A fragmentação hasheada composta também oferece suporte a chaves de shard com um prefixo hasheado para resolver problemas de distribuição de dados relacionados a campos que aumentam monotonicamente.

Dica

O MongoDB calcula automaticamente os hashes ao resolver consultas usando índices com hash. Os aplicativos não precisam calcular hashes.

Aviso

Os índices hashed do MongoDB truncam números de ponto flutuante em inteiros de 64 bits antes de fazer o hash. Por exemplo, um índice hashed armazenaria o mesmo valor para um campo que tivesse valor de 2.3, 2.2 e 2.9. Para evitar colisões, não use um índice hashed para números de ponto flutuante que não possam ser convertidos de forma confiável em inteiros de 64 bits (e, em seguida, de volta ao ponto flutuante). Os índices hashed do MongoDB não suportam valores de ponto flutuante maiores que 2 53.

Para saber qual seria o valor hashed de uma chave, consulte convertShardKeyToHashed().

[1] A partir da versão 4.0, mongosh fornece o método convertShardKeyToHashed(). Esse método utiliza a mesma função de hash que o índice de hash e pode ser usado para ver qual seria o valor de hash para uma chave.

O campo escolhido como hashed shard key deve ter uma boa cardinalidade ou um grande número de valores diferentes. As chaves hashed são ideais para chaves de shard com campos que mudam monotonicamente como valores ObjectId ou carimbos de data/hora. Um bom exemplo disso é o campo _id padrão, supondo que ele contenha apenas valores ObjectId .

Para fragmentar uma collection usando uma hashed shard key, consulte Fragmentar uma collection.

Dada uma collection usando um valor monotonicamente crescente X como chave de shard, o uso de fragmentação à distância resulta em uma distribuição de inserções de entrada 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

Como o valor de X está sempre aumentando, o chunk com limite superior de MaxKey recebe a maioria das gravações que entram. Isso restringe as operações de inserção ao único shard que contém esse chunk, o que reduz ou remove a vantagem das gravações distribuídas em um cluster fragmentado.

Ao utilizar um índice hashed no X, a distribuição de inserções é semelhante ao seguinte:

Diagrama da distribuição de hashed shard keys
clique para ampliar

Como os dados agora estão distribuídos de forma mais uniforme, as inserções são distribuídas de forma eficiente em todo o cluster.

Use o método sh.shardCollection(), especificando o namespace completo da collection e o índice hasheado de destino a ser usado como chave de shard.

sh.shardCollection( "database.collection", { <field> : "hashed" } )

Para fragmentar uma collection em um índice composto hasheado, especifique o namespace completo da collection e o índice composto hasheado a ser usado como chave de shard:

sh.shardCollection(
"database.collection",
{ "fieldA" : 1, "fieldB" : 1, "fieldC" : "hashed" }
)

Importante

  • A partir do MongoDB 5.0, você pode reestruturar uma coleção alterando a chave de fragmento de uma coleção.

  • Você pode refinar uma chave de shard adicionando um ou mais campos de sufixo à chave de shard existente.

Se você fragmentar uma collection preenchida usando uma hashed shard key:

  • A operação de fragmentação cria um chunk inicial para cobrir todos os valores da chave de shard.

  • Após a criação do chunk inicial, o balancer move as faixas do chunk inicial quando precisa equilibrar os dados.

A partir do MongoDB 4.0.3, a operação de coleta de shards pode fazer a criação e distribuição inicial de chunks para collections vazias ou inexistentes se as zonas e faixas de zonas tiverem sido definidas para a collection. A criação e distribuição inicial de chunks agiliza a configuração da fragmentação por zonas. Após a distribuição inicial, o balancer passa a gerenciar a distribuição de chunks como de costume.

Fragmentação de uma collection vazia em uma hashed shard key de campo único
  • Sem zonas e faixas de zona especificadas para a collection vazia ou inexistente:

    • A operação de fragmentação cria chunks vazios para cobrir toda a faixa de valores da chave de shard e executa uma distribuição inicial de chunks. Por padrão, a operação cria dois chunks por shard e migra pelo cluster. Você pode utilizar a opção numInitialChunks para especificar um número diferente de chunks iniciais. A criação e distribuição inicial de chunks agiliza a configuração da fragmentação.

    • Após a distribuição inicial, o balancer passa a gerenciar a distribuição de chunks.

  • Com zonas e faixas de zonas especificadas para a collection vazia ou inexistente (disponível a partir do MongoDB 4.0.3):

    • A operação de fragmentação cria chunks vazios para as faixas de zonas definidas e chunks adicionais para cobrir toda a faixa de valores das chaves de shard e executa uma distribuição inicial de chunks com base nas faixas de zonas. A criação e distribuição inicial de chunks agiliza a configuração da fragmentação por zonas.

    • Após a distribuição inicial, o balancer passa a gerenciar a distribuição de chunks.

Fragmentação de uma collection vazia em uma hashed shard key composta com prefixo de campo hashed

Se a hashed shard key composta tiver o campo hashed como prefixo (ou seja, se o campo hashed for o primeiro na chave de shard):

  • Sem zonas e faixas de zonas especificadas para a collection vazia ou inexistente:

    • A operação de fragmentação cria chunks vazios para cobrir toda a faixa de valores da chave de shard e executa uma distribuição inicial de chunks. O valor de todos os campos sem hash é MinKey em cada ponto de divisão. Por padrão, a operação cria dois chunks por shard e migra pelo cluster. Você pode utilizar a opção numInitialChunks para especificar um número diferente de chunks iniciais. A criação e distribuição inicial de chunks agiliza a configuração da fragmentação.

    • Após a distribuição inicial, o balancer passa a gerenciar a distribuição de chunks.

  • Com uma única zona com uma faixa de MinKey a MaxKey especificada para a collection vazia ou inexistente e a opção presplitHashedZones especificada para sh.shardCollection():

    • A operação de fragmentação cria chunks vazios para as faixas de zonas definidas e chunks adicionais para cobrir toda a faixa de valores das chaves de shard e executa uma distribuição inicial de chunks com base nas faixas de zonas. A criação e distribuição inicial de chunks agiliza a configuração da fragmentação por zonas.

    • Após a distribuição inicial, o balancer passa a gerenciar a distribuição de chunks.

Fragmentando uma collection vazia em uma hashed shard key composta com prefixo não hasheado

Se a hashed shard key composta tiver um ou mais campos não hashed como prefixo (ou seja, o campo hashed não é o primeiro campo na chave de shard):

  • Sem zonas e faixas de zonas especificadas para a collection vazia ou inexistente e preSplitHashedZones for false ou foi omitido, o MongoDB não executa nenhuma criação ou distribuição inicial de chunks ao fragmentar a collection.

  • Sem zonas e intervalos de zonas especificados para a collection vazia ou não existente e preSplitHashedZones, sh.shardCollection() / shardCollection retorna um erro.

  • Com zonas e faixas de zonas especificados para a collection vazia ou inexistente e a opção preSplitHashedZones especificada como sh.shardCollection():

    • A operação de fragmentação cria chunks vazios para as faixas de zonas definidas e chunks adicionais para cobrir toda a faixa de valores das chaves de shard.

    • A operação de fragmentação subdivide ainda mais o chunk inicial para cada faixa, de modo que a cada shard na zona seja atribuído um número igual de chunks.

    • Essa criação e distribuição inicial de chunks permite uma configuração mais rápida da fragmentação por zonas. Após a distribuição inicial, o balancer gerenciará a distribuição de partes daqui para frente.

    As faixas definidas para cada zona devem atender a determinados requisitos. Para obter uma descrição dos requisitos e um exemplo completo, consulte Pre-definir zonas e faixas de zona para uma collection vazia ou não existente.

A partir do MongoDB 7.0.3 (e 6.0.12 and 5.0.22), você pode descartar o índice de uma hashed shard key.

Isso pode acelerar a inserção de dados para collections fragmentadas com uma hashed shard key. Também pode acelerar a ingestão de dados ao usar mongosync.

Para mais informações, consulte Descartar um índice de hashed shard key.

Dica

Veja também:

Para saber como implantar um cluster fragmentado e implementar fragmentação hasheada, consulte Implantar um cluster fragmentado.

← Solucionar problemas de chaves de fragmentação