Daten zwischen AlloyDB und AlloyDB Omni replizieren

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 wie default, default_insert_only und ddl_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 auf on, 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.

  1. Passen Sie die Parameter an:

    sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" DATA_DIR/postgresql.conf
  2. Prüfen Sie, ob der Parameter richtig festgelegt ist:

    grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
  3. 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.

  4. 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 auf on, wenn die letzte oder erste Aktualisierung den Konflikt gewinnt und eine Konfliktlösung erforderlich ist.
  5. 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.

  1. 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 neuen pglogical_replication-Nutzer spezifisch ist:

    echo -e "# pglogical entries:
    host all pglogical_replication samehost trust
    " | column -t | sudo tee -a DATA_DIR/pg_hba.conf
  2. Prüfen Sie, ob der Eintrag korrekt ist:

    tail -2 DATA_DIR/pg_hba.conf
  3. 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.

  1. 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;
    
  2. Erstelle im AlloyDB Omni-Abonnentencluster den Nutzer und gewähre ihm die Attribute replication und superuser:

    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

  1. Erforderliche Berechtigungen erteilen

    Sie müssen die pglogical-Erweiterung in jeder Datenbank installieren und dem pglogical-Datenbanknutzer die Berechtigung usage gewähren. In Google Cloud AlloyDB müssen Sie Berechtigungen für das pglogical-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;
    
  2. Erstellen Sie einen pglogical-Knoten für die Anbieterdatenbanken. node_name ist beliebig und der String dsn muss eine gültige TCP-Verbindung zurück zur selben Datenbank sein. Bei Google Cloud AlloyDB ist der Hostteil der dsn 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.

  1. 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);
    
  2. Gewähren Sie SELECT für die einzelnen Tabellen oder führen Sie den Befehl GRANT SELECT ON ALL TABLES aus. Alle Tabellen, die Teil eines Replikationssatzes sein sollen, müssen dem Replikationsnutzer pglogical_replication die Abfrageberechtigung haben.

    GRANT SELECT ON ALL TABLES IN SCHEMA public TO pglogical_replication;
    
  3. 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 und ddl_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;
    
  4. 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;
    
  5. 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 Funktion REPLICA IDENTITY mit dem Befehl ALTER TABLE. Wenn Sie diese Tabellen dem default-Replikationssatz automatisch mithilfe der Funktion replication_set_add_all_tables hinzugefügt haben, müssen Sie sie manuell aus diesem Replikationssatz entfernen und dem Satz default_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 der pglogical-Quelle vorgeschlagen hinzu.

Datenbank in den AlloyDB Omni-Abonnentencluster kopieren

  1. Erstellen Sie mit dem Dienstprogramm pg_dump eine Sicherung nur des Schemas der Quelldatenbank.

  2. 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
  3. 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

  1. 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');"
  2. 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');"
  3. 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