PostgreSQL-Streaming versus dateibasierte Replikation (in Bezug auf Serververhalten und -konfiguration)

8

Ich versuche zu verstehen, wie die PostgreSQL-Replikation am besten verwendet wird und wie sie funktioniert, damit ich in einer Produktionsumgebung Fehler beheben kann.

Es fällt mir schwer, die Unterschiede zwischen diesen beiden Replikationstypen in Bezug auf (1) Konfiguration (2) Leistung der beiden Server Master / Slave in jedem Szenario zu verstehen

Die Replikation unter PostgreSQL (9.2+) besteht im Wesentlichen aus XLOG-Dateien mit einer Größe von 16 MB (abhängig von den Frequenzeinstellungen für die Erstellung jeder Datei), die auf dem Master erstellt und mit einer Methode an den Slave gesendet werden.

Mein Setup (für die Zwecke dieser Frage)

Konfiguration von Postgresql.conf im Master
archive_command = 'rsync -av% p postgres @ [SlaveIP]: [wal_archive_folder] /% f'

Konfiguration von Recovery.conf auf Slave zum Lesen von Protokolldateien
restore_command = 'cp [wal_archive_folder] /% f \ "% p \"'
primary_conninfo = 'host = [MasterIP] port = 5432 user = postgres'

Meine Frage ist, welcher Teil dieser Konfiguration diese "Streaming" -Replikation im Vergleich zum "Protokollversand" bewirkt. Mein Master ist so konfiguriert, dass er rsync verwendet, um Protokolle an den Slave zu senden (wird dieses Protokoll versendet?). Mein Slave ist so konfiguriert, dass er in der Datei recovery.conf eine Verbindung zum Master herstellen kann (ist dies Streaming?)

Zweiter Teil der Frage: Was passiert? Ich verstehe, dass es ein anderes Protokoll für PostgreSQL über WAL_sender & WAL_receiver gibt. Ich bin mir jedoch nicht sicher, ob dies nur für das Streaming verwendet wird und wenn ja, wie wird der Rsync im Master verwendet?

:) Vielen Dank!! Und entschuldigen Sie, wenn dies eine offensichtliche Frage ist. Ich habe ein paar Blogs / Bücher gelesen, aber es fällt mir schwer zu verstehen. Das Postgres-Wiki ist so ausführlich, dass es lange dauert, bis alles fertig ist (und ich habe Fristen).

Dina
quelle
Das Wiki ist in der Regel ziemlich veraltet und ausführlich. Es ist oft voll von Dokumenten, die auf Entwicklung und Feature-Design ausgerichtet sind. Das Hauptbenutzerhandbuch ist normalerweise eine bessere Ressource für solche Dinge.
Craig Ringer

Antworten:

17

"Streaming-Replikation" bezieht sich auf das kontinuierliche Senden von WAL-Datensätzen über eine TCP / IP-Verbindung zwischen dem Master und dem Replikat unter Verwendung des Walsender-Protokolls über replicationVerbindungen. Der Master liest seine eigene WAL von pg_xlogund sendet sie bei Bedarf an die Replik. Es ist mit einer primary_conninfoDirektive in recovery.confund pg_hba.confEinträgen auf dem Master konfiguriert , um replicationVerbindungen zuzulassen . Sie müssen auch wal_keep_segmentsund einige andere Optionen in der Dokumentation behandelt.

"Protokollversand" bezieht sich auf das regelmäßige Senden von WAL-Datensätzen als ganze WAL-Archive über ein Dateiübertragungsprotokoll an einen Archivspeicherort, von dem das Replikat sie dann abrufen kann. Es ist mit einer restore_commandDirektive in recovery.confund einer archive_commandim Master konfiguriert . PostgreSQL ist es egal, wo sich die Dateien befinden oder wie sie übertragen werden, nur dass archive_commandsie dort abgelegt werden und restore_commanddas erforderliche Archiv abgerufen wird. Dies ermöglicht den Aufbau von Systemen wie PgBarman und WAL-E.

Die Streaming-Replikation weist nicht so viele Verzögerungen auf, da Datensätze gesendet und generiert werden. Es ist jedoch erforderlich, dass sowohl der Master als auch das Replikat online sind und direkt kommunizieren können. Außerdem muss das Replikat gut genug mithalten, damit der Master noch Kopien der WAL auf der Festplatte hat, die das Replikat benötigt, und im Allgemeinen müssen Sie zusätzlichen pg_xlogSpeicherplatz für die Aufbewahrung zusätzlicher WAL für das Replikat aufwenden.

