Logische Replikation und Decodierung einrichten

Sie können die Funktionen zur logischen Replikation und Decodierung in Cloud SQL for PostgreSQL verwenden. Diese Features ermöglichen logische Replikations-Workflows und Workflows für die Änderung von Datenerfassung (CDC).

Allgemeine Informationen zur Replikation finden Sie unter Replikation in Cloud SQL.

Einführung

Wenn PostgreSQL die logische Replikation ausführt, werden die an Replikate gestreamten Änderungen aus den WAL-Logs mithilfe der logischen Decodierung extrahiert. Die decodierten Änderungen sind unabhängig vom zugrunde liegenden physischen Speicherformat. Die Änderungen spiegeln nur die Änderungen an Daten auf SQL-Ebene in Bezug auf INSERTs, UPDATEs und DELETEs wider. Diese Unabhängigkeit von der Speicherebene bietet große Flexibilität und ermöglicht den Nutzern der Änderungsstreams eine breite Palette von Funktionen.

Die logische Replikation ist das Flag-Feature, das auf der logischen Decodierung basiert.

Im Gegensatz zum Feature Physische Replikation von PostgreSQL, bei dem die Quell- und Zieldatenbanken dieselbe Version haben müssen, ermöglicht die logische Replikation die Replikation über PostgreSQL-Hauptversionen. Die logische Replikation in Cloud SQL wird von der pglogical-Erweiterung unterstützt, die in allen PostgreSQL-Versionen verfügbar ist, sowie von der nativen logischen Replikation von PostgreSQL, die in PostgreSQL 10 hinzugefügt wird.

Das Format, in dem Änderungen gestreamt werden, kann mit verschiedenen Plug-ins konfiguriert werden. Dies ermöglicht flexible Architekturen zur Änderung von Daten (Change Data Capture, CDC). Mit der Erweiterung wal2json können Sie beispielsweise alle Änderungen in einer Datenbank im JSON-Format streamen. Cloud SQL unterstützt den integrierten pgoutput-Decoder, das contrib-Modul test_decoding und wal2json. Cloud SQL unterstützt derzeit beide wal2json-Varianten der JSON-Ausgabe: format-version 1, was die gesamte Transaktion als einzelnes JSON-Objekt codiert, und format-version 2, was ein JSON-Objekt pro Befehl ausgibt. Diese Plug-ins ermöglichen die Replikation auf Nicht-PostgreSQL-Datenbanken.

PostgreSQL-Instanz konfigurieren

PostgreSQL unterstützt die logische Decodierung durch Schreiben zusätzlicher Informationen in sein Write-Ahead-Log (WAL).

In Cloud SQL aktivieren Sie dieses Feature, indem Sie das Flag cloudsql.logical_decoding auf on setzen. Diese Einstellung unterscheidet sich von der Einstellung in Standard-PostgreSQL. Wenn Sie eine externe PostgreSQL-Instanz ändern, aktivieren Sie dieses Feature, indem Sie den Konfigurationsparameter wal_level auf logical setzen.

Wenn Sie die pglogical-Erweiterung verwenden möchten, muss pglogical zu shared_preload_libraries hinzugefügt werden. Da Cloud SQL keine direkte Änderung dieses Flags ermöglicht, wird pglogical aktiviert, indem cloudsql.enable_pglogical auf on gesetzt wird. (Auf einer VM, sudo apt-get install postgresql-13-pglogical) und starten Sie die Datenbank neu.

Wenn Sie pglogical für das Replikat zwischen zwei PostgreSQL-Instanzen verwenden, muss die logische Decodierung nur auf der primären Instanz und nicht auf der Replikatinstanz aktiviert werden, es sei denn, die Instanz selbst ist ein Primär für andere Replikate. Die pglogical-Erweiterung muss jedoch auf beiden Instanzen aktiviert sein. Beispiele für die Verwendung der Begriffe "primär" und "Replikat" und ihrer Bedeutung finden Sie unter Replikation in Cloud SQL.

Netzwerkverbindung aktivieren

Achten Sie darauf, dass Ihre primären Instanzen Verbindungen von der Replikatinstanz akzeptieren.

