Disponiamo di un database Postgres a volume relativamente basso con archiviazione continua impostata per comprimere ogni segmento WAL e inviarlo a S3. Poiché è un sistema a basso volume, raggiunge circa archive_timeoutogni 10 minuti circa e archivia il segmento WAL per lo più inutilizzato, che era solito comprimere molto bene dato che era per lo più solo azzerato.
Tuttavia, Postgres ricicla i suoi segmenti WAL per evitare il costo di allocazione di nuovi file su ogni switch WAL, il che è utile in una situazione di carico elevato ma significa che dopo un'esplosione di attività più pesante del normale i nostri file di segmenti WAL sono ora pieni di spazzatura dai segmenti precedenti e non si comprime molto bene. Conserviamo molte copie di tutta questa spazzatura.
C'è un modo per ridurre la quantità di spazio che stiamo usando per conservare il nostro archivio WAL? Alcune possibilità non ottimali:
Impedisci a Postgres di riciclare i segmenti WAL in qualche modo, quindi inizia ogni volta con un file azzerato. I documenti non indicano che esiste un'opzione per farlo, ma potrei averlo perso.
Chiedi a Postgres di azzerare il file del segmento WAL quando inizia / finisce di usarlo. Ancora una volta, i documenti non sembrano suggerire che ciò sia possibile.
Azzerare o rimuovere esternamente alcuni file del segmento WAL mentre non sono in uso. C'è un modo sicuro per determinare di quali file si tratta?
Azzera la parte inutilizzata del segmento prima di archiviarlo utilizzando l'output da
pg_xlogdumpper trovare dove inizia la spazzatura. Possibile, anche se non mi piace. Almeno facendo questo nel comando archivio puoi essere sicuro che Postgres non riutilizzerà il file.Archivia solo la parte utilizzata del file del segmento, sempre interpretando l'output di in
pg_xlogdumpqualche modo, quindi riempilo di zero durante il ripristino. Sembra anche possibile, anche se non mi piace davvero.