Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Menu Docs
Página inicial do Docs
/

Solucionar problemas de atraso de replicação

O atraso na replicação torna os nós "atrasados" inelegíveis para se tornarem primary rapidamente e aumenta a possibilidade de que as operações de leitura distribuída sejam inconsistentes.

Esta página contém várias dicas que podem reduzir o atraso de replicação, No entanto, muitos casos podem exigir escalonamento. Se você não conseguir determinar a causa do atraso de replicação ou precisar de suporte adicional, entre em contato com o Suporte técnico.

Para verificar o comprimento atual do atraso de replicação em seu sistema:

  • Em uma mongosh sessão do que está conectada ao primário, chame o método para exibir o atraso atual em cada secundário relativo ao host rs.printSecondaryReplicationInfo() primário.

    Retorna o valor syncedTo para cada membro, que mostra o horário em que a última entrada do oplog foi gravada no secundário, conforme mostrado no exemplo a seguir:

    source: m1.example.net:27017
    syncedTo: Thu Apr 10 2014 10:27:47 GMT-0400 (EDT)
    7230 secs (2 hrs) behind the primary
    source: m2.example.net:27017
    syncedTo: Thu Apr 10 2014 10:27:47 GMT-0400 (EDT)
    0 secs (0 hrs) behind the primary

    O número de segundos atrás do primário informa o quanto o secundário está atrasado em relação ao primário.

    Um membro atrasado pode aparecer como 0 segundos atrás do primário quando o período de inatividade no primário for maior que o valor members[n].secondaryDelaySecs.

  • Nas implantações do Atlas , monitore a taxa de replicação nas implantações do Atlas verificando valores de tempo de oplog diferentes de zero ou aumentando no Replication Lag gráfico de disponível no Cloud Manager e no Ops Manager.

    Adicionalmente, você pode monitorar o atraso de replicação no Atlas Replication Lag Oplog GB/Hourverificando, e Replication Oplog Window na aba de métricas do seu cluster. Para obter mais informações, consulte Verificar métricas disponíveis.

Não há código de erro para atraso de replicação e nenhuma maneira imediata de determinar a causa. No entanto, antes de escalar para o suporte, verifique se os seguintes problemas podem estar causando seu atraso:

O atraso de replicação pode aumentar quando os nós do cluster não podem se comunicar de forma confiável uns com os outros.

Verifique as rotas de rede entre os membros do seu conjunto de réplicas para garantir que não haja perda de pacote ou problemas de roteamento de rede.

Use ferramentas, incluindo para testar a latência entre ping membros traceroute definidos e para expor o roteamento de pacotes entre pontos de extremidade da rede.

Como alternativa, execute e examine replSetGetStatus o pingMs campo . Isso retorna a latência de rede atual em milissegundos entre os nós primários e secundários.

Os nós secundários podem enfrentar contenção de recursos quando não conseguem lidar com eficiência com as operações de leitura recebidas do primário. Isso pode causar problemas de memória, como contenção de cache. Quando o cache atinge limites críticos, o servidor usa threads de aplicação para remover páginas, o que reduz o número de threads disponíveis para gerenciar a replicação.

Para ver se o servidor redireciona threads de aplicação para tarefas de despejo, execute o seguinte comando em sua shell mongosh:

db.serverStatus().wiredTiger.cache['pages evicted by application threads']
  • Se Resultado 0 =: nenhum thread de aplicação é pausado para remoção.

  • Se Resultado > 0 (e aumentando): o banco de dados está sob pressão de cache. As queries de entrada devem remover dados armazenados em cache antes de serem executadas, o que pode aumentar o atraso de replicação.

Os usuários do Atlas também podem monitorar as métricas WiredTiger Cache Activity e Page Faults para investigar problemas relacionados ao cache.

Para ver possíveis estratégias para corrigir esse problema, consulte Dimensionar seus recursos.

Se um nó secundário não conseguir liberar dados sujos para o disco com rapidez suficiente, ele ficará atrás do primário. Esse surgimento ocorre quando o volume de gravações do primário excede a velocidade de gravação do disco do secundário.

Problemas relacionados a disco prevalecem em sistemas de vários inquilinos, incluindo instâncias virtualizadas, e podem ser transitórios se o sistema acessar dispositivos de disco em uma rede IP.

Para avaliar o status do disco, use ferramentas no nível do sistema, como iostat ou vmstat.

Os usuários do Atlas podem acessar as métricas do Atlas , como Disk IOPS e,Disk Space Used para investigar problemas de disco.

Algumas causas comuns de problemas de disco incluem:

  • Subprovisionamento: o secundário tem discos mais lentos ou IOPS mais baixo do que o principal.

  • Sobrecarga de virtualização: em ambientes compartilhados, outras máquinas virtuais podem saturar o controlador de disco físico.

Algumas possíveis soluções para problemas de disco incluem:

Em alguns casos, operações de longa duração no primário podem bloquear a replicação nos secundários. Para obter melhores resultados, configure a preocupação de gravação para exigir a confirmação da replicação para os secundários. Isso impede que as operações de gravação retornem se a replicação não puder acompanhar a carga de gravação.

Você também pode usar o profiler de banco de dados para identificar queries lentas ou operações de longa duração que se correlacionam com o atraso observado.

As operações de escrita em massa podem exceder a capacidade dos conjuntos de réplicas de replicar em tempo hábil, causando atraso de replicação.

As subseções a seguir oferecem possíveis soluções para esse problema:

Controle a carga agrupando e filtrando comandos CRUD.

Execute cada lote em relação a uma data ou intervalo de tempo, como um mês, uma semana ou um dia. Certifique-se de que os filtros de query usem um índice para evitar varreduras de collection. As verificações de collection podem remover dados e páginas de índice do conjunto de trabalho e aumentar o atraso de replicação.

Comece excluindo pequenos intervalos de datas. Se essas operações forem concluídas em segundos, aumente o tamanho do lote . Monitore rs.printSecondaryReplicationInfo() o atraso de replicação com. Aumente o tamanho do lote até atingir um equilíbrio entre taxa de transferência e atraso de replicação. Continue monitorando a carga do sistema, o impacto em outros usuários e aplicativos e até que ponto os secundários estão atrasados.

Por exemplo:

db.collName.deleteMany({createdDate: {$gte: new Date("2018-12-01"), $lt: new Date("2019-01-01")}});
db.collName.deleteMany({createdDate: {$gte: new Date("2018-11-01"), $lt: new Date("2018-12-01")}});
db.collName.deleteMany({createdDate: {$gte: new Date("2018-10-01"), $lt: new Date("2018-11-01")}});

O MongoDB fornece as seguintes configurações e parâmetros do lado do servidor que podem controlar o uso de recursos durante operações de gravação intensiva:

  • storageEngineConcurrentWriteTransactions: reduzir esse valor pode reduzir a contenção causada por exclusões em massa quando outras operações de gravação ocorrem simultaneamente.

    Observação

    Tenha cuidado ao modificar, pois a alteração da configuração pode levar a problemas ou erros de desempenho. Recomendamos que você consulte o Suporte do MongoDB antes de alterar o storageEngineConcurrentWriteTransactions parâmetro.

  • maxTimeMS: se a operação de gravação em massa for complexa, você poderá limitar seu tempo de execução para evitar operações de longa duração que afetam o desempenho do servidor . Alguns exemplos de operações complexas incluem a correspondência de muitos documentos ou a query por campos não indexados.

Se o campo no qual você executa suas operações em massa não estiver indexado, a operação em massa poderá causar varreduras de collection ou tabela, aumentando o uso de recursos. Garanta que haja um índice no campo usado no filtro de query para exclusões mais rápidas, reduzindo a contenção de bloqueios e melhorando o desempenho.

Crie um índice antes de executar a operação:

db.collection.createIndex({ status: 1 });

Em seguida, exclua com base no campo indexado:

db.collection.deleteMany({ status: "inactive" });

Se a oplog window for muito pequena para a quantidade de dados que está sincronizando, você poderá enfrentar um atraso de replicação. Um oplog maior pode dar a um conjunto de réplicas uma maior tolerância a atrasos.

Para verificar o tamanho do oplog e os intervalos de datas de suas operações para um determinado membro do conjunto de réplica, conecte ao membro no mongosh e execute o rs.printReplicationInfo() método. O oplog deve ser longo o suficiente para manter todas as transações pelo maior tempo de inatividade esperado em um secundário. []1 No mínimo, um oplog deve ser capaz de manter no mínimo 24 horas de operações; no entanto, muitos usuários preferem ter 72 horas ou até mesmo uma semana de trabalho de operações.

Observação

Normalmente, você deseja que o oplog tenha o mesmo tamanho em todos os membros. Se você redimensionar o oplog, redimensione-o em todos os membros.

Para alterar o tamanho do oplog, consulte o tutorial Alterar o tamanho do oplog de membros do conjunto de réplicas autogerenciado .

[1] O oplog pode ultrapassar seu limite de tamanho configurado para evitar a exclusão do majority commit point.

Para confirmar que o problema está resolvido, chame o método e verifique se não há mais membros rs.printSecondaryReplicationInfo() atrasados.

Se nenhuma das soluções acima reduzir seu atraso, entre em contato com o suporte. O suporte pode solicitar diagnósticos para diagnosticar melhor seu problema.

Alguns diagnósticos úteis para os usuários do Atlas coletarem para suporte incluem:

  • Sua rs.printSecondaryReplicationInfo() saída

  • A linha do tempo de quando o atraso começou

  • Quaisquer alterações recentes em seu sistema, como alterações em esquema, índices, aplicação, nível ou hardware.

Voltar

Nenhum conjunto de réplicas principal

Nesta página