Primär Replikat Konfiguration
Cloud SQL (öffentliche IP-Adresse) Cloud SQL (öffentliche IP-Adresse) Fügen Sie die ausgehende IP-Adresse des Replikats zu den autorisierten Netzwerken des primären Replikats hinzu.
Cloud SQL (Private IP-Adresse) Cloud SQL (Private IP-Adresse) Wenn sich beide Instanzen im selben Google Cloud-Projekt befinden, fügen Sie den zugewiesenen IP-Bereich des VPC-Netzwerks des Replikats dem autorisierten Netzwerk hinzu, das die Instanzen hostet.

So finden Sie den zugewiesenen IP-Bereich in der Google Cloud Console:

  1. Rufen Sie die Seite VPC-Netzwerke auf.
  2. Wählen Sie das von Ihnen verwendete VPC-Netzwerk aus.
  3. Wählen Sie den Tab Private Dienstverbindung aus.
  4. Wählen Sie den Tab Zugewiesene IP-Bereiche aus.
Extern Cloud SQL Sie können den Datenbank-Migrationsdienst verwenden.
Cloud SQL Extern Weitere Informationen finden Sie unter Externe Replikate konfigurieren.

Ausgehende IP-Adresse einer Replikatinstanz abrufen

Wenn die Replikatinstanz eine Cloud SQL-Instanz mit einer öffentlichen IP-Adresse ist, führen Sie folgende Schritte aus, um die ausgehende IP-Adresse abzurufen.

Console

  1. Öffnen Sie die Seite „Cloud SQL-Instanzen“.

  2. Bewegen Sie den Mauszeiger neben der öffentlichen IP-Adresse des Cloud SQL-Replikats auf die Kurzinfo Weitere Informationen und rufen Sie die ausgehende IP-Adresse ab. Beachten Sie, dass die ausgehende IP-Adresse nicht die IP-Adresse ist, die in der Hauptliste für das Replikat in der Cloud Console angezeigt wird.

Wenn die Replikatinstanz keine Cloud SQL-Instanz ist, lesen Sie die entsprechende Dokumentation.

Weitere Informationen zum Abrufen der öffentlichen IP-Adresse einer Instanz finden Sie unter Ausgehende IP-Adresse des Cloud SQL-Replikats abrufen.

gcloud

Sie können den folgenden gcloud-Befehl verwenden:

gcloud sql instances describe [REPLICA_NAME] --format="default(ipAddresses)"

Verbindungen erlauben

Wenn die primäre Instanz eine Cloud SQL-Instanz ist, können Sie den Zugriff von der ausgehenden IP-Adresse des Replikats zulassen, indem Sie sie als autorisiertes Netzwerk hinzufügen.

Replikationsverbindungen für PostgreSQL 9.6 und niedriger aktivieren

Wenn Ihre primäre Instanz nicht in Cloud SQL ausgeführt wird und PostgreSQL 9.6 oder niedriger ausführt, muss die Datei pg_hba.conf der Instanz so eingestellt sein, dass sie Replikationsverbindungen akzeptiert. Fügen Sie dieser Datei die folgende Zeile hinzu und verwenden Sie all all nur für den ersten Test. Für mehr Sicherheit beschränken Sie Nutzer und IP-Adressen auf die erforderlichen Elemente, wie in diesem Beispiel:

host replication all all md5

Weitere Informationen finden Sie in der Datei pg_hba.conf.

Replikationsnutzer erstellen

Erstellen Sie einen PostgreSQL-Nutzer mit dem Attribut REPLICATION, um logische Decodierungsfunktionen zu verwenden.

Beispiele

CREATE USER replication_user WITH REPLICATION
IN ROLE cloudsqlsuperuser LOGIN PASSWORD 'secret';

Alternativ können Sie dieses Attribut für einen vorhandenen Nutzer festlegen:

ALTER USER existing_user WITH REPLICATION;

PostgreSQL-Ressourcen

