Ich werde einige aktualisierte Informationen und Verweise auf @ max-malyshs ausgezeichnete Antwort oben hinzufügen.
Kurz gesagt, wenn Sie etwas auf dem Master tun, muss es auf dem Slave repliziert werden. Postgres verwendet hierfür WAL-Datensätze, die nach jeder protokollierten Aktion auf dem Master an den Slave gesendet werden. Der Slave führt dann die Aktion aus und die beiden sind wieder synchron. In einem von mehreren Szenarien kann es auf dem Slave zu Konflikten mit dem kommen, was in einer WAL-Aktion vom Master eingeht. In den meisten von ihnen findet auf dem Slave eine Transaktion statt, die im Widerspruch zu dem steht, was die WAL-Aktion ändern möchte. In diesem Fall haben Sie zwei Möglichkeiten:
- Verzögern Sie die Anwendung der WAL-Aktion ein wenig, damit der Slave seine widersprüchliche Transaktion beenden kann, und wenden Sie dann die Aktion an.
- Brechen Sie die widersprüchliche Abfrage auf dem Slave ab.
Wir beschäftigen uns mit # 1 und zwei Werten:
max_standby_archive_delay
- Dies ist die Verzögerung, die nach einer langen Trennung zwischen Master und Slave verwendet wird, wenn die Daten aus einem WAL-Archiv gelesen werden, bei dem es sich nicht um aktuelle Daten handelt.
max_standby_streaming_delay
- Verzögerung zum Abbrechen von Abfragen, wenn WAL-Einträge über die Streaming-Replikation empfangen werden.
Wenn Ihr Server für die Hochverfügbarkeitsreplikation vorgesehen ist, möchten Sie diese Zahlen im Allgemeinen kurz halten. Hierfür ist die Standardeinstellung 30000
(Millisekunden, wenn keine Einheiten angegeben sind) ausreichend. Wenn Sie jedoch so etwas wie ein Archiv-, Berichts- oder Lesereplikat einrichten möchten, das möglicherweise sehr lange Abfragen enthält, sollten Sie dies auf einen höheren Wert einstellen, um abgebrochene Abfragen zu vermeiden. Die oben empfohlene 900s
Einstellung scheint ein guter Ausgangspunkt zu sein. Ich bin mit den offiziellen Dokumenten nicht einverstanden, einen unendlichen Wert -1
als gute Idee festzulegen - das könnte fehlerhaften Code maskieren und viele Probleme verursachen.
Die einzige Einschränkung bei lang laufenden Abfragen und beim Erhöhen dieser Werte besteht darin, dass andere Abfragen, die parallel zu der lang laufenden Abfrage auf dem Slave ausgeführt werden und die Verzögerung der WAL-Aktion verursachen, alte Daten sehen, bis die lange Abfrage abgeschlossen ist. Entwickler müssen dies verstehen und Abfragen serialisieren, die nicht gleichzeitig ausgeführt werden sollen.
Die vollständige Erklärung, wie max_standby_archive_delay
und max_standby_streaming_delay
arbeiten und warum, finden Sie hier .