Esta página descreve os procedimentos administrativos comuns relacionados ao equilÃbrio. Para obter uma introdução ao balanceamento, consulte Sharded Cluster Balancer. Para obter informações de nÃvel inferior sobre balanceamento, consulte Balancer Internals.
O processo do balancer passou das instâncias mongos para o membro primary do servidor de configuração do conjunto de réplicas.
Verifique o estado do balancer
sh.getBalancerState() verifica se o balancer está habilitado (ou seja, se o balancer tem permissão para ser executado). sh.getBalancerState() não verifica se o balancer está migrando dados ativamente.
Para ver se o balanceador está habilitado no seu cluster fragmentado, execute o seguinte comando, que retorna um booleano:
sh.getBalancerState()
Você também pode ver se o balanceador está habilitado usando sh.status(). O campo currently-enabled indica se o balanceador está habilitado, e o campo currently-running indica se o balanceador está atualmente em execução.
Verifique se o balanceador está em execução
Para ver se o processo do balanceador está ativo em seu agrupamento:
Utilize a seguinte operação para determinar se o balanceador está executando:
sh.isBalancerRunning()
Configurar tamanho do intervalo padrão
O tamanho do intervalo padrão de um cluster fragmentado é de 128 megabytes. Na maioria das situações, o tamanho padrão é apropriado para dividir e migrar blocos. Para informações sobre como o tamanho do intervalo afeta as implantações, consulte detalhes, consulte Tamanho do intervalo.
A alteração do tamanho do intervalo padrão afeta os intervalos que forem processos durante as migrações e as divisões automáticas, mas não afeta todos os intervalos de forma retroativa.
Para configurar o tamanho padrão da faixa, consulte Modificar o tamanho da faixa em um cluster fragmentado.
Agendamento da janela de balanceamento
Em algumas situações, especialmente quando o conjunto de dados cresce lentamente e uma migração pode afetar o desempenho, é útil garantir que o balanceador esteja ativo apenas em determinados momentos. O procedimento a seguir especifica o activeWindow, que é o perÃodo durante o qual o balanceador poderá migrar os blocos:
Mudar para o banco de dados de configuração.
Dê o seguinte comando para passar para o banco de dados de configuração.
use config
Certifique-se de que o balanceador não stopped seja.
O balanceador não será ativado no estado stopped. Para garantir que o balanceador não seja stopped, utilize sh.startBalancer(), como no seguinte:
sh.startBalancer()
O balanceador não será iniciado se você estiver fora do perÃodo da activeWindow.
Modifique a janela do balanceador.
Configure o activeWindow utilizando updateOne(), como no seguinte:
db.settings.updateOne( { _id: "balancer" }, { $set: { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } }, { upsert: true } )
Substitua <start-time> e <end-time> por valores de tempo usando valores de hora e minuto de dois dÃgitos (ou seja, HH:MM) que especificam os limites inicial e final da janela de balanceamento.
Para valores de
HH, utilize valores na faixa de hora variando de00a23.Para o valor
MM, use valores de minuto que variam de00a59.
Para clusters fragmentados locais ou autogerenciados, o MongoDB avalia os horários de inÃcio e parada em relação ao fuso horário do membro primário no conjunto de réplicas do servidor de configuração.
Para o Atlas cluster, o MongoDB avalia os horários de inÃcio e parada em relação ao fuso horário UTC.
Observação
A janela do balanceador deve ser suficiente para concluir a migração de todos os dados inseridos durante o dia.
Como as taxas de inserção de dados podem mudar de acordo com os padrões de atividade e uso, é importante garantir que a janela de balanceamento selecionada seja suficiente para dar suporte às necessidades de sua implantação.
Remoção de um agendamento de janela de balanceamento
If you have set the balancing window and wish to remove the schedule so that the balancer is always running, use $unset to clear the activeWindow, as in the following:
use config db.settings.updateOne( { _id : "balancer" }, { $unset : { activeWindow : true } } )
Desabilitar o balancer
Importante
Deixar o balanceador desativado por longos perÃodos de tempo pode levar a shards desequilibrados, que degradam o desempenho do cluster. Desative o balanceador apenas se necessário e certifique-se de reativar o balanceador quando a manutenção for concluÃda.
Por padrão, o balanceador pode executar a qualquer momento e mover apenas os blocos conforme necessário. Para desabilitar o balanceador por um curto perÃodo de tempo e evitar toda a migração, use o seguinte procedimento:
Comande a seguinte operação para desativar o balanceador:
sh.stopBalancer() Se houver uma migração em andamento, o sistema concluirá a migração em andamento antes de encerrar.
Para verificar se o balanceador não iniciará, execute o seguinte comando, que retornará
falsese o balanceador estiver desabilitado:sh.getBalancerState() Optionally, to verify no migrations are in progress after disabling, run the following operation in the
mongoshshell:use config while( sh.isBalancerRunning() ) { print("waiting..."); sleep(1000); }
Observação
Para desativar o balanceador a partir de um driver, use o comando balancerStop no banco de dados admin, como a seguir:
db.adminCommand( { balancerStop: 1 } )
A partir do MongoDB 7.0, interromper o balanceador também desativará o AutoMerger para o cluster fragmentado.
Habilite o balanceador
Use este procedimento se você tiver desabilitado o balancer e estiver pronto para reativá-lo:
Comande uma das seguintes operações para habilitar o balanceador:
From the
mongoshshell, issue:sh.startBalancer() Observação
Para habilitar o balanceador a partir de um driver, use o comando BalancerStart no
adminbanco de dados , como mostrado a seguir:db.adminCommand( { balancerStart: 1 } )
A partir do MongoDB 7.0, iniciar o balanceador também habilita a AutoMerger para o cluster fragmentado.
Desativação do balanceamento durante backups
Observação
Disabling the balancer is only necessary when manually taking backups, either by calling mongodump or scheduling a task that calls mongodump at a specific time.
Não é necessário desativar o balancer ao usar processos coordenados de backup e restauração:
Se o MongoDB migrar um bloco durante um backup, você poderá terminar com um instantâneo inconsistente do cluster fragmentado. Nunca execute um backup enquanto o balanceador estiver ativo. Para garantir que o balanceador esteja inativo durante a operação de backup:
Set the balancing window so that the balancer is inactive during the backup. Ensure that the backup can complete while you have the balancer disabled.
Desative manualmente o balanceador durante o procedimento de backup.
Se você desligar o balanceador enquanto ele estiver no meio de uma rodada de balanceamento, o desligamento não será instantâneo. O balanceador completa o movimento do bloco em andamento e, em seguida, interrompe todas as rodadas de balanceamento adicionais.
Antes de iniciar uma operação de cópia de segurança, confirme se o balanceador não está ativo. Você pode usar o seguinte comando para determinar se o balanceador está ativo:
!sh.getBalancerState() && !sh.isBalancerRunning()
Quando o procedimento de backup estiver concluÃdo, você poderá reativar o processo do balanceador.
Desativação do balanceamento em uma collection
Você pode desabilitar o balanceamento para uma collection especÃfica com o método sh.disableBalancing(). Talvez você queira desabilitar o balancer para uma collection especÃfica para permitir operações de manutenção ou volumes de trabalho atÃpicos, por exemplo, durante ingestões de dados ou exportações de dados.
Se você desabilitar o balanceamento em uma coleção, o MongoDB não interromperá as migrações em andamento.
To disable balancing on a collection, connect to a mongos with the mongosh shell and call the sh.disableBalancing() method.
Por exemplo:
sh.disableBalancing("students.grades")
O método sh.disableBalancing() aceita como seu parâmetro o espaço de nomes completo da coleção.
Como habilitar o balanceamento em uma coleção
Você pode habilitar o equilÃbrio para uma coleção especÃfica com o método sh.enableBalancing().
Quando você habilita o equilÃbrio para uma coleção, o MongoDB não imediatamente começará a equilibrar dados. No entanto, se os dados em sua coleção fragmentada não estiverem balanceados, o MongoDB poderá começar a distribuir os dados de maneira mais uniforme.
To enable balancing on a collection, connect to a mongos with the mongosh shell and call the sh.enableBalancing() method.
Por exemplo:
sh.enableBalancing("students.grades")
O método sh.enableBalancing() aceita como seu parâmetro o espaço de nomes completo da coleção.
Verifique se o equilÃbrio está ativado ou desativado
Para confirmar se o balanceamento de uma coleção está ativado ou desativado, consulte a coleção collections no banco de dados config para obter o namespace da coleção e verifique o campo noBalance. Por exemplo:
db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;
Essa operação retornará um erro de valor null, true, false ou nenhuma saÃda:
Um erro de valor null indica que o namespace da collection está incorreto.
Se o resultado for
true, o balanceamento será desativado.Se o resultado for
false, o equilÃbrio está habilitado atualmente, mas foi desabilitado no passado para a coleção. O balanceamento dessa coleção começará na próxima vez que o balanceador for executado.Se a operação não retornar saÃda, o balanceamento será habilitado atualmente e nunca foi desabilitado no passado para esta coleção. O balanceamento dessa coleção começará na próxima vez que o balanceador for executado.
Você também pode ver se o balanceador está ativado usando sh.status(). O campo currently-enabled indica se o balanceador está habilitado.
Alteração do comportamento de replicação para migração de partes
Acelerador secundário
Durante a migração de bloco, o valor de _secondaryThrottle determina quando a migração prossegue com o próximo documento no bloco.
Na coleção config.settings:
Se a configuração
_secondaryThrottlepara o balanceador estiver definida como uma preocupação de gravação, cada documento movido durante a migração de parte deverá receber a confirmação solicitada antes de prosseguir com o próximo documento.Se a configuração
_secondaryThrottlenão for definida, o processo de migração não aguardará a replicação em um secundário e, em vez disso, continuará com o próximo documento.Este é o comportamento padrão para WiredTiger.
To change the _secondaryThrottle setting, connect to a mongos instance and directly update the _secondaryThrottle value in the settings collection of the config database. For example, from a mongosh shell connected to a mongos, run the following command:
use config db.settings.updateOne( { "_id" : "balancer" }, { $set : { "_secondaryThrottle" : { "w": "majority" } } }, { upsert : true } )
Os efeitos de alterar a configuração do _secondaryThrottle podem não ser imediatos. Para garantir um efeito imediato, pare e reinicie o balanceador para habilitar o valor selecionado de _secondaryThrottle.
Para obter mais informações sobre o comportamento de replicação durante várias etapas da migração de bloco, consulte Intervalo de migração e replicação.
Utilize as opções
moveRangeesecondaryThrottledo comandowriteConcernpara especificar o comportamento durante o comando.Utilize as opções
moveChunke_secondaryThrottledo comandowriteConcernpara especificar o comportamento durante o comando.
Para detalhes, consulte moveRange e moveChunk.
Aguarde a exclusão
A configuração _waitForDelete do balanceador e do comando moveChunk afetam a forma como o balanceador migra vários blocos de um fragmento. Da mesma forma, a configuração _waitForDelete do balanceador e o comando moveRange também afetam a forma como o balanceador migra vários blocos de um fragmento. Por padrão, o balanceador não espera que a fase de exclusão da migração em andamento seja concluÃda antes de iniciar a próxima migração de partes. Para que a fase de exclusão bloqueie o inÃcio da próxima migração de fragmento, você pode definir _waitForDelete como true.
Para obter detalhes sobre migração de chunk, consulte Migração de faixa. Para obter detalhes sobre o comportamento de enfileiramento da migração de chunk, consulte Limpeza de migração de faixa assÃncrona.
Importante
Quando o campo _waitForDelete é configurado, o MongoDB não espera pelo atraso orphanCleanupDelaySecs antes de realizar a exclusão da faixa. Se você utilizar o parâmetro _waitForDelete e houver operações de leitura ocorrendo em réplicas secundárias, a leitura poderá não encontrar documentos devido à fase de exclusão da migração.
Para alterar o valor de _waitForDelete do balanceador:
Conecte a uma instância do
mongos.Atualize o valor do
_waitForDeletena coleçãosettingsdo banco de dados de configuração. Por exemplo:use config db.settings.updateOne( { "_id" : "balancer" }, { $set : { "_waitForDelete" : true } }, { upsert : true } )
Após definir para true, reverta para o comportamento padrão:
Conecte a uma instância do
mongos.Atualize ou desmarque o campo
_waitForDeletena coleçãosettingsdo banco de dados de configuração:use config db.settings.updateOne( { "_id" : "balancer", "_waitForDelete": true }, { $unset : { "_waitForDelete" : "" } } )
Intervalos de balanceamento que excedem o limite do tamanho
Por padrão, o MongoDB não poderá mover uma faixa se o número de documentos dela for maior do que o dobro do resultado da divisão do tamanho da faixa configurado pelo tamanho médio do documento.
Ao especificar a configuração do balanceador attemptToBalanceJumboChunks como true, ele pode migrar esses grandes intervalos, desde que não tenham sido rotulados como jumbo.
To set the balancer's attemptToBalanceJumboChunks setting, connect to a mongos instance and directly update the config.settings collection. For example, from a mongosh shell connected to a mongos instance, run the following command:
db.getSiblingDB("config").settings.updateOne( { _id: "balancer" }, { $set: { attemptToBalanceJumboChunks : true } }, { upsert: true } )
Se a faixa que você deseja mover estiver rotulado como jumbo, você poderá limpar manualmente o sinalizador jumbo para que a balancer tente migrar a faixa.
Você também pode migrar manualmente os intervalos que excederem o limite de tamanho (com ou sem o rótulo jumbo) utilizando:
o comando
moveRangecom a opção forceJumbo: trueo comando
moveChunkcom a opção forceJumbo: true
No entanto, quando você executa moveRange ou moveChunk com forceJumbo: true, as operações de gravação na coleção podem bloquear por um longo perÃodo de tempo durante a migração.