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_timeout
cada 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:
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.
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.
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?
Zere a parte não utilizada do segmento antes de arquivá-lo usando a saída de
pg_xlogdump
para 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.Arquive apenas a parte usada do arquivo de segmento, interpretando novamente a saída de
pg_xlogdump
alguma forma e, em seguida, complete com zeros durante a restauração. Também parece possível, embora eu realmente não goste.