Mongodump afeta muito o desempenho do aplicativo

8

Temos uma instância mongo bastante grande (150 GB) sem sharding, e nosso backup regular ( mongodump) tem um efeito muito significativo no desempenho do aplicativo. Pior que isso, devido ao uso intenso do mongo pelo aplicativo, o backup dura mais de 10 horas.

Sei que precisamos de sharding e temos planos de mudar para o ElasticSearch, por isso estou procurando uma solução de curto prazo.

Existe algo que eu possa fazer para melhorar isso, como limitar o número de consultas por segundo para o mongodump ou algo assim?

Temos um mongo independente em um servidor de RAM de 190 GB com 32 núcleos que o compartilha com nginx, rabbitmq e algumas coisas pequenas. Não é a configuração mais limpa de todas, eu sei :)

Alexander Mikhalchenko
fonte

Respostas:

16

Todos os dados despejados mongodumpdevem ser lidos na memória pelo servidor MongoDB. Também vale a pena notar que mongodumpfaz backup de dados e definições de índice; o tempo para restaurar também pode ser significativamente maior em comparação com outras abordagens, pois mongorestoreserá necessário recriar quaisquer índices secundários após o carregamento dos dados.

Conforme observado na documentação do MongoDB , mongodumpé útil para fazer backup e restaurar pequenas implantações, mas não é ideal para capturar backups completos de sistemas maiores:

Quando conectado a uma instância do MongoDB, o mongodump pode afetar adversamente o desempenho do mongod. Se seus dados forem maiores que a memória do sistema, as consultas empurrarão o conjunto de trabalho para fora da memória, causando falhas na página.

Um servidor autônomo limita suas opções de backup se você também deseja manter sua implantação disponível enquanto faz um backup.

Aqui estão algumas abordagens sugeridas na ordem do mais ao menos recomendado:

Abordagem 1: use um serviço de backup em nuvem

Para a solução mais fácil de curto prazo, consideraria usar um serviço de backup em nuvem comercial como o MongoDB Cloud Manager . O MongoDB Cloud Manager fornece backup contínuo com instantâneos agendados e uma política de retenção (consulte Preparativos para backup para obter mais informações). Um serviço de nuvem também evita que você precise implantar servidores / infraestrutura extras; portanto, mesmo se você planeja fazê-lo no futuro, essa é uma solução útil a curto prazo.

A abordagem geral seria:

Como um benefício adicional, o Cloud Manager também inclui um agente de monitoramento que pode capturar o histórico de métricas da sua implantação e permitir que você configure alertas.

Abordagem 2: converta sua implantação em um conjunto de réplicas e backup de um secundário oculto

Essa abordagem requer o provisionamento de alguma infraestrutura extra, mas descarrega o impacto do backup do servidor principal. Normalmente, os conjuntos de réplicas são provisionados com pelo menos três membros para alta disponibilidade e failover automático, mas se seu único objetivo for backup, você poderá usar uma configuração menos ideal para dois servidores.

A abordagem geral seria:

  • Provisione um segundo servidor que será usado para backup
  • Converta seu servidor independente em um conjunto de réplicas .
  • Adicione seu servidor de backup como um secundário oculto com uma prioridade de 0 (nunca se tornará primário) e 0 votos.
  • Use um dos métodos de backup suportados para fazer backups no seu secundário oculto. Os métodos de backup estão listados em ordem geral de recomendação: mongodé preferível capturar instantâneos do sistema de arquivos (se suportado pela sua configuração) ou cópia de arquivo (supondo que você pare ) mongodump.
  • (idealmente) adicione outro secundário com dados, se desejar os benefícios de alta disponibilidade e failover de uma configuração de conjunto de réplicas.

Abordagem nº 3: use instantâneos do sistema de arquivos (se disponíveis e apropriados)

Uma estratégia de backup menos impactante que a atual mongodumpseria usar instantâneos do sistema de arquivos , supondo que você tenha um sistema de arquivos compatível com instantâneos (e todos os seus dados e arquivos de diário estejam em um único volume para que você possa obter um instantâneo consistente de uma execução mongod). A vantagem dos instantâneos do sistema de arquivos é que todos os dados não precisam ser lidos na memória mongod, no entanto, os instantâneos ainda podem ter impacto (principalmente ao criar o instantâneo inicial em um sistema ocupado). Os instantâneos sucessivos são mais eficientes e menos impactantes, mas ainda não são uma solução de backup completa, pois os instantâneos são locais no servidor (e você só tem um autônomo no momento).

Ressalvas

  • As abordagens 1 e 2 envolvem a ativação da replicação para facilitar os backups. A replicação adicionará algumas E / S locais adicionais ao servidor principal, pois todas as operações de gravação são anotadas em uma coleção limitada especial chamada oplog (log de operações) .

  • Você mencionou uma provável necessidade de sharding no futuro, mas antes disso, eu isolaria sua carga de trabalho do MongoDB dos outros processos que compartilham o mesmo servidor. Se você puder alterar sua estratégia de backup para algo mais eficiente do que mongodumpremover a contenção de recursos e capturar um histórico de métricas de linha de base para revisão ... talvez descubra que o sharding ainda não é necessário.

Stennie
fonte
3

Estou atrasado para a festa, mas encontrei o mesmo problema recentemente em VMs com uma quantidade relativamente pequena de RAM (4 GB de RAM, 50 GB de HD, 5 GB de dados). Nossa solução alternativa é usar a opção do mongodump --forceTableScane, se forem utilizados secundários, adicionar também --readPreference secondary. Isso acelerou nosso despejo por um fator de 10 a 30.

Kay
fonte