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).
Antworten:
"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
replication
Verbindungen. Der Master liest seine eigene WAL vonpg_xlog
und sendet sie bei Bedarf an die Replik. Es ist mit einerprimary_conninfo
Direktive inrecovery.conf
undpg_hba.conf
Einträgen auf dem Master konfiguriert , umreplication
Verbindungen zuzulassen . Sie müssen auchwal_keep_segments
und 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_command
Direktive inrecovery.conf
und einerarchive_command
im Master konfiguriert . PostgreSQL ist es egal, wo sich die Dateien befinden oder wie sie übertragen werden, nur dassarchive_command
sie dort abgelegt werden undrestore_command
das 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_xlog
Speicherplatz 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_xlog
verfü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 diesarchive_command
niemals aufgibt und sich daherpg_xlog
fü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_segments
Wenn 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 .
quelle
hot_standby
Modus 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.synchronous_standby_names
Parameter auf einen nicht leeren Wert setzen, zstandby_1
. Sie tun dies auf demprimary
Server. Anschließendstandby
ändern Sie auf dem Server dieprimary_conninfo
Einstellung, indem Sieapplication_name=standby_1
zprimary_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.