Bei der logischen Decodierung wandelt ein Hintergrundprozess auf der primären PostgreSQL-Instanz WAL-Änderungen mithilfe des ausgewählten Decodierungs-Plug-ins in logische Änderungen um und leitet sie an einen Nutzer weiter, der sogar eine Nicht-PostgreSQL-Instanz sein kann. Dieser Hintergrundprozess wird als WAL-Sender bezeichnet. Die Anzahl der gleichzeitigen WAL-Sender, die in einer PostgreSQL-Instanz aktiv sein können, wird durch das Flag max_wal_senders begrenzt. Der Wert dieses Flags ist standardmäßig auf 10 und sein Limit wächst linear mit dem Arbeitsspeicher der Cloud SQL-Instanz, sodass acht WAL-Sender pro GB Arbeitsspeicher zugelassen werden.

Damit WAL-Segmente nicht verworfen werden, bevor sie an alle Nutzer gesendet werden, verwendet PostgreSQL logische Replikationsslots, um zu verfolgen, welche Daten an welchen Nutzer gesendet wurden, und physische Replikationsslots für Lesereplikate. Die Anzahl der Replikationsslots, die Sie für eine PostgreSQL-Instanz erstellen können, ist durch das Flag max_replication_slots begrenzt. Der Wert dieses Flags beträgt standardmäßig 10 und sein Limit wächst mit dem Arbeitsspeicher der Cloud SQL-Instanz, sodass zwischen 2 und 8 Replikationsslots pro GB Arbeitsspeicher möglich sind.

Die folgende Tabelle zeigt die Beziehung zwischen dem maximalen Arbeitsspeicher einer Cloud SQL-Instanz und der maximalen Anzahl an Replikationsslots für die Instanz.

Maximaler Arbeitsspeicher (GB)
Maximale Anzahl an Replikationsslots
4
10
16
32
32
128
64
256
128
512
256
1.024
512
2.048
512 oder mehr
4.096

Im Allgemeinen gibt es einen Replikationsslot und einen WAL-Sender pro Nutzer. Daher sollten diese Flags auf ungefähr identische Werte gesetzt werden. PostgreSQL empfiehlt jedoch, einen kleinen Puffer für max_wal_senders bereitzustellen, der verwendet werden kann, wenn Verbindungen unerwartet unterbrochen und neue Verbindungen hergestellt werden. Die physische Replikation, die von Cloud SQL-Lesereplikaten verwendet wird, verwendet auch einen Replikationsslot und einen WAL-Sender. Berücksichtigen Sie daher diese bei der Berechnung der benötigten Anzahl von Ressourcen.

Die native logische Replikation von PostgreSQL sowie pglogical erfordern die Ausführung zusätzlicher Hintergrundprozesse, sowohl auf der primären Instanz als auch auf der Replikatinstanz. Die Anzahl der Hintergrundprozesse, die ausgeführt werden können, ist durch das Flag max_worker_processes begrenzt. Die Standardeinstellung ist acht und das Limit wächst linear mit dem Arbeitsspeicher der Cloud SQL-Instanz, wodurch zwei zusätzliche Prozesse pro GB Arbeitsspeicher zugelassen werden. Die genaue Anzahl der Worker-Prozesse, die bei diesen Ansätzen verwendet werden, wird in den entsprechenden Abschnitten erläutert.

Wenn dieses Flag zu niedrig ist und die Replikation mit der Fehlermeldung worker registration failed in Ihren Logs fehlschlägt, müssen Sie möglicherweise die Einstellung max_worker_processes erhöhen.

Beachten Sie, dass WAL-Sender nicht als Worker-Prozesse zählen. Worker, die für die parallele Abfrageausführung erzeugt wurden, geben an, dass der Wert von max_worker_processes zu niedrig eingestellt ist. Dies kann die Leistung beeinträchtigen, da PostgreSQL die parallele Abfrageausführung nicht nutzen kann.

Mit der Funktion pg_ls_waldir () können Sie die WAL-Laufwerksnutzung ermitteln. Diese Funktion ist auf cloudsqlsuperuser-Nutzer wie den Standardadministratornutzer postgres beschränkt. Diese Funktion ist nur in PostgreSQL Version 10 und höher verfügbar.

So berechnen Sie die gesamte WAL-Laufwerksnutzung:

postgres=> select * from pg_ls_waldir();
Name Größe Änderung
00000001000000000000000A 16777216 2021-08-11 15:16:49+00
000000010000000000000009 16777216 2021-08-12 06:23:24+00

