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, agende uma janela de tempo ativa ou ative e desative o recurso.
Os exemplos neste tópico usam o mongo shell. Comandos e saídas podem variar em outras ferramentas.
Como funciona
O balancer monitora a distribuição de dados nos nós de shard e migra dados automaticamente. O comportamento varia conforme a versão do mecanismo de banco de dados.
MongoDB 5.0 e anteriores
O balancer rastreia a quantidade 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 deixou de estar equilibrada ou que cada shard possui apenas um único chunk. Esse é o comportamento esperado do novo balancer. Para mais detalhes, consulte Contagem de chunks desequilibrada entre shards após uma atualização do MongoDB.
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. Agende a janela ativa para horários de baixa demanda.
Verifique o status do balancer
Antes de desativar o balancer, verifique se nenhuma migração está em andamento.
Conecte-se à instância de cluster com sharding usando o 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. Verifique 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 períodos de pico.
Conecte-se à instância de cluster com sharding usando o mongo shell.
-
Mude para o banco de dados config:
use config -
Defina 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 mostra a janela de tempo ativa:
Remova 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, consumindo recursos da instância. Realize este procedimento em horários de baixa demanda.
Conecte-se à instância de cluster com sharding usando o mongo shell.
-
Mude para o banco de dados config:
use config -
Ative o balancer:
sh.setBalancerState(true)
Desative 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.
Conecte-se à instância de cluster com sharding usando o 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 Verifique o status do balancer.
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()