Para qualquer banco de dados, o balanceamento de carga de todas as solicitações provenientes de clientes é um mecanismo importante e fundamental para garantir a escalabilidade. Uma solução de balanceamento de carga adequada distribui todas as solicitações do cliente uniformemente por todos os recursos do banco de dados. Se o cluster de banco de dados não estiver protegido com uma solução de balanceamento de carga adequada, seu banco de dados não poderá lidar com o aumento da carga de tráfego nele.
Felizmente, o MongoDB fornece suporte embutido para balanceamento de carga de alto tráfego, suportando dimensionamento horizontal por meio de fragmentação. Você pode distribuir os dados de suas coleções em vários servidores usando fragmentação. Você também pode adicionar novos servidores/máquinas ao cluster para lidar com o aumento do tráfego no banco de dados. Você pode seguir este guia para converter seu cluster de réplica do MongoDB em um cluster de fragmentação.
Neste artigo, aprenderemos sobre o comportamento do processo do balanceador que é executado nos clusters fragmentados do MongoDB e como modificar seu comportamento. O processo do balanceador do MongoDB se encarrega de distribuir suas coleções uniformemente pelos estilhaços. Por exemplo, se um fragmento de seu cluster contiver muitos fragmentos de sua coleção de fragmentos, esse fragmento específico poderá receber mais tráfego em comparação com outros fragmentos. Portanto, o processo do balanceador equilibra os blocos de coleções corretamente nos estilhaços. Na maioria das implantações do MongoDB, as configurações padrão do processo do balanceador são suficientes para operações normais. Mas, em algumas situações, os administradores de banco de dados podem querer alterar o comportamento padrão desse processo. Se você deseja modificar o comportamento padrão do processo do balanceador para quaisquer necessidades de nível de aplicativo ou requisitos operacionais, siga este guia.
Vamos começar com alguns comandos básicos para obter algumas informações sobre o estado e o status do processo do balanceador.
Status do estado do balanceador
Este comando verifica se o balanceador está habilitado ou permitido para execução ou não. Se o processo do balanceador não estiver em execução, esse comando retornará false. Isso não verificará se o processo do balanceador está em execução ou não.
sh.getBalancerState()
Ativar o processo do balanceador
Se o balanceador não estiver habilitado por padrão, você poderá habilitá-lo executando o seguinte comando. Este comando não iniciará o processo do balanceador, mas habilitará o processo e garantirá que o balanceamento de partes não seja bloqueado quando o processo do balanceador for executado na próxima vez.
sh.enableBalancing(<collection_name/namespace>)
Desabilitar o processo do balanceador
O processo do balanceador é executado a qualquer momento por padrão. Portanto, se você quiser desabilitar o processo do balanceador por algum período de tempo específico, poderá usar o seguinte comando. Um cenário ideal para usar este comando é quando você está fazendo um backup do seu banco de dados.
sh.stopBalancer()
Certifique-se de que o processo do balanceador foi interrompido antes de fazer o backup. Se o processo for habilitado durante o backup do banco de dados, você pode acabar com alguma réplica inconsistente do seu banco de dados. Isso pode acontecer quando o processo do balanceador move alguns fragmentos pelos estilhaços para balanceamento de carga durante o processo de backup.
Você também pode desabilitar o balanceamento em algumas coleções específicas fornecendo o namespace completo de uma coleção como parâmetro usando o comando a seguir.
sh.disableBalancing("<db_name>.<collection_name>")
Status de execução do balanceador
Este comando verifica se o processo do balanceador está em execução ou não. Ele também verifica se está gerenciando ativamente os fragmentos de fragmentação ou não. Retorna true se o processo estiver em execução, caso contrário retorna false.
sh.isBalancerRunning()
Configurações de tamanho de bloco padrão
Por padrão, o tamanho do bloco em qualquer cluster fragmentado do MongoDB é de 64 MB. Para a maioria dos cenários, isso é bom o suficiente para migrar ou dividir os fragmentos fragmentados. No entanto, às vezes, o processo de migração normal envolve mais operações de E/S do que seu hardware pode processar. Nesses tipos de situações, convém reduzir o tamanho dos blocos. Você pode fazer isso executando o seguinte conjunto de comandos.
use config
db.settings.save( { _id:"chunksize", value: <sizeInMB> } )
Se você alterar o tamanho padrão do fragmento no cluster fragmentado, lembre-se do seguinte
- Você pode especificar o tamanho do bloco apenas entre 1 e 1.024 MB
- A divisão automática só acontecerá na inserção ou atualização
- Tamanhos de blocos menores levarão a mais tempo durante o processo de divisão.
Programar balanceamento para um horário específico
Quando o tamanho do banco de dados é grande, os processos de balanceamento ou migração podem afetar o desempenho geral do banco de dados. Portanto, é aconselhável agendar o processo de balanceamento durante uma janela de tempo específica quando a carga no banco de dados for muito menor. Você pode usar os comandos a seguir para definir a janela de tempo para a execução do processo do balanceador.
use config
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } }, true )
Exemplo
O comando a seguir definirá a janela de tempo de 1h às 5h para que o processo de balanceamento seja executado.
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "01:00", stop : "05:00" } } }, true )
Certifique-se de que o prazo determinado é suficiente para um processo de balanceamento completo.
Você também pode remover qualquer janela de tempo do processo de balanceamento existente executando o comando a seguir.
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })
Além dos comandos acima, você também pode alterar o comportamento da replicação ao fazer o processo de migração de fragmentos usando o parâmetro _secondaryThrottle. Além disso, você pode usar a propriedade _waitForDelete com o comando moveChunk para instruir o processo de balanceamento a aguardar a fase de exclusão da migração atual antes de iniciar a nova fase de migração de fragmentos.
Conclusão
Espero que isso seja tudo o que você precisa ao alterar o comportamento padrão do processo do balanceador do MongoDB. O balanceamento é um aspecto muito importante de qualquer cluster fragmentado do MongoDB. Portanto, se você conhece o processo de balanceamento em detalhes, fica muito fácil modificar o comportamento padrão do processo do balanceador de acordo com suas necessidades e casos de uso.