(2 Zeilen)

postgres=> select pg_size_pretty(sum(size)) as "Total WAL disk usage" from pg_ls_waldir();
WAL-Laufwerksnutzung gesamt
32 MB

(1 Zeile)

Logische Replikation mit externem Replikat einrichten

Ein komplettes Beispiel mit pglogischer und logischer Decodierung finden Sie unter Externe Replikate konfigurieren.

Logische Replikation mit pglogical einrichten

Zum Einrichten der logischen Replikation mit pglogical muss die logische Decodierung auf der primären Instanz aktiviert sein. Legen Sie cloudsql.logical_decoding=on für die Cloud SQL-Instanz oder wal_level=logical für eine externe Instanz fest. Darüber hinaus muss der pglogical sowohl in der primären als auch in der Replikatinstanz aktiviert sein; Legen Sie cloudsql.enable_pglogical=on auf einer Cloud SQL-Instanz fest oder fügen Sie pglogical zu shared_preload_libraries einer externen Instanz hinzu. Beachten Sie, dass bei einer Änderung dieser Flags sowohl die primäre Instanz als auch die Replikatinstanz neu gestartet werden müssen.

Wenn bei diesen Schritten Probleme auftreten, finden Sie unter Fehlerbehebung bei pglogical weitere Informationen.

Nutzer mit Replikationsberechtigungen erstellen

Sie benötigen einen Nutzer mit Replikationsberechtigungen und der Rolle cloudsqlsuperuser auf der primären Instanz und der Replikatinstanz, wenn Sie pglogical verwenden. Alle unten beschriebenen Befehle sollten von diesem Nutzer ausgeführt werden.

pglogical-Erweiterung installieren

Sie müssen die pglogical-Erweiterung sowohl auf der primären Instanz als auch auf der Replikatinstanz installieren. Auf dem primären Server muss der Replikationsnutzer (d. h. der Nutzer, der eine Verbindung zur Datenbank herstellt) installiert werden.

CREATE EXTENSION pglogical;

pglogical-Knoten auf jeder Instanz erstellen

Ein pglogical-Knoten stellt eine physische PostgreSQL-Instanz dar und speichert Verbindungsdetails für diese Instanz. Sowohl die primäre Instanz als auch die Replikatinstanz müssen sich als Knoten registrieren:

source-instance$ SELECT pglogical.create_node(
    node_name := 'primary',
    dsn := 'host=<primary-ip> port=5432 dbname=postgres user=replication_user password=secret'
);

dest-instance$ SELECT pglogical.create_node(
    node_name := 'replica',
    dsn := 'host=<replica-ip> port=5432 dbname=postgres user=replication_user password=secret'
);

Tabelle mit zu replizierenden Daten erstellen

Die pglogical-Erweiterung ermöglicht das Replizieren eines Teils der Tabellen an ein Ziel. Beispielsweise erstellen wir eine Dummy-Tabelle auf der primären Instanz und füllen sie mit zu testenden Daten:

CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text);
INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');

Die Tabelle muss auch auf der Replikatinstanz erstellt werden.

Tabelle zu einem Replikationssatz hinzufügen

Um die Replikation verschiedener Datasets an verschiedene Ziele zu unterstützen, hat pglogical das Konzept eines Replikations-Datasets. Sie können unsere Testtabelle dem Standardreplikationssatz hinzufügen.

SELECT pglogical.replication_set_add_table('default', 'replica_test', true);

pglogical-Abo erstellen

Erstellen Sie das pglogical-Abo für die Zielinstanz, indem Sie Verbindungsdetails für die primäre Instanz angeben.

SELECT pglogical.create_subscription(
    subscription_name := 'test_sub',
    provider_dsn := 'host=<primary-ip> port=5432 dbname=postgres user=replication_user password=replicapassword'
);

SELECT * FROM pglogical.show_subscription_status('test_sub');

Wenn der Status "Replikat" angezeigt wird, ist die Einrichtung erfolgreich. Fragen Sie die Tabelle replica_test ab, um sicherzustellen, dass die Daten repliziert wurden. Fügen Sie Datensätze in die primäre Instanz ein und ändern Sie sie. Prüfen Sie dann, ob sie dann auf der Replikatinstanz angezeigt werden.

