Beim Ausführen einer Abfrage auf einer PostgreSQL-Datenbank im Standby-Modus wird die folgende Fehlermeldung angezeigt. Die Abfrage, die den Fehler verursacht, funktioniert 1 Monat lang einwandfrei. Wenn Sie jedoch länger als 1 Monat abfragen, tritt ein Fehler auf.
ERROR: canceling statement due to conflict with recovery
Detail: User query might have needed to see row versions that must be removed
Irgendwelche Vorschläge zur Lösung? Vielen Dank
postgresql
postgresql-9.1
Ein Lehrling
quelle
quelle
Antworten:
Das Ausführen von Abfragen auf einem Hot-Standby-Server ist etwas schwierig - es kann fehlschlagen, da während der Abfrage einige benötigte Zeilen möglicherweise auf dem primären Server aktualisiert oder gelöscht werden. Da eine Primärdatenbank nicht weiß, dass eine Abfrage auf einer Sekundärseite gestartet wird, glaubt sie, alte Versionen ihrer Zeilen bereinigen (staubsaugen) zu können. Dann muss Secondary diese Bereinigung erneut abspielen und alle Abfragen, die diese Zeilen verwenden können, zwangsweise abbrechen.
Längere Abfragen werden häufiger abgebrochen.
Sie können dies umgehen, indem Sie eine wiederholbare Lesetransaktion auf der Primärseite starten, die eine Dummy-Abfrage ausführt und dann inaktiv ist, während eine echte Abfrage auf der Sekundärseite ausgeführt wird. Sein Vorhandensein verhindert das Staubsaugen alter Zeilenversionen auf der Primärseite.
Weitere Informationen zu diesem Thema und andere Problemumgehungen finden Sie im Abschnitt Hot Standby - Behandlung von Abfragekonflikten in der Dokumentation.
quelle
Keine Notwendigkeit zu berühren
hot_standby_feedback
. Wie andere bereits erwähnt haben, kann das Einstellen aufon
Master aufblähen. Stellen Sie sich vor, Sie öffnen eine Transaktion für einen Slave und schließen sie nicht.Stattdessen legen
max_standby_archive_delay
undmax_standby_streaming_delay
bis zu einem gewissen vernünftigen Wert:Auf diese Weise werden Abfragen von Slaves mit einer Dauer von weniger als 900 Sekunden nicht abgebrochen. Wenn Ihre Workload längere Abfragen erfordert, setzen Sie diese Optionen einfach auf einen höheren Wert.
quelle
max_standby_archive_delay
möglicherweise kleiner als das andere sein.ms
, dh 900s = 16 Minuten = 900000ms.ms
cloud.google.com/sql/docs/postgres/…Es ist nicht erforderlich, inaktive Transaktionen auf dem Master zu starten. In postgresql-9.1 können Sie dieses Problem am direktesten durch Festlegen lösen
Dadurch wird der Master auf lang laufende Abfragen aufmerksam. Aus den Dokumenten :
Warum ist das nicht die Standardeinstellung? Dieser Parameter wurde nach der ersten Implementierung hinzugefügt und ist die einzige Möglichkeit, wie ein Standby einen Master beeinflussen kann.
quelle
Wie hier angegeben über
hot_standby_feedback = on
:Und hier :
Also habe ich hinzugefügt
Und kein
pg_dump
Fehler mehr für uns, noch Meister aufblähen :)Überprüfen Sie für eine AWS RDS-Instanz http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html
quelle
Die Tabellendaten auf dem Hot-Standby-Slave-Server werden geändert, während eine lange laufende Abfrage ausgeführt wird. Eine Lösung (PostgreSQL 9.1+), um sicherzustellen, dass die Tabellendaten nicht geändert werden, besteht darin, die Replikation anzuhalten und nach der Abfrage fortzufahren:
quelle
xlog
wurde mit ersetztwal
, so dass Sie anrufen möchten ,pg_wal_replay_pause()
undpg_wal_replay_resume()
.Für die Antwort mag es zu spät sein, aber wir stehen bei der Produktion vor dem gleichen Problem. Früher hatten wir nur ein RDS und da die Anzahl der Benutzer auf der App-Seite zunimmt, haben wir beschlossen, Read Replica dafür hinzuzufügen. Das Lesereplikat funktioniert beim Staging ordnungsgemäß, aber sobald wir zur Produktion übergegangen sind, wird der gleiche Fehler angezeigt.
Wir lösen dieses Problem, indem wir die Eigenschaft hot_standby_feedback in den Postgres-Eigenschaften aktivieren . Wir haben auf den folgenden Link verwiesen
https://aws.amazon.com/blogs/database/best-practices-for-amazon-rds-postgresql-replication/
Ich hoffe es wird helfen.
quelle
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:
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 empfohlene900s
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
undmax_standby_streaming_delay
arbeiten und warum, finden Sie hier .quelle
Ebenso hier eine zweite Einschränkung zu @ Artif3x Ausarbeitung von @ max-malyshs ausgezeichneter Antwort, beide oben.
Bei verspäteter Anwendung von Transaktionen vom Master haben die Follower eine ältere, veraltete Ansicht der Daten. Beachten Sie daher Folgendes, während Sie Zeit für die Beendigung der Abfrage für den Follower bereitstellen, indem Sie max_standby_archive_delay und max_standby_streaming_delay festlegen. Beachten Sie Folgendes:
Wenn der Wert des Followers für die Sicherung zu stark im Widerspruch zu Hosting-Abfragen steht, besteht eine Lösung aus mehreren Followern, die jeweils für den einen oder anderen optimiert sind.
Beachten Sie außerdem, dass mehrere Abfragen hintereinander dazu führen können, dass die Anwendung von Wal-Einträgen immer wieder verzögert wird. Wenn Sie also die neuen Werte auswählen, ist es nicht nur die Zeit für eine einzelne Abfrage, sondern ein sich bewegendes Fenster, das beginnt, wenn eine widersprüchliche Abfrage beginnt, und endet, wenn der Wal-Eintrag endgültig angewendet wird.
quelle