Ist die PostgreSQL-Replikationsproduktion bereit?

16

Wie vergleicht sich die native PostgreSQL-Replikation mit MySQL?

Ich weiß, dass die asynchrone Replikation länger als die Synchronisierung unterstützt wurde, was neu ist. Ist synchron zuverlässig, um in realen Projekten verwendet zu werden?

SrgHartman
quelle

Antworten:

31

Produktion fertig?

Ja, es ist produktionsreif und weit verbreitet. Heroku-Follower basieren beispielsweise auf der in PostgreSQL integrierten asynchronen Replikation, ebenso wie AWS RDS-Standbys und Lesereplikate. Die Streaming-Replikation wird in PostgreSQL fast überall verwendet.

Die Einrichtung der Replikation ist nicht gerade reizvoll, aber Tools wie repmgr helfen etwas dabei, und sie verbessert sich langsam mit jeder Hauptversion. Die Möglichkeit für pg_basebackup, eine Kopie des Systems mithilfe der Streaming-Replikation (und dies von einem anderen Standby-System aus) zu erstellen, ist eine große Hilfe.

Im Allgemeinen wird eine Funktion in PostgreSQL erst dann veröffentlicht, wenn sie produktionsbereit ist. Wie bei jeder Software treten Fehler auf, die jedoch in der Regel kurz nach ihrer Identifizierung behoben werden. Wirklich wichtige neue Funktionen weisen manchmal Fehler und Probleme auf, die nach der Veröffentlichung von .0 entdeckt wurden. In diesem Fall hat die Behebung jedoch hohe Priorität. Wanzen bleiben nicht nur herum.

Ich kenne keine ernsthaften Probleme mit der Streaming-Replikation - Synchronisierung oder Asynchronisierung - und habe seit einiger Zeit keine Probleme mehr gemeldet. Sie waren in den .0-Versionen der Hauptversionen, in denen sie eingeführt wurden, weniger stabil als der übliche Pg-Standard, aber beide reiften schnell und sind gründlich produktionsbereit.

(Update: In der neuen Version 9.3 vor 9.3.4 gab es einen bestimmten Fehler, der in einigen Fällen zu Replikationsproblemen führte. Benutzer von 9.3 sollten sofort ein Update auf 9.3.4 durchführen. Ältere Versionen sind nicht betroffen.)

Die einzige Einschränkung, die ich erwähnen möchte, ist ein kleines Detail bei der synchronen Replikation: Wenn Sie einen Commit für den Master durchführen, brechen Sie die Abfrage nach dem Commit ab, während auf die Bestätigung des Replikats gewartet wird. Sie wird bereits vor der Replikation als Commit für den Master behandelt. Sie erzielen den gleichen Effekt, indem Sie den Master neu starten, während Sie auf die Antwort des Replikats warten. In der Praxis ist das irrelevant, aber es ist das einzige Problem, an das ich denken kann.

Mit MySQL vergleichen?

Die native Replikation von Pg unterscheidet sich erheblich von der von MySQL.

MySQL verwendet die logische Replikation, bei der die an Tabellendaten, Tabellenstrukturen usw. vorgenommenen logischen Änderungen gesendet werden, und das Replikat wendet diese Änderungen an.

Die Replikation von PostgreSQL ist niedriger (ab Version 9.5; zukünftige Versionen können auch eine logische Replikation hinzufügen). Es sendet die in den Tabellen geänderten Blöcke. Es ist einfacher, einfacher zu korrigieren und belastet den Replikatserver weniger, beansprucht jedoch mehr Netzwerkbandbreite und erfordert mehr Speicherplatz auf dem Master, um noch nicht replizierte Änderungen zu speichern. Es ist am besten für die Verwendung der Streaming-Replikation mit WAL-Archivierungs-Fallback konfiguriert, was die Konfiguration komplexer macht als die von MySQL. Es repliziert Änderungen auf niedriger Ebene wie die VACUUM-Aktivität, nicht nur Tupeländerungen, und behält dabei den Status des Replikats auf der Festplatte bei, der dem des Masters entspricht. Es ist nicht möglich, nur eine Datenbank zu replizieren. Das gesamte System muss repliziert werden. Dies kann frustrierend sein, wenn Sie eine große Datenbank mit hoher Abwanderung und unwichtiger Bedeutung sowie eine kleine Datenbank mit niedriger Abwanderung und lebenswichtiger Bedeutung haben.