Fragen Sie in der primären Datenbank die Tabelle pg_replication_slots ab, um den vom Abo erstellten Replikationsslot abzurufen.

Clean-up

Nachdem der Test erfolgreich war, löschen Sie das Abo auf dem Replikat mit pglogical.drop_subscription('test_sub'). Prüfen Sie, ob der Replikationsslot auch auf der primären Instanz gelöscht wurde. Andernfalls akkumulieren WAL-Segmente auf der Replikatinstanz weiter.

Weitere Informationen zu Replikationssätzen, Teildatenreplikation, DDL-Replikation, anderen erweiterten Konfigurationen und Einschränkungen finden Sie in der pglogical-Dokumentation.

Ressourcennutzung

Die pglogical-Erweiterung führt mehrere Hintergrundprozesse aus, die auf das max_worker_processes-Limit angerechnet werden.

Im stabilen Zustand führt sie einen "Supervisor"-Prozess aus, wenn diese aktiviert ist, einen "Manager"-Prozess pro PostgreSQL-Datenbank, in der die Erweiterung installiert ist (z. B. können D hiervon vorhanden sein) und ein "apply"-Prozess pro pglogical-Abo auf der Replikatinstanz (z. B. könnte S davon vorhanden sein). Die Erweiterung kann jedoch bei der ersten Synchronisierung zusätzliche Worker-Prozesse erzeugen und tatsächlich "Manager"-Prozesse für alle Datenbanken in der Instanz erzeugen. Wenn die Datenbank jedoch keine installierte Erweiterung hat, wird sie sofort beendet.

Weisen Sie daher einige weniger Worker-Prozesse zu als im stabilen Zustand erforderlich. Worker-Prozesse werden von PostgreSQL für andere Zwecke wie die parallele Abfrageverarbeitung verwendet. Wenn max_worker_processes zu niedrig ist, kann die Replikation im Hintergrund fehlschlagen oder PostgreSQL kann keine parallele Abfrageverarbeitung durchführen.

Zusammenfassung: Diese Einstellungen werden empfohlen:

max_worker_processes
  >= 1 + D + 8 (on the source instance)
  >= 1 + D + S + 8 (on the destination instance)
max_wal_senders >= S + 2 (on the source instance)
max_replication_slots >= S (on the source instance)

Fehler mit pglogical beheben

pglogical-Erweiterung kann nicht erstellt werden

Wenn Sie versuchen, die pglogical-Erweiterung zu installieren, wird möglicherweise folgender Fehler angezeigt:

ERROR:  pglogical is not in shared_preload_libraries

Wenn Sie pglogical auf einer Cloud SQL-Instanz installieren, müssen Sie cloudsql.enable_pglogical=on festgelegt haben. Wenn Sie eine externe Instanz verwenden, fügen Sie sie direkt dem Flag shared_preload_libraries hinzu, z. B. shared_preload_libraries=pg_stat_statements,pglogical. Diese Änderungen erfordern einen Neustart der primären Instanz.

pglogical-Abo konnte nicht erstellt werden

Beim Erstellen eines Abos prüft pglogical zuerst, ob es die Verbindungsdetails verwenden kann, um eine Verbindung zur Instanz herzustellen. Es wird zuerst versucht, eine reguläre Verbindung zu erstellen, und wenn dies fehlschlägt, wird ein Fehler ausgegeben: ERROR: could not connect to the postgresql server.

Wenn dieser Fehler auftritt, prüfen Sie, ob die primäre Instanz so konfiguriert ist, dass Verbindungen von der Replikatinstanz zulässig sind. Prüfen Sie außerdem, ob die von Ihnen angegebenen Verbindungsdetails korrekt sind. Es werden zusätzliche Details bereitgestellt, warum PostgreSQL keine Verbindung herstellen konnte.

Nach dem Erstellen einer regulären Verbindung versucht pglogical, eine spezielle Replikationsverbindung herzustellen. In PostgreSQL 9.6 und früheren Versionen konnte diese Art von Verbindung eine andere Authentifizierungskonfiguration haben. Wenn der Fehler ERROR: could not connect to the postgresql server in replication mode angezeigt wird, müssen Sie die Datei pg_hba.conf auf der Quellinstanz aktualisieren.

