Fragmentação em hash
A fragmentação por hash usa um índice de hash de campo único ou um índice composto hasheado como a chave de fragmento 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.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 com hash. Para criar um índice composto com hash, 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] | 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. |
Chave de shard de fragmentação hashed
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.
Fragmentação hashed versus à distância
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:
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:
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.
Fragmentar a collection
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 fragmento adicionando um ou mais campos de sufixo à chave de fragmento existente.
Fragmentar uma collection preenchida
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.
Fragmentar uma collection vazia
A operação de coleta de fragmentos pode realizar uma criação e distribuição inicial de fragmentos para coleções vazias ou inexistentes se zonas e intervalos de zonas tiverem sido definidos para a coleção. A criação e distribuição inicial de partes agiliza a configuração da fragmentação por zonas. Após a distribuição inicial, o balanceador gerenciará normalmente a distribuição de partes daqui para a frente.
- 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 uma parte vazia para cobrir toda a faixa de valores da chave de shard. A partir da versão 7.2, a operação cria 1 chunk por fragmento por padrão e migra pelo cluster. Você pode utilizar a opção
numInitialChunks
para especificar um número diferente de partes iniciais e gerar uma distribuição inicial de partes. A criação e distribuição inicial de parte 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:
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 chave de fragmento com hash composta tiver o campo como prefixo (o campo é o primeiro campo na chave de fragmento com hash):
Sem zonas e faixas de zonas especificadas para a collection vazia ou inexistente:
A operação de fragmentação cria partes vazias para cobrir toda a faixa de valores da chave de shard e executa uma distribuição inicial de partes. O valor de todos os campos sem hash é
MinKey
em cada ponto de divisão. A partir da versão 7.2, a operação cria 1 chunk por fragmento por padrão e migra pelo cluster. Você pode utilizar a opçãonumInitialChunks
para especificar um número diferente de partes iniciais e causar uma distribuição inicial de parte. A criação e distribuição inicial de parte 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
aMaxKey
especificada para a collection vazia ou inexistente e a opçãopresplitHashedZones
especificada parash.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.
Eliminar um índice de chave de fragmento com hash
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 autogerenciado.