Como tornar o pg_dump menos ganancioso em termos de recursos

8

Eu configurei o cron para chamar pg_dump diariamente usando a seguinte regra:

# xyz database backups:
00 01 * * * root umask 077 && pg_dump --user=xyz_system xyz | gzip > /var/xyz/backup/db/xyz/`date -u +\%Y\%m\%dT\%H\%M\%S`.gz

Basicamente, funciona. O banco de dados cresce relativamente rápido e exponencialmente (no entanto, o expoente não é muito grande). Atualmente, o despejo compactado em gzip leva cerca de 160 MB. Quando o banco de dados é despejado, o sistema começa a rastrear. A média de carga que eu vi usando o topcomando foi sobre 200, 200, 180. Basicamente, o servidor dificilmente responde.

A primeira pergunta é como determinar onde está o gargalo. O desempenho ruim é causado por operações pesadas de E / S? É causado por problemas de bloqueio de tabela? Talvez seja um problema de memória? A saída do pg_dumpcomando é canalizada para o gzipcomando. É sequencial, ou seja, o despejo inteiro é colocado na memória (problema de troca?) E, em seguida, compactado ou simultâneo (ou seja, o gzip compacta o que é obtido e espera por mais)? Pode ser causado por algum outro fator?

A segunda questão é como tornar a operação de dumping menos invasiva para as principais funções do sistema. Pelo que entendi, o despejo não pode demorar muito por causa da integridade do banco de dados. Existem bloqueios de gravação de tabela, etc. O que posso fazer para limitar os problemas (ou atrasá-lo, considerando o crescimento do banco de dados).

A terceira pergunta : já é hora de aprender sobre configurações de banco de dados mais avançadas? O sistema funciona bem, quando os backups do banco de dados não são executados, mas talvez o problema do db dumping seja o primeiro sintoma de problemas de entrada?

Dariusz Walczak
fonte

Respostas:

13

Uau. Número surpreendente de perguntas. Vou tentar abordar alguns, mas esta resposta ainda não está completa.

como determinar onde está o gargalo.

Use topprimeiro para ver o que está acontecendo durante o despejo. Inspecione o uso da CPU do processo, status do processo. Dsignifica "aguardando E / S".

O desempenho ruim é causado por operações pesadas de E / S?

Sim, provavelmente.

É causado por problemas de bloqueio de tabela?

Talvez. você pode usar a pg_stat_activityvisualização do sistema para ver o que está acontecendo no postgres durante o despejo.

Talvez seja um problema de memória?

Muito improvável.

A saída do comando pg_dump é canalizada para o comando gzip. É seqüencial, ou seja, despejo inteiro é colocado na memória (problema de troca?)

Não. O gzip é um compressor de bloco que trabalha no modo de fluxo, não mantém todas as entradas na memória.

e depois compactado ou concorrente (ou seja, o gzip compacta o que ele recebe e espera por mais)?

Sim, comprime bloco por bloco, produz e aguarda mais.

Pode ser causado por algum outro fator?

Sim.

Pelo que entendi, o despejo não pode demorar muito por causa da integridade do banco de dados. Existem bloqueios de gravação de tabela, etc. O que posso fazer para limitar os problemas (ou atrasá-lo, considerando o crescimento do banco de dados).

A duração do dump não afeta a integridade do dump. A integridade é garantida usando uma transação com nível de isolamento de leitura repetível por todo o processo pg_dump. Não há bloqueios de gravação de tabela

Já é hora de aprender sobre configurações mais avançadas do banco de dados? O sistema funciona bem, quando os backups do banco de dados não são executados, mas talvez o problema do db dumping seja o primeiro sintoma de problemas de entrada?

Nunca é tarde. Comece com http://wiki.postgresql.org/wiki/Performance_Optimization .

filiprem
fonte
FWIW, tive problemas com pg_dump100% da CPU e era do gzip. A especificação pg_dump --compress=0resolveu isso para mim no Ubuntu 16.04. Os backups foram super rápidos depois disso também. Cuidado com a compressão gzip em contêineres; pode não fazer o que você espera.
Ligemer 31/07
5

Eu recomendo que você observe o arquivamento contínuo do postgresql. Aqui estão as vantagens sobre o uso de pg_dump:

  1. Não há necessidade de fazer um backup completo de cada vez. Um backup completo é suficiente no início, mas é recomendável ter um backup completo a cada vários dias, por exemplo.
  2. Muito mais rápido para restaurar quando o banco de dados aumenta de tamanho.
  3. A capacidade de restaurar para outro ponto (Recuperação pontual).
  4. Você fará backup incremental a cada hora (aproximadamente 30 minutos). Isso pode ser configurado e depende também da atividade de atualização.

No entanto, existem algumas desvantagens (que podem não ser um problema na maioria dos casos):

  1. Geralmente, é necessário mais espaço, porque esses são backups binários. A pasta DB pode ser compactada.
  2. Você não pode restaurá-los em uma arquitetura diferente (dados binários).
Khaled
fonte