Alles in allem kommt es darauf an, was Sie damit machen wollen.

Ich betrachte die Replikation von PostgreSQL als erheblich besser für Replikate, die für Backup, Hochverfügbarkeit und Disaster Recovery verwendet werden. Dies gilt insbesondere in Kombination mit der Zeitpunktwiederherstellung (PITR) .

Auf der anderen Seite ist es nicht so gut für schreibgeschützte Berichtsreplikate, da Sie die Anwendung replizierter Daten verzögern müssen, während lange Transaktionen ausgeführt werden. Dies bedeutet, dass Sie entweder sehr lange laufende Abfragen stornieren oder dem Master stark hinterherhinken müssen mehr Festplattenspeicher auf dem Master und erzwingen, dass er härter arbeitet, um Schritt zu halten.

Es wird derzeit daran gearbeitet, die logische Replikation in PostgreSQL zu aktivieren. Dabei werden die logischen Änderungen an Tabellenstruktur, Tabelleninhalt usw. repliziert und nicht der Status auf der Festplatte. Das Katalogdesign und die Unterstützung für benutzerdefinierte Elemente machen Pg zu einer recht komplexen Aufgabe. Ein Teil der Grundlagen wurde für 9.4 erstellt, aber es ist unwahrscheinlich, dass eine vollständige logische Replikation vor 9.6 oder höher verwendet werden kann.

Craig Ringer
quelle
Tolle Antwort auf eine Frage, die ich auch hatte. Vielen Dank, Craig.
Swasheck
6
Eine Sache bei Sync Rep überrascht einige Benutzer, ist aber wirklich sinnvoll, wenn Sie darüber nachdenken: Das Festschreiben einer Transaktion, die synchron repliziert wird, wird erst dann zurückgegeben, wenn die Transaktion auf mindestens einem Cluster neben dem Master bestehen bleibt . Leute, die von anderen Systemen kommen, sind der Meinung, dass dies passieren sollte, wenn der Replikationsversuch nicht zu lange dauert. Dies würde bedeuten, dass "es synchron ist, wenn es nicht so ist", was für die PostgreSQL-Community keine akzeptable Garantie darstellt. Verwenden Sie mehrere Synchronisierungsziele, um einen Stillstand zu vermeiden, wenn das Replikat fehlschlägt, oder verwenden Sie Async.
kgrittn
1
@ kgrittn Guter Punkt für mehrere Ziele. Ich bin ein wenig entsetzt darüber, dass irgendjemand eine Festschreibung erwarten würde, bevor die Transaktion in synchroner Replikation repliziert wird. klingt, als wollten sie wirklich eine asynchrone Replikation mit einem maximalen Follower-Gap-Limit, das Schreibvorgänge auf dem Master anhält, bis die Follower genug aufholen? Eine absolut vernünftige Sache zu wollen, aber nicht rep synchronisieren.
Craig Ringer
1
@CraigRinger: Was ich gesehen habe, ist, dass die Leute nach etwas fragen, was Sie angegeben haben. Manchmal fordern sie "Sync rep verwenden, aber automatisch auf async rep zurückgreifen, wenn die Synchronisierung zu lange dauert." So wollen sie nicht zu unterbrechen den Meister , wenn es zu weit hinter der Replik fällt - das ist genau das der Fall , wenn sie es wollen , bestätigen Commits schnell , ohne Schreib auf eine andere Website. Für mich klingt das nach einem Fall, in dem mehr versprochen wird, als geliefert wird. Sie wollen von vornherein "Ja, Sie haben einen Synchronsprecher; Sie sind in Sicherheit." und nach einem Absturz "Diese festgeschriebenen Daten sind verschwunden; sie wurden nirgendwo anders geschrieben."
kgrittn
@CraigRinger vielleicht mit pg10 / logical updaten?
Evan Carroll