Die Protokollversandreplikation weist eine größere Verzögerung auf, da das Replikat WAL erst sieht, wenn ein ganzes Archiv gesendet wurde. Es kann jedoch auch dann funktionieren, wenn der Master und das Replikat nicht direkt über TCP / IP unter Verwendung eines gemeinsam genutzten Speicherorts kommunizieren können. Es funktioniert auch dann weiter, wenn das Replikat eine Weile nicht pg_xlogverfügbar ist , da der Master die WAL erst nach der Archivierung verworfen hat. Die WAL befindet sich also weiterhin im Archiv und kann von der Replik verwendet werden, obwohl der Master sie nicht senden kann durch Streaming mehr. Beachten Sie, dass dies archive_commandniemals aufgibt und sich daher pg_xlogfüllen kann, wenn die Archivierung fehlschlägt. Aus diesem Grund ist es besser, an einem zuverlässigen Speicherort zu archivieren und dann den Replikatserver von diesem Speicherort abrufen zu lassen.

Im Allgemeinen kombinieren Sie die beiden tatsächlich, dh verwenden Sie beide. In diesem Fall wird die Streaming-Replikation verwendet, wenn alles in Ordnung ist. Wenn das Replikat zu weit zurückliegt und der Master die erforderlichen Xlogs verworfen hat, ein Konnektivitätsproblem usw. auftritt, wechselt das Replikat zum Lesen der archivierten WAL, bis es eingeholt wird. Es wird regelmäßig erneut versucht, zum Streaming zurückzukehren, bis dies erfolgreich ist.

Wenn Sie nur einen verwenden möchten, verwenden Sie den Protokollversand, da das Streaming der Replikation ohne Fallback für den Protokollversand (bis PostgreSQL 9.4) möglicherweise zu Replikationsverzögerungen führt, die zu Fehlern führen, die die Neuerstellung eines Replikats erzwingen.


PostgreSQL 9.4 ändert dies ein wenig, da die Streaming-Replikation jetzt "Replikations-Slots" verwenden kann. Auf diese Weise kann der Master verfolgen, wie viel WAL ein Replikat benötigt, und es vermeiden, es wegzuwerfen, bis das Replikat es wiedergegeben hat. wal_keep_segmentsWenn Sie einen Replikationssteckplatz verwenden (nicht die Standardeinstellung), ist dies nicht mehr erforderlich .

Siehe meinen Artikel zum Streamen von Replikationssteckplätzen in PostgreSQL 9.4 .

In 9.4 werden auch die Grundlagen für das Streaming der logischen Replikation vorgestellt. Dies ist ein weiterer Mechanismus, der für die Verwendung durch logische Replikationssysteme wie Londiste, Slony-I und die neue bidirektionale asynchrone Multi-Master-Replikationsfunktion entwickelt wurde .

Craig Ringer
quelle
Sehr hilfreich, ich frage mich, ob Sie diesen Artikel denken: blogs.amd.co.at/robe/2009/05/… ist mit meiner Frage zum Thema. Mir wurde gesagt, "Holzversand ist stabiler" und dieser Artikel scheint diese Meinung zu teilen.
Dina
1
@Dina Es ist zumindest veraltet, z. B. hat der Protokollversand den Nachteil, dass die Slave-Server nicht für Abfragen verwendet werden können, solange sie Daten replizieren . Im hot_standbyModus können sie schreibgeschützte Abfragen ausführen . Beim Streaming und beim Protokollversand wird WAL verwendet. Es handelt sich lediglich um unterschiedliche Übertragungsmöglichkeiten. Sie können und sollten den Protokollversand verwenden, um die Streaming-Replikation zu ergänzen. Insgesamt ist der Artikel in Ordnung, aber nicht besonders aufschlussreich und etwas veraltet. Die offiziellen Dokumente sind eine bessere Ressource.
Craig Ringer
Die Antwort ist sehr hilfreich, Chris, also dein Artikel ( blog.2ndquadrant.com/postgresql-9-4-slots )
Max L.
@Dina Wenn Sie nach dem Einrichten der Streaming-Replikation (die standardmäßig asynchron ist) Ihr Setup für die synchrone Replikation konfigurieren möchten, können Sie dies tun, indem Sie den synchronous_standby_namesParameter auf einen nicht leeren Wert setzen, z standby_1. Sie tun dies auf dem primaryServer. Anschließend standbyändern Sie auf dem Server die primary_conninfoEinstellung, indem Sie application_name=standby_1z primary_conninfo = 'host=x port=y user=z application_name=standby_1'. Dies ist aus postgresql.org/docs/9.6/static/warm-standby.html , Abschnitt 26.2.8.
Dw8547