Die von Cloud SQL verwendete Datei pg_hba.conf enthält bereits die erforderlichen Änderungen. Dieser Fehler tritt nur auf, wenn eine Verbindung zu einer externen Instanz hergestellt wird, die nicht von Cloud SQL verwaltet wird.

Alternativ kann die Verbindung zum Replikationsmodus fehlschlagen, wenn die Quellinstanz nicht genügend WAL-Sender zulässt. Wenn FATAL: number of requested standby connections exceeds max_wal_senders angezeigt wird, erhöhen Sie den Wert max_wal_senders auf der primären Instanz.

pglogical-Abo ist ausgefallen

Ein pglogical-Abo kann möglicherweise nicht repliziert werden. Um dieses Problem zu beheben, prüfen Sie zuerst, ob auf der Replikatinstanz ein Hintergrundprozess ausgeführt wird. Fragen Sie pg_stat_activity ab, um zu prüfen, ob ein pglogical apply-Prozess ausgeführt wird. Prüfen Sie andernfalls die Logs auf dem Zielknoten. Wenn die Meldung worker registration failed, angezeigt wird, können Sie die Einstellung max_worker_processes erhöhen.

Prüfen Sie dann, ob in der primären Instanz ein Replikationsslot erstellt wurde. Auf der Replikatinstanz enthält die Zeile in pglogical.subscription den Namen des Slots, den das Abo erstellen soll. Auf der primären Instanz können Sie pg_replication_slots abfragen, um zu prüfen, ob der Slot erfolgreich erstellt.

Wenn kein Replikationsslot erstellt wurde, prüfen Sie die Logs auf der primären Instanz.

Der Fehler ERROR: logical decoding requires wal_level >= logical bedeutet, dass das Flag wal_level nicht auf logical festgelegt wurde. Dieses Problem können Sie beheben, indem Sie cloudsql.logical_decoding=on auf der primären Instanz festlegen, wenn es sich um eine Cloud SQL-Instanz handelt.

Wenn die Instanz eine externe Instanz ist, legen Sie wal_level=logical fest.

Andernfalls wird möglicherweise ERROR: all replication slots are in use und der hilfreiche HINT: Free one or increase max_replication_slots angezeigt.

Native logische PostgreSQL-Replikation einrichten

Ab PostgreSQL 10 unterstützt PostgreSQL die native logische Replikation. Zum Einrichten der nativen logischen Replikation muss die logische Decodierung auf der primären Instanz aktiviert sein. Dazu legen Sie für eine Cloud SQL-Instanz cloudsql.logical_decoding=on oder für eine externe Instanz wal_level=logical fest. Beachten Sie, dass bei einer Änderung dieser Flags ein Neustart der primären Instanz erforderlich ist.

Prüfen Sie, ob die Instanzen ordnungsgemäß konfiguriert sind (für die Netzwerkverbindung usw.), indem Sie die Abschnitte unter PostgreSQL-Instanz konfigurieren lesen. Diese Seite enthält die Schritte für ein Proof of Concept. Wenn bei den Schritten in diesen Abschnitten Probleme auftreten, finden Sie weitere Informationen unter Fehlerbehebung bei pglogical. Weitere Informationen finden Sie unter Logische Replikation in der PostgreSQL-Dokumentation.

Tabelle mit zu replizierenden Daten erstellen

Die logische PostgreSQL-Replikation unterstützt eine gesamte Datenbank oder nur einzelne Tabellen. Beispielsweise erstellen wir eine Dummy-Tabelle auf der primären Instanz und füllen sie zum Testen mit Daten.

CREATE TABLE native_test (id SERIAL PRIMARY KEY, data text);
INSERT INTO native_test (data) VALUES ('apple'), ('banana'), ('cherry');

Die Tabelle muss auch auf der Replikatinstanz erstellt werden.

Publikation auf der primären Instanz erstellen

Native logische Log-Replikation bezieht sich auf Publisher und Abonnenten. Erstellen Sie eine Publikation der Daten in native_test:

CREATE PUBLICATION pub FOR TABLE native_test;

Abo auf der Replikatinstanz erstellen

