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
  • Tamanho e balanceamento do pedaço

O balancer MongoDB é um processo de plano de fundo que monitora a quantidade de dados em cada fragmento 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).

Para configurar o balanceamento de coleção para uma única coleção, consulte configureCollectionBalancing.

Para gerenciar o balanceador de cluster fragmentado, consulte Gerenciar balanceador de cluster fragmentado.

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.

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 rangeDeleterBatchSizeparâmetros , rangeDeleterBatchDelayMSe rangeDeleterHighPriority. 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.

  • Para priorizar exclusões de intervalo, você pode configurar rangeDeleterHighPriority para true. As exclusões de intervalo são tarefas em segundo plano potencialmente de longa execução que podem afetar negativamente a taxa de transferência das operações do usuário quando o sistema está sob carga pesada.

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.

Para uma introdução ao chunkSize, consulte Modificar o Tamanho do Intervalo em um Cluster fragmentado.

A tabela a seguir descreve como o chunkSize afeta a desfragmentação e as operações do balanceador em diferentes versões MongoDB.

Versão do MongoDB
Descrição
MongoDB 6.0 e posterior

Quando os dados de coleta compartilhados entre dois estilhaços diferem em três ou mais vezes a configuração de chunkSize configurada, o balanceador migra partes entre os fragmentos.

Por exemplo, se chunkSize for de 128 MB e os dados de coleta forem diferentes em 384 MB ou mais, o balanceador migrará partes entre os estilhaços.

Mais cedo do que MongoDB 6.0
Quando um pedaço fica maior que chunkSize, o pedaço é dividido.

Quando blocos são movidos, divididos ou mesclados, os metadados do fragmento são atualizados após a operação do bloco ser cometida por um servidor de configuração. Os fragmentos não envolvidos na operação de bloco também são atualizados com novos metadados.

O tempo para a atualização de metadados do fragmento é proporcional ao tamanho da tabela de roteamento. As operações CRUD na coleção são temporariamente bloqueadas enquanto os metadados de fragmento são atualizados, e uma tabela de roteamento menor significa atrasos de operação CRUD mais curtos.

Desfragmentar uma coleção reduz o número de blocos e o tempo para atualizar os metadados de bloco.

Para reduzir a carga de trabalho do sistema, configure o balanceador para ser executado somente em um horário específico usando uma janela de balanceamento de fragmentos. A desfragmentação é executada durante o período da janela de equilíbrio.

Você pode utilizar o parâmetro chunkDefragmentationThrottlingMS para limitar a taxa de comandos de divisão e mesclagem executados pelo balanceador.

Você pode iniciar e parar a desfragmentação a qualquer momento.

Você também pode definir uma zona de fragmento. Uma zona de fragmento é baseada na chave de fragmento e você pode associar cada zona a um ou mais fragmentos em um cluster.

A partir do MongoDB 6.0, um cluster fragmentado divide apenas as partes quando as partes devem ser migradas. Isso significa que o tamanho da parte pode exceder chunkSize. Blocos maiores reduzem o número de blocos em um fragmento e melhoram o desempenho porque o tempo para atualizar os metadados do fragmento é reduzido. Por exemplo, você pode ver um bloco de 1 TB em um fragmento, mesmo que tenha configurado chunkSize para 256 MB.

chunkSize afeta o seguinte:

  • Quantidade máxima de dados que o balanceador tenta migrar entre dois fragmentos em uma única operação de migração de bloco.

  • Quantidade de dados migrados durante a desfragmentação.

Para obter detalhes sobre como desfragmentar coleções fragmentadas, consulte Desfragmentar coleções fragmentadas.

← Modificar o tamanho do intervalo em um cluster fragmentado