Sem o sharding, todos os dados de uma coleção residem em um único shard, enquanto os demais shards permanecem ociosos. O sharding distribui os dados por todos os shards para que cada um processe uma parte da carga de trabalho.
Pré-requisitos
A instância deve ser um cluster com sharding.
Seleção da chave de shard
A chave de shard determina como o MongoDB distribui os dados entre os shards. É fundamental que você escolha a chave de shard com cuidado, pois ela afeta diretamente o desempenho das consultas e a distribuição de dados. Para obter mais informações sobre chaves de shard, consulte Chaves de shard e Como selecionar uma chave de shard. Em seguida, selecione a chave mais adequada.
Uma boa chave de shard tem três propriedades:
Alta cardinalidade: a chave tem muitos valores distintos, permitindo uma distribuição de dados refinada.
Baixa frequência: nenhum valor de chave predomina. Valores frequentes criam chunks grandes e imutáveis.
Variação não monotônica: a chave não aumenta nem diminui constantemente. Chaves monotônicas direcionam todas as gravações para um único shard.
A mutabilidade da chave de shard depende da versão do MongoDB:
Antes da versão 4.4: não é possível modificar ou excluir chaves de shard após a criação.
4.4 e posteriores: o comando refineCollectionShardKey adiciona um campo de sufixo a uma chave de shard existente.
5.0 e posteriores: o comando reshardCollection altera completamente a chave de shard.
Estratégias de sharding
O MongoDB é compatível com sharding por intervalo, sharding com hash e chaves de shard compostas.
|
Propriedade |
Sharding por intervalo |
Sharding com hash |
|
Mecanismo |
Divide os dados em chunks com base em intervalos de valores da chave de shard |
Aplica hash a um valor de campo e distribui os dados por intervalos de hash |
|
Distribuição |
Pode ser desigual e criar hot spots sem distribuição de gravação |
Distribuição uniforme por todos os nós de shard, garantindo distribuição de gravação |
|
Consultas por intervalo |
Eficiente. O roteador mongos localiza o shard de destino diretamente. |
Ineficiente. Envia as consultas para todos os nós de shard. |
|
Mais indicado para |
Chaves não monotônicas com alta cardinalidade e baixa frequência; cargas de trabalho dependentes de consultas por intervalo |
Chaves monotônicas crescentes ou decrescentes com alta cardinalidade; cargas de trabalho com leituras e gravações aleatórias |
|
Valor da chave de shard |
|
|
As chaves de shard compostas combinam vários campos. Use chaves compostas quando nenhum campo isolado oferecer cardinalidade suficiente ou quando as consultas filtrarem por vários campos. Por exemplo, combine uma chave de baixa cardinalidade com uma chave monotônica crescente.
Por favor, escolha uma estratégia
Use o sharding por intervalo quando as consultas examinarem frequentemente um intervalo de valores da chave de shard. Certifique-se de que a chave seja não monotônica para evitar hot spots.
Use o sharding com hash quando o volume de gravação for alto e os dados precisarem de distribuição uniforme. Aceite a contrapartida de as consultas por intervalo atingirem todos os nós de shard.
Aplique sharding a uma coleção
O procedimento a seguir usa o banco de dados mongodbtest e a coleção customer como exemplos.
Etapa 1: Conecte-se ao cluster com sharding
Conecte-se à instância do cluster com sharding por meio do mongo shell. Para obter os métodos de conexão, consulte Faça login em uma instância de cluster com sharding.
Etapa 2: Ative o sharding para o banco de dados
Ignore esta etapa se a instância executar o MongoDB 6.0 ou posterior. A partir do MongoDB 6.0, o comando sh.enableSharding() não é mais necessário.
Por favor, execute o seguinte comando e ative o sharding no banco de dados de destino:
sh.enableSharding("mongodbtest")
Etapa 3: Crie um índice na chave de shard
Antes de aplicar sharding a uma coleção, por favor, crie um índice que ofereça suporte à chave de shard.
Sintaxe:
db.<collection>.createIndex(<keyPatterns>, <options>)
Para obter mais informações, consulte db.collection.createIndex().
Exemplo de sharding por intervalo (índice crescente no campo name):
db.customer.createIndex({ name: 1 })
Exemplo de sharding com hash (índice com hash no campo name):
db.customer.createIndex({ name: "hashed" })
Valores do tipo de índice:
|
Valor |
Tipo |
|
|
Crescente |
|
|
Decrescente |
|
|
Com hash |
Etapa 4: Aplique sharding à coleção
Execute sh.shardCollection() para aplicar sharding à coleção.
Sintaxe:
sh.shardCollection("<database>.<collection>", { "<key>": <value> })
Exemplo de sharding por intervalo:
sh.shardCollection("mongodbtest.customer", { "name": 1 })
Exemplo de sharding com hash:
sh.shardCollection("mongodbtest.customer", { "name": "hashed" })
O parâmetro <value> determina a estratégia de sharding:
|
Valor |
Estratégia |
|
|
Sharding por intervalo |
|
|
Sharding com hash |
Etapa 5: Aguarde o balancer distribuir os dados
É necessário que você configure o sharding. Depois, o balancer divide automaticamente os dados que atendem aos critérios e migra os chunks entre os nós de shard.
O balancer consome recursos da instância durante a migração de dados. Por favor, execute o sharding inicial fora dos horários de pico. Defina uma janela ativa para o balancer para restringir a atividade do balancer a períodos específicos e evitar impactos no desempenho durante os horários de pico.
Verifique a configuração de sharding
Nesta etapa, verifique a configuração de sharding.
Verifique a distribuição de dados
Agora, verifique a distribuição de dados.
Por favor, execute sh.status() e visualize o status do sharding e a distribuição de dados entre os nós de shard:
sh.status()
Verifique o armazenamento por shard
Por fim, verifique o armazenamento por shard.
Por favor, execute db.stats() e visualize as estatísticas de armazenamento de cada nó de shard:
db.stats()