Hier ist ein Beispiel für das Erstellen eines Abos auf der Replikatinstanz:

CREATE SUBSCRIPTION sub
    CONNECTION 'host=<primary-ip> port=5432 dbname=postgres user=replication_user password=replicapassword'
    PUBLICATION pub;

Zum Erstellen des Abos auf der Replikatinstanz ist die Rolle cloudsqlsuperuser erforderlich. Nachdem Sie das Abo erstellt haben, können Sie die Tabelle native_test abfragen, um zu prüfen, ob die Daten in der Replikatinstanz angezeigt wurden.

In der primären Datenbank können Sie die Tabelle pg_replication_slots abfragen, um den vom Abo erstellten Replikationsslot anzuzeigen.

Clean-up

Wenn der Test erfolgreich ist, löschen Sie das Abo auf dem Replikat mit DROP SUBSCRIPTION sub;. Prüfen Sie, ob der Replikationsslot auch auf der primären Instanz gelöscht wurde. Andernfalls werden sich WAL-Segmente auf der primären Instanz weiterhin angesammelt.

Einschränkungen bei der logischen PostgreSQL-Replikation

Der Zugriff auf die Spalte subconninfo der Systemtabelle pg_subscription ist nicht verfügbar.

Wenn Sie pg_dump ausführen, können keine Informationen zu Abos abgerufen werden, da geprüft wird, ob der Nutzer, der die Verbindung herstellt, Superuser-Berechtigungen hat.

Decodierte WAL-Änderungen für die Change Data Capture (CDC) empfangen

Als alternativer Anwendungsfall für CDC kann die logische Decodierung Änderungen von einer PostgreSQL-Instanz streamen. Das dafür verwendete Standardtool ist pg_recvlogical.

Mit dem pg_recvlogical-Tool können Sie einen Replikationsslot erstellen und die von diesem Slot erfassten Änderungen streamen. Das Format der Änderungen hängt von der ausgewählten Codierungs-Plug-in ab. Sie können Folgendes angeben:

  • wal2json, um im JSON-Format formatierte Änderungen zu streamen, oder

  • test_decoding, um Änderungen zu streamen, die mit einem Bare-Text-Format formatiert sind

Replikationsslot erstellen

Führen Sie folgenden Befehl aus, um einen Replikationsslot zu erstellen:

pg_recvlogical
  -h <instance_ip> \
  -U <replication_user> \
  -p 5432 \
  -d postgres \
  --slot test_slot \
  --create-slot \
  -P <decoder_plugin>

Streamänderungen

Führen Sie in einem Cloud Shell-Terminal folgenden Befehl aus:

pg_recvlogical
  -h <instance_ip> \
  -U <replication_user> \
  -p 5432 \
  -d postgres \
  --slot test_slot \
  --start \
  -f -

Stellen Sie in einem anderen Cloud Shell-Terminal eine Verbindung zu Ihrer Datenbank her und führen Sie folgende Befehle aus:

CREATE TABLE cdc_test (id SERIAL PRIMARY KEY, data text);
INSERT INTO cdc_test (data) VALUES ('apple', 'banana');
UPDATE cdc_test SET data = 'cherry' WHERE id = 2;
DELETE FROM cdc_test WHERE id = 1;
DROP TABLE cdc_test;

Wenn Sie das Decoder-Plug-in wal2json verwenden, wird im ersten Cloud Shell-Terminal eine Ausgabe wie die folgende angezeigt:

{"change":[]}
{"change":[{"kind":"insert","schema":"public","table":"cdc_test","columnnames":["id","data"],"columntypes":["integer","text"],"columnvalues":[1,"apple"]},{"kind":"insert","schema":"public","table":"cdc_test","columnnames":["id","data"],"columntypes":["integer","text"],"columnvalues":[2,"banana"]}]}
{"change":[{"kind":"update","schema":"public","table":"cdc_test","columnnames":["id","data"],"columntypes":["integer","text"],"columnvalues":[2,"cherry"],"oldkeys":{"keynames":["id"],"keytypes":["integer"],"keyvalues":[2]}}]}
{"change":[{"kind":"delete","schema":"public","table":"cdc_test","oldkeys":{"keynames":["id"],"keytypes":["integer"],"keyvalues":[1]}}]}
{"change":[]}

