O balancer distribui dados entre os nós de shard em uma instância de cluster com sharding do ApsaraDB for MongoDB. Verifique o status do balancer, programe uma janela de tempo ativa ou ative e desative o balancer.
Os exemplos neste tópico usam o mongo shell. Os comandos e a saída podem variar em outras ferramentas.
Como funciona
O balancer monitora a distribuição de dados nos nós de shard e migra os dados automaticamente. O comportamento varia conforme a versão do mecanismo de banco de dados.
MongoDB 5.0 e versões anteriores
O balancer rastreia a contagem de chunks por nó de shard. Quando a diferença atinge o limiar de migração, ele migra chunks (moveChunk) para reequilibrar o cluster.
|
Versão do mecanismo de banco de dados |
Limiar de migração |
|
MongoDB 4.2, 4.4, 5.0 |
1 |
|
MongoDB 3.4 (descontinuado), MongoDB 4.0 |
Padrão: 2. Reduzido para 1 se o total de chunks for < 20 ou se os chunks migrados anteriormente forem < 20 |
|
MongoDB 3.2 (descontinuado) |
Total de chunks < 20: limiar é 2. Total de chunks 20--80: limiar é 4. Total de chunks >= 80: limiar é 8 |
MongoDB 6.0
Em vez de contar chunks, o balancer monitora o tamanho dos dados por coleção em cada shard. Se a diferença de tamanho entre dois shards de uma coleção exceder 384 MB (três vezes o tamanho padrão do chunk), ele divide os dados por tag de shard e os migra usando moveRange.
Para verificar o equilíbrio dos dados, execute getShardDistribution() e concentre-se no tamanho dos dados, não na contagem de chunks.
Após atualizar para a V6.0 (versão secundária 7.0.1) ou posterior, o sh.status() pode indicar que a contagem de chunks entre os shards não está mais equilibrada ou que cada shard possui apenas um único chunk. Esse é o comportamento esperado do novo balancer. Para mais detalhes, consulte Imbalanced chunk count across shards after a MongoDB upgrade.
Observações de uso
Suportado apenas para instâncias de cluster com sharding.
Por padrão, o balancer opera continuamente (janela ativa de 24 horas).
A migração de chunks consome recursos e pode degradar o desempenho. Programe a janela ativa para horários de baixa demanda.
Verifique o status do balancer
Antes de desativar o balancer, confirme que nenhuma migração está em andamento.
Connect to the sharded cluster instance by using the mongo shell.
-
Execute o seguinte comando:
sh.isBalancerRunning() -
Interprete o resultado com base no tipo de retorno: Valor de retorno Map Algumas versões do mongo shell retornam um objeto Map. Consulte o campo
inBalancerRoundconforme documentado em sh.isBalancerRunning().Valor de retorno Boolean
Valor
Significado
falseO balancer está ocioso. É seguro desativá-lo.
trueO balancer está migrando chunks. Não o desative para evitar inconsistência de dados.
**Valor de
inBalancerRound**Significado
falseO balancer está ocioso. É seguro desativá-lo.
trueO balancer está migrando chunks. Não o desative para evitar inconsistência de dados.
{ mode: 'full', inBalancerRound: false, numBalancerRounds: Long("1143"), ok: 1, '$clusterTime': { clusterTime: Timestamp({ t: 1639753724, i: 3 }), signature: { hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0), keyId: Long("0") } }, operationTime: Timestamp({ t: 1639753724, i: 3 }) }
Defina uma janela de tempo ativa
Restrinja o balancer a horários específicos para reduzir o impacto no desempenho durante os períodos de pico de uso.
Connect to the sharded cluster instance by using the mongo shell.
-
Mude para o banco de dados config:
use config -
Configure a janela de tempo ativa. Substitua os espaços reservados pelos seus valores. Exemplo: Execute o balancer diariamente das 01:00 às 03:00:
NotaOs horários seguem o fuso horário local da região da instância.
Espaço reservado
Descrição
Formato
<start-time>Hora de início da janela de tempo ativa
HH:MM (HH: 00--23, MM: 00--59)
<stop-time>Hora de término da janela de tempo ativa
HH:MM (HH: 00--23, MM: 00--59)
db.settings.update( { _id: "balancer" }, { $set: { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } }, { upsert: true } )db.settings.update( { _id: "balancer" }, { $set: { activeWindow : { start : "01:00", stop : "03:00" } } }, { upsert: true } ) -
Execute
sh.status()para verificar. A saída exibe a janela de tempo ativa:
Remover a janela de tempo ativa
Para restaurar o balanceamento contínuo, remova a janela de tempo ativa:
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })
Ative o balancer
Ativar o balancer inicia imediatamente a migração de dados caso o sharding esteja configurado, o que consome recursos da instância. Realize esse procedimento em horários de baixa demanda.
Connect to the sharded cluster instance by using the mongo shell.
-
Mude para o banco de dados config:
use config -
Ative o balancer:
sh.setBalancerState(true)
Desativar o balancer
Um balancer desativado interrompe a migração de dados entre os nós de shard, o que pode causar desequilíbrio de dados.
Connect to the sharded cluster instance by using the mongo shell.
-
Mude para o banco de dados config:
use config -
Verifique se o balancer está migrando dados. Interprete o valor de retorno conforme descrito em Check the balancer status.
Se o resultado for
false(ouinBalancerRound: falsepara valores de retorno Map), prossiga para a próxima etapa.Caso o resultado seja
true(ouinBalancerRound: true), aguarde a conclusão da migração. Desativar o balancer durante uma migração pode causar inconsistência de dados.
sh.isBalancerRunning() -
Quando o balancer estiver ocioso, desative-o:
sh.stopBalancer()
Referências
Perguntas frequentes
É normal que documentos órfãos sejam gerados após a ativação do balancer e como devo lidar com eles?
Documentos órfãos podem surgir quando uma migração de chunk é interrompida ou revertida, ou quando uma chave de shard inadequada distribui os dados de forma desigual. Nessas situações, uma operação moveChunk pode deixar dados residuais no shard de origem.
A contagem de documentos órfãos pode oscilar enquanto o balancer migra chunks frequentemente. Isso é considerado normal se a contagem eventualmente cair para 0 e não permanecer elevada por muito tempo.
O balanceamento também pode ser acionado automaticamente quando a diferença de volume de dados entre coleções ultrapassa o limiar padrão, como 200 MB. Esse processo pode criar documentos órfãos temporariamente.
Se os documentos órfãos persistirem, verifique os logs do balancer em busca de erros de migração e confirme se a chave de shard está distribuindo os dados uniformemente. Após a conclusão de todas as migrações de chunks, execute cleanupOrphaned para remover os documentos órfãos restantes.