pglogical
replizieren.
Eine Übersicht über pglogical
in AlloyDB Omni, die Vorteile und Einschränkungen finden Sie unter pglogical-Erweiterung.
Wichtige Komponenten von pglogical
Die wichtigsten Komponenten der pglogical
-Erweiterung sind:
- Knoten: Referenz für die Datenbank in einem PostgreSQL-Cluster.
Die Erweiterung
pglogical
wird in einer beliebigen Anzahl von Datenbanken im Cluster installiert und funktioniert mit diesen. 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: 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 Replikationssets 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. - Abo: enthält Details zu den Änderungen, die aus Anbieterdatenbanken repliziert werden, und zu den Änderungen, die aus Anbieterdatenbanken in die Abonnentendatenbank repliziert werden. Im Abo wird die Anbieterdatenbank über eine Verbindungszeichenfolge angegeben. Optional kann auch angegeben werden, welche Replikationssätze von diesem Anbieter kopiert werden sollen. Außerdem können Sie beim Erstellen des Abos angeben, ob
apply delay
verwendet werden soll.
In dieser Bereitstellung ist der AlloyDB for PostgreSQL-Dienst der Anbieter und die lokale AlloyDB Omni-Instanz 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 Passwort- und Vertrauensauthentifizierungsmethoden.
Die empfohlene Authentifizierungsmethode ist die Vertrauensauthentifizierung, da bei der Passwortauthentifizierung Passwörter im Klartextformat in Datenbanktabellen gespeichert werden, die pglogical
gehören. Diese Passwörter sind für alle, die Datenbankberechtigungen zum Abfragen dieser Tabellen haben, in Nicht-Binärsicherungen und in den PostgreSQL-Logdateien im Klartext sichtbar.
Wenn Sie die Vertrauensauthentifizierungsmethode 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 spezifischen 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:
- Ein AlloyDB for PostgreSQL-Cluster und Lese-/Schreibzugriff auf die primäre Instanz als AlloyDB for PostgreSQL-Administrator. Eine Anleitung zum Bereitstellen eines AlloyDB for PostgreSQL-Clusters finden Sie unter AlloyDB for PostgreSQL-Datenbank erstellen und eine Verbindung herstellen.
- Ein AlloyDB Omni-Server, der installiert und konfiguriert ist. Eine Anleitung zur Installation von AlloyDB Omni finden Sie unter AlloyDB Omni installieren.
- Die IP-Adressen für die primäre AlloyDB for PostgreSQL-Instanz und den AlloyDB Omni-Hostserver.
- Eine eingerichtete und gesicherte Netzwerkverbindung zwischen AlloyDB for PostgreSQL und dem AlloyDB Omni-Hostserver. TCP-Verbindungen über den PostgreSQL-Standardport 5432 sind erforderlich.
Parameter für den AlloyDB for PostgreSQL-Anbieter anpassen
Für die pglogical
-Erweiterung ist eine Mindestanzahl von Parameteranpassungen im AlloyDB for PostgreSQL-Providercluster erforderlich. Sie müssen den Parameter wal_level
auf logical
festlegen und pglogical
an den Parameter shared_preload_libraries
in der Datei postgresql.conf
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 AlloyDB for PostgreSQL-Dienst können Sie Parameter anpassen, indem Sie die entsprechenden Cluster-Flags festlegen.
Sie müssen Parameter für die folgenden AlloyDB for PostgreSQL-Flags anpassen:
alloydb.enable_pglogical = on
alloydb.logical_decoding = on
Informationen zum Festlegen von Datenbank-Flags in AlloyDB for PostgreSQL finden Sie unter Datenbank-Flags einer Instanz konfigurieren.
Für die anderen erforderlichen Datenbankparameter für Providerknoten müssen Sie die AlloyDB for PostgreSQL-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
: Eine pro Knoten auf Anbietern.max_wal_senders
: Eine pro Knoten auf Anbietern.track_commit_timestamp
: Aufon
setzen, wenn eine Konfliktlösung erforderlich ist, bei der die letzte oder erste Aktualisierung gewinnt.listen_addresses
: muss die AlloyDB Omni-IP-Adresse enthalten oder über einen umfassenden CIDR-Block angegeben 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 auf dem AlloyDB Omni-Abonnenten nur minimale Anpassungen der Parameter erforderlich. Sie müssen pglogical
an den Parameter shared_preload_libraries
in der Datei DATA_DIR/postgresql.conf
anhängen. Wenn eine Datenbank im Cluster als Anbieterdatenbank fungiert, 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 Datenbankparameter des Anbieters fest:
max_worker_processes
: Eine pro Anbieterdatenbank und eine pro Abonnentenknoten.track_commit_timestamp
: Setzen Sie diese Option aufon
, wenn eine Konfliktlösung für die letzte oder erste Aktualisierung 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 für den AlloyDB Omni-Abonnentencluster
Mit pglogical
werden lokale TCP-Verbindungen zur AlloyDB Omni-Abonnentendatenbank hergestellt. Daher müssen Sie die IP-Adresse des Hostservers des Abonnenten der DATA_DIR/pg_hba.conf
-Datei von AlloyDB Omni 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
muss der Nutzer sowohl die Berechtigung superuser
als auch replication
haben.
Erstellen Sie im AlloyDB for PostgreSQL-Providercluster den Nutzer und weisen Sie ihm die Rolle
alloydbsuperuser
zu:CREATE USER pglogical_replication LOGIN PASSWORD 'secret'; ALTER USER pglogical_replication WITH replication; GRANT alloydbsuperuser TO pglogical_replication;
Erstellen Sie im AlloyDB Omni-Abonnentencluster den Nutzer und gewähren Sie 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 AlloyDB for PostgreSQL-Anbieterdatenbank hinzufügen
Erforderliche Berechtigungen erteilen
Sie müssen die Erweiterung
pglogical
in jeder Datenbank installieren und dem pglogical-Datenbanknutzer die Berechtigungusage
gewähren. In AlloyDB for PostgreSQL müssen Sie Berechtigungen für das Schemapglogical
gewähren.Wenn Ihre Datenbank beispielsweise
my_test_db
ist, führen Sie den folgenden Befehl für die AlloyDB for PostgreSQL-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 AlloyDB for PostgreSQL ist der Hostteil vondsn
die IP-Adresse, die für die primäre Instanz angegeben wurde.Für AlloyDB for PostgreSQL ist die Vertrauensauthentifizierung nicht zulässig und das Passwortargument muss in der
dsn
enthalten sein. Parameter.Führen Sie für die Datenbank
my_test_db
beispielsweise 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 Standardreplikationssatz in der AlloyDB for PostgreSQL-Quelldatenbank hinzu.
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);
Erteilen Sie
SELECT
für die einzelnen Tabellen oder führen Sie den BefehlGRANT SELECT ON ALL TABLES
aus. Für alle Tabellen, die Teil eines Replikationssets sein sollen, muss dem Replikationsnutzerpglogical_replication
die Berechtigung zum Ausführen von Abfragen erteilt werden.GRANT SELECT ON ALL TABLES IN SCHEMA public TO pglogical_replication;
Fügen Sie die Testtabelle manuell dem Standardreplikationssatz hinzu. Sie können entweder benutzerdefinierte pglogical-Replikationssets erstellen oder die Standardreplikationssets verwenden. Beim Erstellen der Erweiterung wurden mehrere Standardreplikationssätze wie
default
,default_insert_only
undddl_sql
erstellt. Sie können Tabellen und Sequenzen einzeln oder alle auf einmal für ein bestimmtes Schema zu den Replikationssets 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 angegebenen 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 Replikationssatz
default
. Wenn es im Schema Tabellen ohne Primärschlüssel gibt, können Sie entweder die Replikation nur für INSERT-Vorgänge einrichten oder die Spalten festlegen, die die Zeile eindeutig identifizieren. Verwenden Sie dazu dieREPLICA IDENTITY
-Funktion mit dem BefehlALTER TABLE
. Wenn Sie diese Tabellen dem Replikationssetdefault
automatisch mit der Funktionreplication_set_add_all_tables
hinzugefügt haben, müssen Sie sie manuell aus diesem Replikationsset entfernen und dem Setdefault_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 optional automatisch dem Replikationssatz hinzufügen möchten, fügen Sie den
pglogical_assign_repset
-Trigger wie in derpglogical
-Quelle vorgeschlagen hinzu.
Kopieren Sie die Datenbank in den AlloyDB Omni-Abonnentencluster.
Erstellen Sie mit dem Dienstprogramm
pg_dump
eine Sicherung der Quelldatenbank, die nur das Schema enthält.Führen Sie den
pg_dump
-Befehl auf dem AlloyDB Omni-Abonnentenserver mit der IP-Adresse der primären AlloyDB for PostgreSQL-Instanz aus.pg_dump -h SERVER_IP_ADDRESS -U postgres --create --schema-only my_test_db > my_test_db.schema-only.sql
Importieren Sie 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ür AlloyDB for PostgreSQL.
Dadurch werden die Datenbank und das Schema ohne Zeilendaten erstellt. Zeilendaten werden von der Erweiterung pglogical
repliziert. Kopieren oder erstellen Sie alle anderen erforderlichen Nutzer oder Rollen manuell.
Knoten und Abo in der AlloyDB Omni-Abonnentendatenbank erstellen
Erstellen Sie 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');"
Erstellen Sie in der Abonnentendatenbank ein Abo, das auf die primäre Instanz der AlloyDB for PostgreSQL-Anbieterdatenbank 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');"
Die Replikationszeit kann je nach Tabellengröße und zu replizierenden Daten zwischen Sekunden und Minuten variieren. Danach sollten die ursprünglichen Daten vom Anbieter zum 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.
Zusätzliche pglogical
-Bereitstellungsüberlegungen
Die Erweiterung pglogical
bietet viele erweiterte Funktionen, die in diesem Dokument nicht behandelt werden.
Viele dieser Funktionen sind für Ihre Implementierung relevant. Folgende erweiterte Funktionen sind verfügbar:
- Konfliktlösung
- Multimaster- und bidirektionale Replikation
- Einbeziehung von Sequenzen
- Switchover- und Failover-Verfahren
Nächste Schritte
- Daten zwischen AlloyDB Omni und anderen Datenbanken replizieren
- Switchover und Failover mit
pglogical
-Replikation