Zerando segmentos WAL no Postgres


9

Temos um banco de dados Postgres de volume relativamente baixo com arquivamento contínuo configurado para compactar cada segmento WAL e enviá-lo ao S3. Por ser um sistema de baixo volume, ele atinge a archive_timeoutcada 10 minutos mais ou menos e arquiva o segmento WAL mais não utilizado, que costumava compactar muito bem, pois era na maioria apenas zeros.

No entanto, o Postgres recicla seus segmentos WAL para evitar o custo de alocar novos arquivos em cada comutador WAL, o que é útil em uma situação de alta carga, mas significa que após uma explosão de atividade mais pesada que o normal, nossos arquivos de segmento WAL estão cheios lixo de segmentos anteriores e não se comprime muito bem. Estamos armazenando muitas cópias de todo esse lixo.

Existe uma maneira de reduzir a quantidade de espaço que estamos usando para manter nosso arquivo WAL? Algumas possibilidades abaixo do ideal:

  1. Impeça o Postgres de reciclar os segmentos WAL de alguma forma, para que ele comece com um arquivo zerado a cada vez. Os documentos não indicam que existe uma opção para fazer isso, mas eu posso ter perdido.

  2. O Postgres zera o arquivo de segmento WAL quando ele inicia / termina o uso. Novamente, os documentos não parecem sugerir que isso é possível.

  3. Zere ou remova externamente alguns dos arquivos de segmento WAL enquanto não estiverem em uso. Existe uma maneira segura de determinar quais arquivos são esses?

  4. Zere a parte não utilizada do segmento antes de arquivá-lo usando a saída de pg_xlogdumppara descobrir onde o lixo não é iniciado. Possível, embora eu não goste. Pelo menos, fazendo isso no comando archive, você pode ter certeza de que o Postgres não reutilizará o arquivo.

  5. Arquive apenas a parte usada do arquivo de segmento, interpretando novamente a saída de pg_xlogdumpalguma forma e, em seguida, complete com zeros durante a restauração. Também parece possível, embora eu realmente não goste.


Problema interessante. Posso perguntar para que arquivamento contínuo você está usando?
Dez17

@dezso Apesar da baixa rotatividade, é considerado muito importante reduzir o risco de perder esses dados o máximo possível e ter uma trilha de auditoria das alterações feitas. O arquivamento do WAL é uma última linha de defesa (também existem outros mecanismos em jogo), portanto, mantê-lo barato seria bom.
Dave Turner

Respostas:


5

A partir da versão 9.4, agora zera automaticamente o final do arquivo WAL. (Na verdade, é praticamente zero, existem alguns cabeçalhos de bloco que não são zerados, mas o resultado ainda é muito compressível).

Na versão 9.2, existe um programa chamado pg_clearxlogtailvocê pode usar. Você pode adicioná-lo ao seu comando archive_ antes da etapa de compactação.

Se você estiver usando o 9.3, estará sem sorte.

Observe que os pontos de verificação não causam inerentemente opções de arquivo de log. Provavelmente é archive_timeout que está causando as opções.


D'oh. Sim, estamos na versão 9.3, por isso escapamos da brecha entre essas duas soluções. E sim, desculpe, você está certo, é isso archive_timeoutque causa os comutadores. Corrigido o OP, obrigado.
Dave Turner
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.