Auf dieser Seite finden Sie eine Anleitung zum Replizieren von Daten zwischen Google Cloud AlloyDB und AlloyDB Omni mithilfe der pglogical
-Erweiterung.
Eine Übersicht über pglogical
in AlloyDB Omni, seine Vorteile und Einschränkungen finden Sie unter Die pglogical-Erweiterung.
Wichtige Komponenten von pglogical
Die wichtigsten Komponenten der pglogical
-Erweiterung sind:
- Knoten: Referenz für die Datenbank in einem PostgreSQL-Cluster.
Die
pglogical
-Erweiterung wird in beliebig viele Datenbanken im Cluster installiert und funktioniert für jede davon. Jede Datenbank fungiert als separater pglogical-Knoten. Jeder Knoten kann entweder ein Anbieter (auch als Replikationsquelle bezeichnet) oder ein Abonnent (auch als Replikationsziel bezeichnet) oder beides gleichzeitig sein. Pro Datenbank ist nur ein Knoten zulässig. - Replikationssatz: Wird in der Anbieterdatenbank als logische Gruppierung von Tabellen und Sequenzen definiert, die migriert werden sollen, sowie der SQL-Anweisungen wie
INSERT, UPDATE, DELETE, TRUNCATE
, die repliziert werden müssen. Sie können Tabellen mehreren Replikationssätzen zuweisen. Standardmäßig sind drei vorkonfigurierte Replikationssätze wiedefault
,default_insert_only
undddl_sql
verfügbar. Sie können beliebig viele zusätzliche Replikationssätze hinzufügen, um Ihre Anforderungen zu erfüllen. - Abo: Hier finden Sie Details zu den Änderungen, die aus Anbieterdatenbanken in die Abonnentendatenbank repliziert werden. Im Abo wird die Anbieterdatenbank über einen Verbindungsstring und optional die Replikatsätze dieses Anbieters angegeben, die kopiert werden sollen. Außerdem können Sie beim Erstellen des Abos angeben, ob
apply delay
verwendet werden soll.
Bei dieser Bereitstellung ist der AlloyDB-Dienst von Google Cloud der Anbieter und die On-Premises-Version von AlloyDB Omni der Abonnent. Beachten Sie, dass auch die umgekehrte Konfiguration möglich ist.
Unterstützte Authentifizierungsmethoden
Sie müssen die Netzwerk- und Sicherheitsaspekte zwischen den Replikationsknoten berücksichtigen, bevor Sie die pglogical
-Erweiterung in AlloyDB Omni implementieren.
Die beiden wichtigsten Authentifizierungsmethoden, die mit der pglogical
-Erweiterung verwendet werden, sind die Passwort- und die Vertrauensauthentifizierung.
Die empfohlene Authentifizierungsmethode ist die Vertrauensauthentifizierung, da bei der Passwortauthentifizierung Passwörter im Klartextformat in Datenbanktabellen gespeichert werden, die zu pglogical
gehören. Diese Passwörter sind in Klartext für alle Nutzer mit Datenbankberechtigungen zum Abfragen dieser Tabellen, in nicht binären Sicherungen und in den PostgreSQL-Protokolldateien sichtbar.
Wenn Sie die Vertrauensauthentifizierung verwenden, müssen Sie für maximale Sicherheit bestimmte Einträge in der hostbasierten Authentifizierungsdatei pg_hba.conf
vornehmen. Sie können den Zugriff einschränken, indem Sie die Zieldatenbanken angeben und nur die Replikationsoption oder bestimmte Datenbanken, den Replikationsnutzer und nur von der IP-Adresse des Abonnenten zulassen.
Hinweise
Sie können pglogical
als Erweiterung in einer bestimmten Datenbank installieren.
Bevor Sie die pglogical
-Erweiterung in AlloyDB Omni implementieren, müssen die folgenden Systemanforderungen erfüllt sein:
- Einen Google Cloud AlloyDB-Cluster und Lese-/Schreibzugriff auf die primäre Instanz als Cloud AlloyDB-Administrator. Eine Anleitung zum Bereitstellen eines Google Cloud AlloyDB-Clusters finden Sie unter Datenbank erstellen und eine Verbindung herstellen.
- Ein installierter und konfigurierter AlloyDB Omni-Server Eine Anleitung zum Installieren von AlloyDB Omni finden Sie unter AlloyDB Omni installieren.
- Die IP-Adressen sowohl für die primäre Instanz von Google Cloud AlloyDB als auch für den AlloyDB Omni-Hostserver.
- Ein eingerichtetes und gesichertes Netzwerk zwischen dem Google Cloud AlloyDB- und dem AlloyDB Omni-Hostserver. Eine TCP-Verbindung zum PostgreSQL-Standardport 5432 ist erforderlich.
Parameter beim AlloyDB-Anbieter in der Google Cloud anpassen
Für die pglogical
-Erweiterung sind nur wenige Parameteranpassungen am AlloyDB-Anbietercluster in derGoogle Cloud erforderlich. Sie müssen den Parameter wal_level
auf logical
festlegen und dem Parameter shared_preload_libraries
in der Datei postgresql.conf
pglogical
anhängen.
cp postgresql.conf postgresql.bak
sed -r -i "s|(\#)?wal_level\s*=.*|wal_level=logical|" postgresql.conf
sed -r -i "s|(\#)?(shared_preload_libraries\s*=\s*)'(.*)'.*$|\2'\3,pglogical'|" postgresql.conf
sed -r -i "s|',|'|" postgresql.conf
Im Google Cloud AlloyDB-Dienst können Sie Parameter anpassen, indem Sie die entsprechenden Cluster-Flags festlegen.
Sie müssen die Parameter für die folgenden Google Cloud AlloyDB-Flags anpassen:
alloydb.enable_pglogical = on
alloydb.logical_decoding = on
Informationen zum Festlegen von Datenbank-Flags in Google CloudAlloyDB finden Sie unter Datenbank-Flags einer Instanz konfigurieren.
Für die anderen erforderlichen Datenbankparameter des Anbieterknotens müssen Sie dieGoogle Cloud AlloyDB-Standardwerte so festlegen:
max_worker_processes
: eine pro Anbieterdatenbank und mindestens eine pro Abonnentenknoten. Der Standardwert für diesen Parameter ist mindestens 10.max_replication_slots
: eins pro Knoten auf Anbieterknoten.max_wal_senders
: eins pro Knoten auf Anbieterknoten.track_commit_timestamp
: Setzen Sie diese Option aufon
, wenn die letzte oder erste Aktualisierung bei der Konfliktlösung berücksichtigt werden soll.listen_addresses
: muss die AlloyDB Omni-IP-Adresse enthalten oder über einen abdeckenden CIDR-Block erwähnt werden.
Sie können diese Parameter mit einem beliebigen Abfragetool wie psql
prüfen.
Parameter im AlloyDB Omni-Abonnentencluster anpassen
Für die pglogical
-Erweiterung sind auch einige Parameteranpassungen für den AlloyDB Omni-Abonnenten erforderlich. Hängen Sie in der Datei DATA_DIR/postgresql.conf
pglogical
an den Parameter shared_preload_libraries
an. Wenn eine Datenbank im Cluster als Anbieterdatenbank dient, nehmen Sie die für Anbieterdatenbanken erforderlichen Parameteränderungen vor.
Ersetzen Sie DATA_DIR durch den Dateisystempfad zu Ihrem Datenverzeichnis, z. B. /home/$USER/alloydb-data
.
Passen Sie die Parameter an:
sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" DATA_DIR/postgresql.conf
Prüfen Sie, ob der Parameter richtig festgelegt ist:
grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
Starten Sie AlloyDB Omni neu, damit die Parameteränderung wirksam wird:
Docker
docker container restart CONTAINER_NAME
Ersetzen Sie
CONTAINER_NAME
durch den Namen, den Sie dem AlloyDB Omni-Container bei der Installation zugewiesen haben.Podman
podman container restart CONTAINER_NAME
Ersetzen Sie
CONTAINER_NAME
durch den Namen, den Sie dem AlloyDB Omni-Container bei der Installation zugewiesen haben.Legen Sie die AlloyDB Omni-Standardwerte für andere Anbieterdatenbankparameter fest:
max_worker_processes
: Eine pro Anbieterdatenbank und eine pro Abonnentenknoten.track_commit_timestamp
: Setzen Sie diese Option aufon
, wenn die letzte oder erste Aktualisierung den Konflikt gewinnt und eine Konfliktlösung erforderlich ist.
Prüfen Sie, ob alle Parameterwerte richtig festgelegt sind:
Docker
docker exec CONTAINER_NAME psql -h localhost -U postgres -c " SELECT name, setting FROM pg_catalog.pg_settings WHERE name IN ('listen_addresses', 'wal_level', 'shared_preload_libraries', 'max_worker_processes', 'max_replication_slots', 'max_wal_senders', 'track_commit_timestamp') ORDER BY name;"
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -c " SELECT name, setting FROM pg_catalog.pg_settings WHERE name IN ('listen_addresses', 'wal_level', 'shared_preload_libraries', 'max_worker_processes', 'max_replication_slots', 'max_wal_senders', 'track_commit_timestamp') ORDER BY name;"
Anpassungen der hostbasierten Authentifizierung am AlloyDB Omni-Abonnentencluster
Der pglogical
stellt lokale TCP-Verbindungen zur AlloyDB Omni-Abonnentendatenbank her. Daher musst du der AlloyDB Omni-DATA_DIR/pg_hba.conf
-Datei die IP-Adresse des Hostservers des Abonnenten hinzufügen.
Fügen Sie der Datei
DATA_DIR/pg_hba.conf
einen Eintrag für die Vertrauensauthentifizierung für den lokalen Server hinzu, der für einen neuenpglogical_replication
-Nutzer spezifisch ist:echo -e "# pglogical entries: host all pglogical_replication samehost trust " | column -t | sudo tee -a DATA_DIR/pg_hba.conf
Prüfen Sie, ob der Eintrag korrekt ist:
tail -2 DATA_DIR/pg_hba.conf
Starten Sie AlloyDB Omni neu, damit die Authentifizierungsänderung wirksam wird:
Docker
docker container restart CONTAINER_NAME
Podman
podman container restart CONTAINER_NAME
pglogical
-Nutzer in Anbieter- und Abonnentenclustern erstellen
Sie müssen sowohl im Anbieter- als auch im Abonnentencluster einen neuen Nutzer erstellen.
Für pglogical
benötigt der Nutzer sowohl die Berechtigungen superuser
als auch replication
.
Erstellen Sie im Google Cloud AlloyDB-Anbietercluster den Nutzer und gewähren Sie ihm die Rolle
alloydbsuperuser
:CREATE USER pglogical_replication LOGIN PASSWORD 'secret'; ALTER USER pglogical_replication WITH replication; GRANT alloydbsuperuser TO pglogical_replication;
Erstelle im AlloyDB Omni-Abonnentencluster den Nutzer und gewähre ihm die Attribute
replication
undsuperuser
:CREATE USER pglogical_replication LOGIN PASSWORD 'secret'; ALTER USER pglogical_replication WITH replication; ALTER USER pglogical_replication WITH superuser;
pglogical
und Knoten zur Google Cloud AlloyDB-Anbieterdatenbank hinzufügen
Erforderliche Berechtigungen erteilen
Sie müssen die
pglogical
-Erweiterung in jeder Datenbank installieren und dem pglogical-Datenbanknutzer die Berechtigungusage
gewähren. In Google Cloud AlloyDB müssen Sie Berechtigungen für daspglogical
-Schema gewähren.Wenn Ihre Datenbank beispielsweise
my_test_db
lautet, führen Sie den folgenden Befehl auf die Google Cloud AlloyDB-Anbieterdatenbank aus:\c my_test_db; CREATE EXTENSION IF NOT EXISTS pglogical; GRANT usage ON SCHEMA pglogical TO pglogical_replication; -- For Google Cloud AlloyDB we also need to manually grant privileges: GRANT ALL PRIVILEGES ON ALL tables IN SCHEMA pglogical TO pglogical_replication;
Erstellen Sie einen
pglogical
-Knoten für die Anbieterdatenbanken.node_name
ist beliebig und der Stringdsn
muss eine gültige TCP-Verbindung zurück zur selben Datenbank sein. Bei Google Cloud AlloyDB ist der Hostteil derdsn
die IP-Adresse, die für die primäre Instanz angegeben wurde.Für Google Cloud AlloyDB ist die Vertrauensauthentifizierung nicht zulässig und das Passwortargument muss in der
dsn
enthalten sein. Parameter.Führen Sie beispielsweise für die Datenbank
my_test_db
den folgenden Befehl aus:SELECT pglogical.create_node(node_name := 'provider', dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
Tabelle erstellen und dem Standard-Replikations-Dataset hinzufügen
Erstellen Sie eine Tabelle und fügen Sie sie dem Standardreplizierungssatz in der AlloyDB-Anbieterdatenbank in der Google Cloudhinzu.
Erstellen Sie in der Anbieterdatenbank eine Testtabelle mit dem Namen
test_table_1
:CREATE TABLE test_table_1 (col1 INT PRIMARY KEY); INSERT INTO test_table_1 VALUES (1),(2),(3);
Gewähren Sie
SELECT
für die einzelnen Tabellen oder führen Sie den BefehlGRANT SELECT ON ALL TABLES
aus. Alle Tabellen, die Teil eines Replikationssatzes sein sollen, müssen dem Replikationsnutzerpglogical_replication
die Abfrageberechtigung haben.GRANT SELECT ON ALL TABLES IN SCHEMA public TO pglogical_replication;
Fügen Sie die Testtabelle manuell dem Standard-Replikations-Dataset hinzu. Sie können entweder benutzerdefinierte pglogical-Replikationssätze erstellen oder die Standardreplizierungssätze verwenden. Beim Erstellen der Erweiterung wurden mehrere Standardreplizierungssätze wie
default
,default_insert_only
undddl_sql
erstellt. Sie können den Replikationssätzen Tabellen und Sequenzen einzeln oder für ein bestimmtes Schema auf einmal hinzufügen.-- Add the specified table to the default replication set: SELECT pglogical.replication_set_add_table(set_name := 'default', relation := 'test_table_1', synchronize_data := TRUE); -- Check which tables have been added to all replication sets: SELECT * FROM pglogical.replication_set_table;
Optional: Fügen Sie alle Tabellen in einem bestimmten Schema hinzu, z. B.
public
:-- Add all "public" schema tables to the default replication set: SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']); -- Check which tables have been added to all replication sets: SELECT * FROM pglogical.replication_set_table; -- Add all "public" schema sequences to the default replication: SELECT pglogical.replication_set_add_all_sequences('default', ARRAY['public']); -- Check which sequences have been added to all replication sets: SELECT * FROM pglogical.replication_set_seq;
Entfernen Sie die Tabelle aus dem
default
-Replikationssatz. Wenn es im Schema Tabellen ohne Primärschlüssel gibt, können Sie sie entweder für die Replikation nur von INSERT-Anweisungen einrichten oder die Spalten festlegen, die die Zeile eindeutig identifizieren. Verwenden Sie dazu die FunktionREPLICA IDENTITY
mit dem BefehlALTER TABLE
. Wenn Sie diese Tabellen demdefault
-Replikationssatz automatisch mithilfe der Funktionreplication_set_add_all_tables
hinzugefügt haben, müssen Sie sie manuell aus diesem Replikationssatz entfernen und dem Satzdefault_insert_only
hinzufügen.-- Remove the table from the **default** replication set: SELECT pglogical.replication_set_remove_table(set_name := 'default', relation := 'test_table_2');
-- Manually add to the **default_insert_only** replication set: SELECT pglogical.replication_set_add_table(set_name := 'default_insert_only', relation := 'test_table_2');
Wenn Sie die neu erstellten Tabellen dem Replikationssatz automatisch hinzufügen möchten, fügen Sie den
pglogical_assign_repset
-Trigger wie in derpglogical
-Quelle vorgeschlagen hinzu.
Datenbank in den AlloyDB Omni-Abonnentencluster kopieren
Erstellen Sie mit dem Dienstprogramm
pg_dump
eine Sicherung nur des Schemas der Quelldatenbank.Führen Sie den Befehl
pg_dump
von Ihrem AlloyDB Omni-Abonnentenserver aus und verwenden Sie dabei die IP-Adresse der primären AlloyDB-Instanz in der Google Cloud .pg_dump -h SERVER_IP_ADDRESS -U postgres --create --schema-only my_test_db > my_test_db.schema-only.sql
Importiere die Sicherung in die Abonnentendatenbank auf dem AlloyDB Omni-Server des Abonnenten:
Docker
docker exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql
Podman
podman exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql
Ignorieren Sie Fehler wie alloydbsuperuser not existing
. Diese Rolle ist spezifisch fürGoogle Cloud AlloyDB.
Dadurch werden die Datenbank und das Schema ohne Zeilendaten erstellt. Zeilendaten werden von der pglogical
-Erweiterung repliziert. Kopieren oder erstellen Sie alle anderen erforderlichen Nutzer oder Rollen manuell.
Knoten und Abo in der AlloyDB Omni-Abonnentendatenbank erstellen
Erstelle einen Knoten in der AlloyDB Omni-Abonnentendatenbank:
Docker
docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication');"
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication');"
Erstelle ein Abo in der Abonnentendatenbank, das auf die primäre Instanz der AlloyDB-Anbieterdatenbank in derGoogle Cloud verweist.
Docker
docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');"
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');"
Je nach Tabellengröße und zu replizierenden Daten kann die Replikationszeit von Sekunden bis Minuten variieren. Danach sollten die ursprünglichen Daten vom Anbieter an den Abonnenten repliziert worden sein:
Docker
docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT * FROM test_table_1 ORDER BY 1;"
Podman
podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c " SELECT * FROM test_table_1 ORDER BY 1;"
Zusätzliche Zeilen, die der Anbieterdatenbank hinzugefügt werden, werden ebenfalls innerhalb von Sekunden repliziert.
Weitere Hinweise zur Bereitstellung von pglogical
Die pglogical
-Erweiterung bietet viele erweiterte Funktionen, die in diesem Dokument nicht behandelt werden.
Viele dieser Funktionen sind auf Ihre Implementierung anwendbar. Sie können die folgenden erweiterten Funktionen in Betracht ziehen:
- Konfliktlösung
- Multimaster- und bidirektionale Replikation
- Einschluss von Sequenzen
- Switchover- und Failover-Verfahren
Nächste Schritte
- Daten zwischen AlloyDB Omni und anderen Datenbanken replizieren
- Switchover und Failover mit
pglogical
-Replikation