2017-10-19 1 views
0

Ich habe "PostgreSQL-Replikation von Hans-Jürgen Schönig" gelesen, und ein paar Stellen, dass es Best Practice ist, eine Archiv-WAL-Datei während der Ausführung des Befehls archive_content nicht zu überschreiben - kann jemand bitte erweitern die Gründe dafür? und wenn das folgende Szenario für das Überschreiben von WAL gültig ist?Postgresql WAL archive_command Datei vergleichen

Ich habe ein Skript geschrieben, das die folgende hohe Logik für einen einzelnen WAL Archivierungsvorgang wird ausgeführt:

if (/archive/00000001000000F700000067 exists and is readable) and (00000001000000F700000067 is byte by byte equal to /archive/00000001000000F700000067) 
    exit with status 0 
else 
    if (copy 00000001000000F700000067 to /archive/00000001000000F700000067 is successful) 
    if (/archive/00000001000000F700000067 exists and is readable) and (00000001000000F700000067 is byte by byte equal to /archive/00000001000000F700000067) 
     exit with status 0 
    else 
     exit with status non-zero 
    else 
    exit with status non-zero 

Kurz gesagt, dieser Ansatz hofft gegen zumindest das Szenario zu verteidigen, wo die ursprüngliche WAL-Datei falsch archiviert - die Kopie hat einen gültigen Dateinamen, ist aber beschädigt (z. B. aufgrund eines Hardwarefehlers). Mein Verständnis des Prozesses WAL Archivierung in diesem Fall:

  • Die archive_command kehrt nicht Null Exit-Status während des Byte-für-bye Vergleichs nach dem Kopiervorgang (lassen Sie uns den Kopiervorgang annehmen, hat einen falschen Erfolgsantwort)
  • Gemäß der Dokumentation, auf nicht-Null exit_status WAL Archivierung auf unbestimmte Zeit erneut versucht werden soll - ein zweiter Versuch von WAL-Archivierung
  • die archive_command wird erkennen, auftreten soll, dass das bestehende Archiv WAL nicht den aktuellen WAL Byte überein -wise
  • Der Kopiervorgang wird ein zweites Mal stattfinden, hoffentlich vorbei die beschädigte Datei
  • exit_status 0 im Falle eines Erfolgs Vergleich der Dateien zu schreiben, sonst wird dieser Prozess

Es gibt einen sehr geringen Aufwand mit dem Vergleich beteiligt wiederholt werden (was ich zu md5 Prüfung aktualisieren kann), kann jemand irgendwelche Probleme sehen, die aus einem solchen Ansatz entstehen können? oder weiter empfehlen?

Danke

Antwort

1

Wenn ich Ihren Pseudo-Code richtig gelesen, Sie WAL Segmente im Archiv zu überschreiben, wenn sie nicht identisch mit Ihrem aktuellen WAL-zu-Archiv sind.

Das Problem dabei ist, dass WAL-Archive sehr wichtige Informationen sind, und Sie kritzeln über ein archiviertes WAL-Segment, das jemand zuvor geschrieben hat. Wenn es eine Fehlkonfiguration gibt, bei der zwei PostgreSQL-Cluster fälschlicherweise in dasselbe Archivverzeichnis schreiben, wird das WAL-Archiv blockiert.

Es wäre besser, in diesem Fall die Archivierung zu stoppen und einen Administrator zu benachrichtigen.

+0

Ah natürlich, genial danke. In meinem Fall ist das ein lokaler Speicher auf einem einzigen postgresql-Server. – abstractx1

Verwandte Themen