Dia 13 de 15

Escalabilidade e Sharding

Olá, dev! Seja bem-vindo ao Dia 13 da sua preparação para a certificação MongoDB Associate Developer. Hoje exploraremos o mecanismo de particionamento horizontal do MongoDB: o Sharding. Veremos como distribuir terabytes de dados e cargas massivas de escrita entre múltiplos servidores de forma transparente para a aplicação.

1. Arquitetura de um Sharded Cluster

Um Sharded Cluster no MongoDB é composto por três componentes principais que trabalham de forma coordenada:

2. A Escolha Crítica da `Shard Key`

A Shard Key é um campo indexado (ou índice composto) que dita como o MongoDB distribuirá os documentos da coleção entre os shards.

Estratégias de Sharding:

// Criando um índice hashed e habilitando o sharding na coleção
db.pedidos.createIndex({ clienteId: "hashed" })

sh.shardCollection("loja.pedidos", { clienteId: "hashed" })

3. As 3 Propriedades de Ouro de uma Shard Key

Para o exame de certificação, lembre-se sempre dos três pilares para avaliar se uma chave é adequada:

  1. Alta Cardinalidade (High Cardinality): A chave deve possuir um universo amplo de valores únicos (ex: usuarioId ou uuid têm alta cardinalidade; status: ['ABERTO', 'FECHADO'] tem cardinalidade baixíssima e é péssima para Shard Key).
  2. Baixa Frequência de Repetição (Low Frequency): Nenhum valor único deve representar uma fração massiva da coleção. Se um único ID concentrar 40% de todos os registros, causará a criação de um Jumbo Chunk (um pedaço que ultrapassa o tamanho limite e não pode ser dividido).
  3. Taxa de Mudança Não-Monotônica: Evite chaves que crescem sempre em uma única direção (como timestamps ou auto-incrementos em Ranged Sharding), pois todos os novos registros saturarão um único shard de escrita.

4. Chunks, Splits e o Balancer

5. Performance de Consultas: Targeted vs. Scatter-Gather

// Exemplo no mongosh:
// Supondo que a Shard Key da coleção seja { clienteId: 1 }

// 1. Targeted Query (O mongos consulta apenas 1 shard):
db.pedidos.find({ clienteId: 4502 })

// 2. Scatter-Gather Query (O mongos dispara para TODOS os shards):
db.pedidos.find({ valorTotal: { $gt: 1000 } })

6. Diagnóstico Prático no `mongosh`

// 1. Obter o relatório completo da topologia do Sharded Cluster
sh.status()

// 2. Habilitar o particionamento em um banco de dados
sh.enableSharding("e_commerce")

// 3. Verificar o status do Balancer
sh.getBalancerState()

// 4. Iniciar ou pausar o processo de balanceamento
sh.startBalancer()
sh.stopBalancer()

7. Questões no Estilo Exame de Certificação

Questão 1: Uma aplicação de rastreamento de veículos insere milhões de posições por segundo com o campo dataHora sempre crescente. Ao utilizar Ranged Sharding com a chave { dataHora: 1 }, a equipe nota que um único shard está com 100% de CPU de escrita e os demais ociosos. Qual é a causa desse comportamento e a melhor solução?

A) O Balancer travou; deve-se reiniciar os Config Servers.
B) Chaves monotônicas em Ranged Sharding criam um ponto quente (write hotspot); a solução é utilizar Hashed Sharding na chave { dataHora: "hashed" } ou adotar uma Shard Key composta com alta cardinalidade não-monotônica (ex: { veiculoId: 1, dataHora: 1 }).
C) O tamanho padrão do chunk deve ser reduzido para 1 MB.
D) O MongoDB não suporta inserções simultâneas em múltiplos shards.

Resposta Correta: B. Valores estritamente crescentes em Ranged Sharding sempre caem no chunk de limite máximo superior (MaxKey), direcionando todo o tráfego de gravação para o mesmo shard. O Hashed Sharding ou chaves compostas resolvem essa distribuição.

Questão 2: O que acontece quando uma consulta find() é executada em uma coleção particionada sem incluir os campos da Shard Key no filtro de busca?

A) A operação falha imediatamente com um erro de sintaxe do mongos.
B) A consulta é executada como uma Targeted Query no nó Primary do Config Server.
C) A consulta é enviada como uma operação Scatter-Gather para todos os shards do cluster.
D) O MongoDB converte a consulta em um índice TTL temporário.

Resposta Correta: C. Sem a Shard Key no filtro, o mongos não sabe em qual shard os documentos residem, sendo obrigado a consultar todos os shards (Scatter-Gather).