- Eine von AWS entwickelte und veröffentlichte Active-Active-Replikations-Erweiterung für PostgreSQL
- Wenn Daten auf mehreren PostgreSQL-Instanzen geschrieben und geändert werden müssen, kann statt des bisherigen Active-Standby-Modells, bei dem nur eine bestimmte Instanz Änderungen annimmt, eine Struktur aufgebaut werden, die gleichzeitige Änderungen und Replikation auf mehreren Instanzen ermöglicht
- Geeignet für Szenarien wie hochverfügbare Datenbankkonfigurationen über mehrere Regionen, Minimierung von Schreibverzögerungen, Blue/Green-Updates von Anwendungen und bidirektionale Datenmigration
- Nutzt logische Replikation und unterstützt dadurch Konflikterkennung, Auflösung von Schreibkonflikten sowie Formatumwandlungen für Zieldatenbanken
Konzept der Active-Active-Replikation
- Replikation ist eine Technik zur Synchronisierung von Änderungen zwischen Datenbanken
- Die bestehende Active-Standby-Architektur von PostgreSQL lässt nur auf einer Instanz Änderungen zu, während die übrigen schreibgeschützt sind; dadurch gibt es eine einzelne Datenquelle
- pgactive bietet eine Active-Active-Replikationstopologie und erlaubt damit gleichzeitige Schreibvorgänge auf mehreren Instanzen
- Dieser Ansatz eignet sich für Umgebungen mit mehreren Schreibpunkten, etwa Multi-Region-Deployments oder bidirektionale Migrationen
- Im Active-Active-Modell müssen Konflikte, Latenzen und bestimmte funktionale Einschränkungen gesondert verwaltet werden
Schlüsseltechnologie: logische Replikation
- Logische Replikation (Logical Replication) überträgt Daten in einem Format, das von externen Systemen interpretiert werden kann
- Durch logische Replikation lassen sich in der Zieldatenbank verschiedene Zusatzfunktionen umsetzen, darunter Konflikterkennung, Auflösung von Schreibkonflikten und Abfragetransformationen
- PostgreSQL führte 2017 mit Version 10 eine grundlegende logische Replikation ein, für Active-Active-Replikation sind jedoch zusätzliche Funktionen erforderlich
- Aufgrund der Entwurfseigenschaften von PostgreSQL können diese Funktionen in Form einer Erweiterung (Extension) entwickelt und eingesetzt werden
- Auch die PostgreSQL-Entwickler-Community ergänzt nach und nach entsprechende Funktionen im Kernprojekt
1 Kommentare
Hacker-News-Kommentare
Als Erstes erschien BDR1, das bis heute Open Source ist (Link); darauf basiert pgactive.
BDR2 war eine Closed-Source-Neuschreibung von BDR1 und wurde schließlich verworfen.
Danach erschienen pglogical v1 und v2 (beide Open Source, Link); v1 wurde dabei stark überarbeitet und in Postgres 10 aufgenommen.
Auf Grundlage der Erfahrungen mit der logischen Replikation in Postgres 10 begann 2nd Quadrant mit der Entwicklung von pglogical v2, woraus auch pgEdge hervorging.
Später entwickelte 2nd Quadrant die Closed-Source-Versionen pglogical v3 und BDR v3, die dann zu BDR v4 zusammengeführt wurden.
Danach wurde das Produkt BDR in Postgres Distributed (PGD, Link) umbenannt.
Nach der Übernahme von 2ndQuadrant durch EDB veröffentlichte EDB PGD v6.
Wenn Konflikte auftreten, wird am Ende nach dem Prinzip „last write wins“ auf Basis des Zeitstempels entschieden.
Aufgetretene Konflikte werden in einer speziellen Tabelle namens pgactive_conflict_history gespeichert, sodass sich die Historie nachvollziehen und Konflikte manuell lösen lassen.
Weitere Details und die Dokumentation finden sich hier.
Falls eine solche Funktion offiziell in Postgres aufgenommen werden könnte, wäre das interessant.
Zum Beispiel möchte man Daten aus Produktion oder Staging lesen, sie aber nur lokal ändern können, ohne dass die Ergebnisse wieder nach upstream zurückfließen, also gewissermaßen eine sekundäre Datenbank.
Derzeit werden meistens per Skript (cron o. Ä.) Dumps oder Abfragen ausgeführt, daraus Snapshots erstellt, diese in S3 gespeichert und lokal wiederhergestellt.
Das funktioniert meistens gut, aber manchmal dauert der Indexaufbau viel zu lange.
Wegen großer rechtlicher und ethischer Risiken empfehlen die meisten Unternehmen dieses Vorgehen nicht.
So lassen sich lokale Tabellen ändern, ohne dass das Primary beeinflusst wird.
Empfohlen wird der Befehl
createdb --template.Eine Merge-Strategie, die für alle Situationen taugt, fällt nicht sofort ein.
Schreiben auf dem Replica wird nicht blockiert; nur die Ergebnisse werden nicht an andere Orte weitergegeben.
Am besten entwirft man die Architektur so, dass sich die beschreibbaren Datenbereiche über alle aktiven Instanzen hinweg nicht überschneiden.
In solchen Fällen kann ein Tool wie pgactive nützlich sein.
Oder man nutzt von Anfang an gleich eine verteilte Datenbank wie Yugabyte.
Alle Master können zwar alle Schemas lesen, aber beim Schreiben ist jeder nur für seinen Bereich zuständig.
Es wird gefragt, ob sich statt Schemas auch Partitionen oder Ähnliches zur Lastverteilung der Zuständigkeiten nutzen lassen.
Ein direkter Einsatz in ihren eigenen Produkten fällt nicht sofort ein.
RDS nutzt Block-Replikation, Aurora eine eigene SAN-Replikation.
Vermutet wird, dass es vielleicht für DMS gedacht ist.
Es wird infrage gestellt, warum man das bei einer stark ACID-orientierten relationalen Datenbank überhaupt tun sollte.
Vor einem Monat gab es dann die Nachricht, dass sie offiziell als Open Source für die Community freigegeben wurde (offizielle Meldung).
Wenn ich nachts ruhig schlafen will, würde ich es möglichst vermeiden.
Die Kombination aus patroni+etcd+haproxy wird oft empfohlen, und wenn Leute mit Praxiserfahrung so begeistert dazu raten, wird das wohl gute Gründe haben.
Als ich mir aber Beispielkonfigurationen auf Basis von docker compose angesehen habe, wirkte das etwas abschreckend.
pgpool scheint dagegen einfacher zu sein, weil man es offenbar nur vor jede Postgres-Instanz setzen muss.
Mich interessieren Empfehlungen oder Erfahrungen von Leuten, die Postgres im echten Betrieb mögen und nutzen.
Ziel ist es, auf Basis von docker compose möglichst einfach einen Cluster mit hoher Verfügbarkeit, mindestens ohne Datenverlust, und mit Point-in-Time-Recovery aufzubauen.
<i>Pgactive: Active-Active Replication Extension for PostgreSQL on Amazon RDS</i>
Hacker-News-Beitrag (Beitrag von Oktober 2023, 1 Kommentar)
Das heißt, je nach Situation muss man die jeweiligen Vor- und Nachteile akzeptieren.