Clusters podem encontrar situações em que as migrações de partes param ou em que uma ou mais partes se tornam jumbo. Quando isso ocorre, o balanceador não pode distribuir uniformemente os dados entre os shards. Isso pode resultar em utilização desigual de recursos e desempenho degradado do cluster.
Esta página descreve as causas comuns de migrações de partes paralisadas e partes jumbo, juntamente com etapas para diagnosticar e resolver essas condições. Se o problema persistir após concluir as etapas abaixo, entre em contato com o Suporte técnico.
Verificações de pré-requisitos
Verifique se seu cluster é afetado por migrações paralisadas ou partes jumbo.
Verifique o estado do balanceador
A partir de uma instância do mongos, execute:
sh.getBalancerState()
Se esse método retornar true, mas a distribuição de dados permanecer desigual, será necessária uma pesquisa adicional.
Você também pode revisar informações detalhadas do balanceador :
db.adminCommand({ balancerStatus: 1 })
Verificar distribuição de parte
Para revisar a distribuição de partes em fragmentos, executar:
sh.status(true)
Procure:
Grandes diferenças no número de partes por fragmento
partes marcadas como
jumbo
Observação
Uma parte marcada como jumbo não pode ser migrada pelo balanceador até que seja divisão ou reduzido de tamanho.
Verifique as mensagens de log
Registros do servidor de configuração
Revise os logs do servidor de configuração para entradas relacionadas ao balanceamento ou migração de parte. Procure mensagens indicando:
Novas tentativas de migração
Migrações abortadas
Partes marcadas como jumbo
Falhas durante as fases de confirmação ou exclusão da migração
Registros de fragmentos
Nos nós de shards, revise os registros para:
Bloqueio tempos limite de aquisição
Atraso de replicação que afeta a migração
Erros de espaço em disco
Falhas na etapa de migração
Problemas e Resoluções Comuns
Partes jumbo impedem a migração
Uma parte se torna jumbo quando excede o tamanho configurado da parte e não pode ser divisão automaticamente.
Identificar partes jumbo
A partir de mongos:
sh.status(true)
Localize partes rotuladas como jumbo.
Resolver partes jumbo
As partes divisíveis contêm vários valores da chave de fragmento exclusivos e podem ser divisão. Para resolver um parte jumbo divisível, divisão o manualmente:
sh.splitAt("database.collection", { shardKeyField: <value> })
Em seguida, reinicie o balanceador , se necessário:
sh.startBalancer()
Para aprender quando a divisão manual é apropriada, consulte Dividir partes em um cluster.
Partes indivisíveis representam um único valor de chave de fragmento exclusivo e não podem ser divisão. Para resolver um parte jumbo indivisível :
Refine a chave de fragmento usando
refineCollectionShardKeypara adicionar um campo de sufixo, tornando a parte divisível. Consulte partes divisíveis.Refragmente a collection usando uma chave de fragmento distribuída de forma mais uniforme. Consulte Refragmentar uma coleção.
Para obter mais detalhes sobre como resolver partes jumbo, consulte Limpar sinalizador jumbo .
Distribuição de chave de fragmento ineficaz
Se a chave de fragmento tiver baixa cardinalidade ou seguir um padrão monotonicamente crescente, as partes poderão crescer desigualmente e resistir ao equilíbrio.
Para mitigar:
Revise o padrão de chave de fragmento usado pela coleção.
Determine se a maioria das gravações tem como alvo uma faixa limitada de chaves de shard. Se os valores da chave de fragmento de alta frequência estiverem fazendo com que as gravações se concentrem em um único fragmento, consulte Solução de problemas de chaves de fragmento.
Considere refragmentar a coleção usando uma chave de fragmento distribuída mais uniformemente.
Consulte Escolher uma chave de fragmento para obter as melhores práticas.
Balanceador desativado ou pausado
Se o balanceador estiver desabilitado, as migrações de partes não ocorrerão.
Verifique o estado do balanceador :
sh.getBalancerState()
Se estiver desativado, habilite-o:
sh.startBalancer()
Consulte Balanceador de Cluster Fragmentado para obter detalhes adicionais sobre o comportamento do balanceador.
Migração bloqueada por operações em andamento
Operações de longa duração, construções de índice ou pesadas cargas de trabalho de gravação podem atrasar ou bloquear migrações de partes.
Para reduzir a contenção:
Identifique operações de longa duração:
db.currentOp() Balanceamento do agendar durante períodos de menor atividade de gravar.
Garanta que haja espaço em disco suficiente disponível em todos os fragmentos.
Observação
A migração de partes envolve clonagem de dados e uma fase de exclusão. Espaço em disco insuficiente ou alto atraso de replicação podem atrasar essas fases.
Verificar resolução
Depois de resolver o problema:
Migrações de partes concluídas com sucesso.
Nenhuma parte permanece marcada como
jumbo.A distribuição de partes entre os fragmentos se torna mais uniforme.
O balanceador permanece ativo e estável.
Verifique novamente a distribuição:
sh.status(true)
Diagnósticos a serem coletados para mais suporte
Se o problema persistir, colete o seguinte antes de entrar em contato com o Suporte técnico:
Saída de
sh.status(true)Saída de
db.adminCommand({ balancerStatus: 1 })Registros relevantes do servidor de configuração
Registros de fragmentos relevantes
Definição de chave de fragmento para coleções afetadas
Versão do MongoDB
Descrição da topologia do cluster
Saída de
sh.getShardedDataDistribution()para contagem de parte e tamanho dos dados por fragmento