Wenn Sie das Decoder-Plug-in test_decoding verwenden, wird im ersten Cloud Shell-Terminal eine Ausgabe wie die folgende angezeigt:

BEGIN 19460
COMMIT 19460
BEGIN 19461
table public.cdc_test: INSERT: id[integer]:1 data[text]:'apple'
table public.cdc_test: INSERT: id[integer]:2 data[text]:'banana'
COMMIT 19461
BEGIN 19462
table public.cdc_test: UPDATE: id[integer]:2 data[text]:'cherry'
COMMIT 19462
BEGIN 19463
table public.cdc_test: DELETE: id[integer]:1
COMMIT 19463
BEGIN 19464
COMMIT 19464

Ihre Transaktions-IDs können abweichen.

Clean-up

Löschen Sie nach Abschluss des Tests den von Ihnen erstellten Replikationsslot mit folgendem Befehl:

pg_recvlogical
  -h <instance_ip> \
  -U <replication_user> \
  -p 5432 \
  -d postgres \
  --slot test_slot \
  --drop-slot

Hinweise und Einschränkungen

Die Hinweise und Einschränkungen in diesem Abschnitt gelten für die logischen Replikations- und Decodierungsfunktionen von Cloud SQL for PostgreSQL.

  • Die pglogical-Erweiterung funktioniert nicht in Instanzen, in denen die Erzwungene Verwendung von Connectors aktiviert ist. Diese Einschränkung gilt nicht für Instanzen, für die der Zugriff auf private Dienste konfiguriert ist.

  • Wenn Sie eine Instanz wiederherstellen, in der cloudsql.logical_decoding oder cloudsql.enable_pglogical aktiviert ist und die derzeit als Publisher für die logische Replikation fungiert, müssen Sie die Replikation zuerst auf alle Zielinstanzen deaktivieren. Andernfalls schlägt die Wiederherstellung in der Instanz mit einem Fehler fehl, derzeit sind jedoch die Details des Fehlers nicht sichtbar.

  • Wenn Sie eine Sicherung einer Instanz wiederherstellen, in der cloudsql.logical_decoding oder cloudsql.enable_pglogical zum Zeitpunkt der Sicherung aktiviert war und Sie diese in einer neuen Instanz wiederherstellen, wird der Replikationsstatus nicht in der neuen Instanz wiederhergestellt. Sie müssen die Replikation anschließend manuell neu konfigurieren.

  • Auf einer Cloud SQL-Instanz mit einem oder mehreren Cloud SQL-Lesereplikaten (durch physische Replikation) werden diese Flags auch auf dem Lesereplikat aktiviert, wenn Sie cloudsql.logical_decoding oder cloudsql.enable_pglogical aktivieren.

    • Cloud SQL-Lesereplikate können nicht als Publisher für die logische Replikation genutzt werden, da PostgreSQL die logische Decodierung in Lesereplikaten nicht unterstützt. Die Flags sind jedoch auf der Lesereplikatinstanz aktiviert, damit sie bei einem Hochstufen als Ersatz für die primäre Instanz dienen kann.

    • Wenn Sie cloudsql.logical_decoding oder cloudsql.enable_pglogical auf der primären Instanz aktivieren, werden die Flags auf allen Lesereplikaten aktiviert. Dies führt dazu, dass die primären und Lesereplikate kurz nacheinander neu gestartet werden. Um diese Situation zu vermeiden und zu steuern, wann jede Instanz neu gestartet wird, können Sie (1) die Flags auf jedem Lesereplikat nacheinander festlegen und nur dann (2) die Flags auf der primären Instanz festlegen.

    • Das Deaktivieren von cloudsql.logical_decoding oder cloudsql.enable_pglogical auf der primären Instanz führt nicht dazu, dass die Flags auf allen Lesereplikaten deaktiviert werden. Um die Flags in den Instanzen zu deaktivieren, müssen Sie den umgekehrten Vorgang des oben beschriebenen Vorgangs ausführen: (1) Deaktivieren Sie die Flags auf der primären Instanz und (2) deaktivieren Sie die Flags wiederum auf jedem Lesereplikat.