Nullstellen von WAL-Segmenten in Postgres

9

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_timeoutalle 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:

  1. 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.

  2. 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.

  3. 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?

  4. Setzen Sie den nicht verwendeten Teil des Segments auf Null, bevor Sie es mit der Ausgabe von archivieren, pg_xlogdumpum 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.

  5. Archivieren Sie nur den verwendeten Teil der Segmentdatei, indem Sie die Ausgabe von pg_xlogdumpirgendwie erneut interpretieren und sie dann während der Wiederherstellung mit Nullen auffüllen. Klingt auch möglich, obwohl ich es nicht wirklich mag.

Dave Turner
quelle
Interessantes Problem. Darf ich fragen, für welche kontinuierliche Archivierung Sie verwenden?
Dekso
@dezso Trotz der geringen Abwanderung wird es als sehr wichtig angesehen, das Risiko des Verlusts dieser Daten so weit wie möglich zu verringern und einen Prüfpfad für die vorgenommenen Änderungen zu erstellen. Die WAL-Archivierung ist eine letzte Verteidigungslinie (es gibt auch andere Mechanismen im Spiel), daher wäre es gut, sie billig zu halten.
Dave Turner

Antworten:

5

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_clearxlogtailSie 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.

jjanes
quelle
D'oh. Ja, wir sind auf 9.3, also sind wir durch den Spalt zwischen diesen beiden Lösungen gerutscht. Und ja, tut mir leid, Sie haben Recht, es ist das archive_timeout, was die Schalter verursacht. OP korrigiert, danke.
Dave Turner