2016-05-06 19 views
2

Postgress folgt MVCC-Regeln. Daher steht jede Abfrage, die in einer Tabelle ausgeführt wird, nicht in Konflikt mit den Schreibvorgängen, die in der Tabelle ausgeführt werden. Die Abfrage gibt das Ergebnis basierend auf dem Snapshot zum Zeitpunkt der Abfrage zurück.Replikation auf Postgresql Pausen, wenn Abfragen und Replikation gleichzeitig stattfinden

Jetzt habe ich einen Master und Slave. Der Slave wird von Analysten verwendet, um Abfragen auszuführen und Analysen durchzuführen. Wenn der Slave repliziert und wenn Analytiker ihre Abfragen gleichzeitig ausführen, kann ich die Replikationsverzögerung für eine lange Zeit sehen. Wenn die Abfragen lange ausgeführt werden, ist die Replikation eine lange Dauer und wenn die Anzahl der Schreibvorgänge auf dem Master passiert ziemlich hoch, dann verliere ich die WAL-Dateien und die Replikation kann länger dauern. Ich muss nur einen anderen Sklaven hochbringen. Warum passiert das ? Wie erlaube ich, dass Abfragen und Replikationen gleichzeitig in Haltungen stattfinden? Gibt es eine Parametereinstellung, die ich anwenden kann, um dies zu ermöglichen?

+0

Um hinzuzufügen, postgress Replikation ist single-threaded ... Also, wenn ich Tabelle A auf Slave Abfrage, ich denke, Tabelle A erhält Sperren für die Replikation. Wenn Tabelle B nun Einfügungen/Aktualisierungen auf dem Master ausführt, warten sie auf die WAL-Dateien hinter Tabelle A .... Wenn die Abfrage für Tabelle A nicht abgeschlossen wird, kann die Replikation nicht fortgesetzt werden. Wenn Multithread vorhanden wäre, wird Tabelle B eingefügt/aktualisiert Wüsste, dass es nichts mit Tabelle A zu tun hat und kann ohne Verzögerungen fortfahren ... Bin ich richtig, wenn ich den Postgres-Replikationsmechanismus verstehe? – Ramanan

+0

"Die Replikation bleibt lange zurück, und wenn die Anzahl der Schreibvorgänge auf dem Master ziemlich hoch ist, dann verliere ich die WAL-Dateien und die Replikation kann länger fortfahren", was definitiv darauf hinweist, dass die Replikation nicht richtig eingerichtet wurde. Warum aktualisieren Sie die Frage nicht mit weiteren Details? Extrakte aus Ihrer Konfigurationsdatei würden ebenfalls helfen. – e4c5

+0

Auch diese Frage könnte besser für dba.stackexchange.com – e4c5

Antwort

1

Das Replikat kann nicht mehr WAL vom Master übernehmen, da der Master möglicherweise Datenblöcke überschrieben hat, die noch von Abfragen auf dem Replikat benötigt werden, die älter sind als alle noch auf dem Master ausgeführten. Das Replikat benötigt ältere Zeilenversionen als der Master. Es ist genau weil von MVCC, dass diese Pause notwendig ist.

Sie haben wahrscheinlich eine hohe max_standby_streaming_delay gesetzt, um "canceling statement due to conflict with recovery" errors zu vermeiden.

Wenn Sie hot_standby_feedback einschalten, kann das Replikat dem Master stattdessen mitteilen, dass er diese Zeilen behalten soll. Aber der Master kann den freien Speicherplatz nicht so effizient aufräumen, und es könnte in pg_xlog der Platz knapp werden, wenn der Standby viel zu weit zurückliegt.

Siehe PostgreSQL manual: Handling Query Conflicts.

Wie für die WAL-Retention: Aktivieren Sie die WAL-Archivierung und eine restore_command für Ihre Standbys. Sie sollten es trotzdem für die Wiederherstellung nach Zeitpunkt verwenden. PgBarman macht das jetzt einfach mit dem Befehl barman get-wal. Wenn Sie keine WAL-Archivierung wünschen, können Sie stattdessen Ihre Replikatserver darauf einstellen, einen Replikationssteckplatz für die Verbindung mit dem Master zu verwenden, damit der Master weiß, dass er die WAL, die er benötigt, auf unbestimmte Zeit behält. Das kann natürlich dazu führen, dass der Master in pg_xlog keinen Platz mehr hat und nicht mehr läuft. Sie müssen also genauer überwachen, wenn Sie das tun.

+1

Vielen Dank für die Antwort. Ich werde hot_standby_feedback mit unserem Setup ausprobieren. Mein Verständnis von Ihrer Erklärung ist, dass tote Zeilen immer noch auf dem Master-Server gehalten werden, wodurch die Tabellen für einige Zeit aufgebläht werden ... Also wann passiert die Aufräumung auf dem primären Server? Erfolgt die Bereinigung, wenn die Abfrage beendet wird? – Ramanan