Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/

Balanceador de cluster fragmentado

Nesta página

  • Internos do balanceador
  • Procedimento de migração de faixa
  • Tamanho do fragmento

O balancer MongoDB é um processo de plano de fundo que monitora a quantidade de dados em cadafragmento para cada coleção fragmentada. Quando a quantidade de dados de uma collection fragmentada em determinado shard atingelimites de migração específicos, o balancer tenta migrar automaticamente os dados entre shards e alcançar uma quantidade uniforme de dados por shard, respeitando as zonas. Por padrão, o processo de balancer está sempre ativado.

O procedimento de balanceamento para clusters fragmentados é totalmente transparente para o usuário e a camada do aplicativo, embora possa haver algum impacto no desempenho durante a execução do procedimento.

Diagrama de uma coleção distribuído em três fragmentos. Para esta coleção, a diferença no número de blocos entre os fragmentos atinge os *limites de migração* (neste caso, 2) e aciona a migração.

O balanceador executa na primária do conjunto de réplicas do servidor de configuração (CSRS).

As migrações de faixa carregam algumas despesas indiretas em termos de largura de banda e carga de trabalho, ambas podendo afetar o desempenho do banco de dados. O balanceador tenta minimizar o impacto por:

  • Restringir um fragmento a no máximo uma migração por vez. Especificamente, um fragmento não pode participar de várias migrações de dados ao mesmo tempo. O balanceador migra os intervalos um de cada vez.

    O MongoDB pode executar migrações de dados paralelas, mas um fragmento pode participar de, no máximo, uma migração por vez. Para um cluster fragmentado com n fragmentos, o MongoDB pode executar no máximo n/2 (arredondado para baixo) migrações simultâneas.

    Consulte também Limpeza de migração de faixa assíncrona.

  • Iniciar uma rodada de balanceamento somente quando a diferença na quantidade de dados entre o fragmento com mais dados para uma coleção fragmentada e o fragmento com menos dados para essa coleção atingir o limite de migração.

Você pode desativar o balanceador temporariamente para manutenção. Consulte Desabilitar o Balanceador para detalhes.

Você também pode limitar a janela durante a qual o balanceador é executado para evitar que ele afete o tráfego de produção. Consulte Agendar a janela de balanceamento para obter detalhes.

Observação

A especificação da janela de balanceamento é relativa ao fuso horário local da primária do conjunto de réplicas do servidor de configuração.

Dica

Veja também:

Adicionar um fragmento a um cluster cria um desequilíbrio, pois o novo fragmento não tem dados. Enquanto o MongoDB começa a migrar dados para o novo fragmento imediatamente, pode levar algum tempo até que o cluster equilibre. Consulte o tutorial Adicionar fragmentos a um cluster para obter instruções sobre como adicionar um fragmento a um cluster.

A remoção de um fragmento de um cluster cria um desequilíbrio semelhante, pois os dados que residem nesse fragmento devem ser redistribuídos por todo o cluster. Enquanto o MongoDB começa a drenar um fragmento removido imediatamente, pode levar algum tempo até que o cluster equilibre. Não desligue os servidores associados ao fragmento removido durante esse processo.

Quando você remove um fragmento em um cluster com uma distribuição desigual de fragmentos, o balanceador primeiro remove os fragmentos do fragmento de drenagem e, em seguida, equilibra a distribuição desigual de fragmentos restante.

Consulte o tutorial Remove Shards from a Cluster (Remover fragmentos de um cluster) para obter instruções sobre como remover com segurança um fragmento de um cluster.

Todas as migrações de faixa usam o seguinte procedimento:

  1. O processo do balanceador envia o comando moveRange para o fragmento de origem.

  2. A origem inicia a transferência quando recebe um comando moveRange interno. Durante o processo de migração, as operações para a faixa são enviadas para o fragmento de origem. O fragmento de origem é responsável pelas operações de escrita recebidas para a faixa.

  3. O fragmento de destino cria todos os índices exigidos pela origem que não existem no destino.

  4. O fragmento de destino começa a solicitar documentos no intervalo e começa a receber cópias dos dados. Consulte também Migração e replicação de faixa.

  5. Depois de receber o documento final no intervalo, o fragmento de destino inicia um processo de sincronização para garantir que ele tenha as alterações nos documentos migrados que ocorreram durante a migração.

  6. Quando totalmente sincronizado, o fragmento de origem se conecta ao banco de dados de configuração e atualiza os metadados do cluster com o novo local do intervalo.

  7. Depois que o fragmento de origem concluir a atualização dos metadados e quando não houver cursores abertos no intervalo, o fragmento de origem excluirá sua cópia dos documentos.

    Observação

    Se o balanceador precisar executar migrações de parte adicionais do fragmento de origem, ele poderá iniciar a próxima migração de parte sem esperar que o processo de migração atual termine essa etapa de exclusão.Consulte Limpeza da migração de faixa assíncrona.

    Dica

    Veja também:

Para minimizar o impacto do balanceamento no cluster, o balanceador só começa a fazer o balanceamento depois que a distribuição de dados de uma coleção fragmentada atinge determinados limites.

Uma coleção é considerada balanceada se a diferença de dados entre fragmentos (para aquela coleção) for menor que três vezes o tamanho do intervalo configurado para a coleção. Para o tamanho de intervalo padrão de 128MB, dois fragmentos devem ter uma diferença de tamanho de dados para uma determinada coleção de pelo menos 384MB para que uma migração ocorra.

Para migrar dados de um fragmento, o balanceador migra os dados um intervalo de cada vez. No entanto, o balanceador não aguarda a conclusão da fase de exclusão da migração atual antes de iniciar a próxima migração de intervalo. Consulte Migração de intervalo para obter informações sobre o processo de migração de intervalo e a fase de exclusão.

Esse comportamento de enfileiramento permite que os fragmentos descarreguem dados mais rapidamente em casos de cluster altamente desequilibrado, como ao realizar carregamentos iniciais de dados sem pré-divisão e ao adicionar novos fragmentos.

Este comportamento também afeta o comando moveRange e scripts de migração que utilizam o comando moveRange podem prosseguir mais rapidamente.

Em alguns casos, as fases de exclusão podem persistir por mais tempo. As migrações de intervalo são aprimoradas para serem mais resilientes no caso de um failover durante a fase de exclusão. Os documentos órfãos são limpos mesmo se o conjunto de réplicas principal falhar ou recomeçar durante essa fase.

A configuração do balanceador do _waitForDelete pode alterar o comportamento de forma que a fase de exclusão da migração atual bloqueie o início da próxima migração de chunk. O _waitForDelete geralmente é para fins de testes internos. Para mais informações, consulte Aguardar exclusão.

Durante a migração de intervalo, o valor _secondaryThrottle determina quando a migração prossegue com o próximo documento no intervalo.

Na coleção config.settings:

  • Se a configuração _secondaryThrottle do balanceador for definida como um write concern, cada documento movido durante a migração de intervalo deverá receber a confirmação solicitada antes de prosseguir com o próximo documento.

  • Se a configuração _secondaryThrottle nã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.

Para atualizar o parâmetro _secondaryThrottle para o balanceador, consulte Acelerador secundário para obter um exemplo.

Independentemente de qualquer configuração de _secondaryThrottle , determinadas fases da migração de intervalo têm a seguinte política de replicação:

  • O MongoDB pausa brevemente todas as leituras e gravações do aplicativo na coleção que está sendo migrada para o fragmento de origem antes de atualizar os servidores de configuração com o local do intervalo. O MongoDB retoma as leituras e gravações do aplicativo após a atualização. A movimentação de intervalo exige que todas as gravações sejam reconhecidas pela maioria dos membros do conjunto de réplicas antes e depois de confirmar a movimentação de intervalo nos servidores de configuração.

  • Quando uma migração de saída é concluída e a limpeza ocorre, todas as gravações devem ser replicadas para a maioria dos servidores antes que outras limpezas (de outras migrações de saída) ou novas migrações de entrada possam prosseguir.

Para atualizar a configuração do _secondaryThrottle na coleção config.settings, consulte Aceleramento secundário para um exemplo.

Por padrão, o MongoDB não poderá mover um intervalo se o número de documentos do intervalo for maior do que o dobro do resultado da divisão do tamanho do intervalo configurado pelo tamanho médio do documento. Se o MongoDB puder mover um subintervalo de um bloco e reduzir o tamanho para menos do que isso, o balanceador o fará migrando um intervalo. db.collection.stats() inclui o campo avgObjSize, que representa o tamanho médio do documento na coleção.

Para partes que são muito grandes para serem migradas:

Você pode ajustar o impacto no desempenho das exclusões de intervalo com rangeDeleterBatchSize e rangeDeleterBatchDelayMS parâmetros. Por exemplo:

  • Para limitar o número de documentos excluídos por lote, você pode definir rangeDeleterBatchSize para um valor pequeno, como 32.

  • Para adicionar um atraso adicional entre as exclusões em lote, você pode definir rangeDeleterBatchDelayMS acima do padrão atual de 20 milissegundos.

Observação

Se houver operações de leitura em andamento ou cursores abertos na coleção destinada a exclusões, os processos de exclusão de intervalo podem não continuar.

A partir do MongoDB 5.3, durante a migração de intervalo, os eventos de fluxo de alterações não são gerados para atualizações de documentos órfãos.

Por padrão, o MongoDB tenta preencher todo o espaço em disco disponível com dados em cada fragmento à medida que o conjunto de dados cresce. Para garantir que o cluster sempre tenha a capacidade de lidar com o crescimento dos dados, monitore o uso do disco, bem como outras métricas de desempenho.

Consulte o tutorial Alterar o tamanho máximo de armazenamento para um determinado fragmento para obter instruções sobre como configurar o tamanho máximo para um fragmento.

← Modificar o tamanho do intervalo em um cluster fragmentado