Wir haben eine Postgres-Datenbank mit relativ geringem Volumen und kontinuierlicher Archivierung eingerichtet, um jedes WAL-Segment zu komprimieren und an S3 zu senden. Da es sich um ein System mit geringem Volumen handelt, trifft es etwa archive_timeout
alle 10 Minuten und archiviert das meist nicht verwendete WAL-Segment, das früher sehr gut komprimiert wurde, da es meist nur Nullen waren.
Postgres recycelt jedoch seine WAL-Segmente, um die Kosten für die Zuweisung neuer Dateien an jedem WAL-Switch zu vermeiden. Dies ist in einer Situation mit hoher Auslastung nützlich, bedeutet jedoch, dass unsere WAL-Segmentdateien nach einem Ausbruch überdurchschnittlicher Aktivitäten jetzt voll sind von Müll aus früheren Segmenten und überhaupt nicht sehr gut komprimieren. Wir speichern viele Kopien dieses ganzen Mülls.
Gibt es eine Möglichkeit, den Speicherplatz für unser WAL-Archiv zu reduzieren? Einige suboptimale Möglichkeiten:
Verhindern Sie, dass Postgres die WAL-Segmente irgendwie recycelt, und beginnen Sie jedes Mal mit einer auf Null gesetzten Datei. Die Dokumente geben nicht an, dass es eine Option dafür gibt, aber ich habe sie möglicherweise verpasst.
Lassen Sie Postgres die WAL-Segmentdatei auf Null setzen, wenn sie verwendet / beendet wird. Auch hier scheinen die Dokumente nicht darauf hinzudeuten, dass dies möglich ist.
Stellen Sie einige der WAL-Segmentdateien extern auf Null oder entfernen Sie sie, während sie nicht verwendet werden. Gibt es eine sichere Möglichkeit, um festzustellen, um welche Dateien es sich handelt?
Setzen Sie den nicht verwendeten Teil des Segments auf Null, bevor Sie es mit der Ausgabe von archivieren,
pg_xlogdump
um herauszufinden, wo der Junk beginnt. Möglich, obwohl ich es nicht mag. Zumindest wenn Sie dies im Befehl archive tun, können Sie sicher sein, dass Postgres die Datei nicht wiederverwendet.Archivieren Sie nur den verwendeten Teil der Segmentdatei, indem Sie die Ausgabe von
pg_xlogdump
irgendwie erneut interpretieren und sie dann während der Wiederherstellung mit Nullen auffüllen. Klingt auch möglich, obwohl ich es nicht wirklich mag.
quelle
Antworten:
Ab Version 9.4 wird das hintere Ende der WAL-Datei automatisch auf Null gesetzt. (Eigentlich ist es meistens nur Null, es gibt einige Blockheader, die nicht auf Null gesetzt werden, aber das Ergebnis ist immer noch sehr komprimierbar).
In Version 9.2 gibt es ein Programm mit dem Namen, das
pg_clearxlogtail
Sie verwenden können. Sie können es vor dem Komprimierungsschritt in Ihren Befehl archive_command einfügen.Wenn Sie 9.3 verwenden, haben Sie kein Glück.
Beachten Sie, dass Prüfpunkte von Natur aus keine Protokolldateischalter verursachen. Es ist wahrscheinlich archive_timeout, das die Schalter verursacht.
quelle
archive_timeout
, was die Schalter verursacht. OP korrigiert, danke.