Abonnentencluster für die logische Replikation konfigurieren

Wählen Sie eine Dokumentationsversion aus:

In diesem Dokument finden Sie Beispiele, die zeigen, wie Sie einen Abonnentencluster manuell erstellen und konfigurieren. Ein Abonnentencluster ist ein Datenbankcluster, der Daten empfängt, die aus einem Publisher-Cluster repliziert wurden.

Die Code-Snippets auf dieser Seite sind Beispiele, die Sie als Modelle verwenden können. Ersetzen Sie die Werte durch Werte für Ihre AlloyDB Omni-Ressourcen.

Hinweise

Abonnentencluster erstellen und konfigurieren

  1. Erstellen Sie einen Abonnentencluster.

    $ cat << EOF | kubectl apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: db-pw-DB_CLUSTER_NAME
    type: Opaque
    data:
      DB_CLUSTER_NAME: "ENCODED_PASSWORD" # Password is odspassword
    ---
    apiVersion: alloydbomni.dbadmin.goog/v1
    kind: DBCluster
    metadata:
      name: subscriber
    spec:
      databaseVersion: "16.8.0"
      primarySpec:
        adminUser:
          passwordRef:
            name: db-pw-DB_CLUSTER_NAME
        resources:
          memory: MEMORY_SIZE
          cpu: CPU_COUNT
          disks:
          - name: DataDisk
            size: DISK_SIZE
    EOF
    

    Ersetzen Sie Folgendes:

    • DB_CLUSTER_NAME: Der Name dieses Datenbankclusters, z. B. subscriber-cluster.
    • ENCODED_PASSWORD: Das Datenbankanmeldepasswort für die Standardnutzerrolle postgres, codiert als Base64-String, z. B. Q2hhbmdlTWUxMjM= für ChangeMe123.

    • CPU_COUNT: Die Anzahl der CPUs, die für jede Datenbankinstanz in diesem Datenbankcluster verfügbar sind.

    • MEMORY_SIZE: die Menge an Arbeitsspeicher pro Datenbankinstanz dieses Datenbankclusters. Wir empfehlen, diesen Wert auf 8 GB pro CPU festzulegen. Wenn Sie beispielsweise cpu weiter oben in diesem Manifest auf 2 gesetzt haben, empfehlen wir, memory auf 16Gi zu setzen.

    • DISK_SIZE: die Laufwerksgröße pro Datenbankinstanz, z. B. 10Gi.

  2. Suchen Sie den benötigten Pod.

    $ kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=DB_CLUSTER_NAME, alloydbomni.internal.dbadmin.goog/task-type=database, dbs.internal.dbadmin.goog/ha-role=Primary"
    
  3. Melden Sie sich beim Datenbank-Pod des Abonnentenclusters an.

    $ kubectl get pod
    NAME                                          READY   STATUS    RESTARTS   AGE
    al-2bce-publisher-0                           3/3     Running   0          20h
    
    $ kubectl exec -ti SUBSCRIBER_POD_NAME  -- /bin/bash
    Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init)
    postgres@al-3513-subscriber-0:/$
    

    Ersetzen Sie SUBSCRIBER_POD_NAME durch den Namen des Abonnenten-Pods.

  4. Suchen Sie die IP-Adresse des Load-Balancers im Publisher-DBcluster, z. B. 10.116.14.190.

    $ kubectl get service
    NAME                     TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)          AGE
    al-publisher-rw-ilb      ClusterIP      10.116.14.190   <none>         5432/TCP         21h
    
  5. Erstellen Sie eine Schemasicherung vom Publisher als erste Kopie der veröffentlichten Daten in der Publisher-Datenbank. Die logische Replikation unterstützt keine DDL-Replikation. Ein Schema oder eine Tabelle, die Sie replizieren möchten, muss im Zielcluster (Abonnentencluster) vorhanden sein, bevor die logische Replikation beginnt.

    postgres@al-3513-subscriber-0:/$ pg_dump -h PUBLISHER_IP_ADDRESS -U postgres --create --schema-only customer > /tmp/customer.schema-only.sql
    

    Ersetzen Sie PUBLISHER_IP_ADDRESS durch die IP-Adresse des Load-Balancers im Publisher-DBcluster.

  6. Wenden Sie die Sicherung in der Abonnentendatenbank an.

    postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres < /tmp/customer.schema-only.sql
    
  7. Optional: Prüfen Sie, ob die Tabelle keine Daten enthält.

    # There is no data in table company
    customer=# select * from company;
    id | name | age | salary
    ----+------+-----+--------
    (0 rows)
    
  8. Erstellen Sie ein Abo für die Datenbank. Prüfen Sie, ob die Publikation bereits im DBCluster des Verlags oder Webpublishers erstellt wurde.

    postgres@al-3513-subscriber-0:/$ CREATE SUBSCRIPTION sub_customer CONNECTION 'host=PUBLISHER_IP_ADDRESS port=5432 user=REPLICATION_USER dbname=DATABASE_NAME password=PUBLISHER_CLUSTER_PASSWORD sslmode=require' PUBLICATION PUBLICATION_NAME WITH (slot_name='REPLICATION_SLOT_NAME');
    

    Ersetzen Sie Folgendes:

    • REPLICATION_USER: der Name des Nutzers, der eine Verbindung zum Replikations-Slot herstellt.
    • DATABASE_NAME: Der Name der Datenbank, deren Änderungen Sie aus dem Replikations-Slot streamen möchten.
    • PUBLISHER_CLUSTER_PASSWORD: Das Datenbankanmeldepasswort für den postgres-Nutzer des Publisher-DBClusters.
    • PUBLICATION_NAME: Der Name der Publikation, die der Abonnent abonniert.
    • REPLICATION_SLOT_NAME: Der Name des Replikations-Slots, der im Publisher-DBCluster erstellt wurde.
  9. Optional: Replikation im Abonnentencluster prüfen

    postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres DATABASE_NAME
    customer=# select * from public.company;
    id | name  | age | salary
    ----+-------+-----+--------
      1 | Quinn |  25 |  65000
      2 | Kim   |  22 |  72250
      3 | Bola  |  31 |  53000
      4 | Sasha |  33 | 105000
      5 | Yuri  |  27 |  85000
    (5 rows)
    
  10. Fügen Sie im Publisher-Cluster der Tabelle eine Zeile hinzu.

    # On the publisher database
    $ kubectl exec -ti al-2bce-publisher-0  -- /bin/bash
    Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init)
    postgres@al-2bce-publisher-0:/$ psql -h localhost -U postgres DATABASE_NAME
    customer=# insert into TABLE_NAME (id, name, age, salary) values (6, 'Alex', 39, 100000);
    

    Ersetzen Sie TABLE_NAME durch den Namen der Tabelle im Publisher-DBCluster, für die der Abonnent ein Abo hat.

  11. Prüfen Sie im Abonnentencluster, ob die Zeile, die der Tabelle im Publisher-Cluster hinzugefügt wurde, in die Tabelle im Abonnentencluster repliziert wurde.

    # On the subscriber database, data is synced.
    postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres DATABASE_NAME
    customer=# select * from TABLE_NAME;
    id | name  | age | salary
    ----+-------+-----+--------
      1 | Quinn |  25 |  65000
      2 | Kim   |  22 |  72250
      3 | Bola  |  31 |  53000
      4 | Sasha |  33 | 105000
      5 | Yuri  |  27 |  85000
      6 | Alex  |  39 | 100000
    (6 rows)
    

Zusätzliche Tabellen manuell erstellen

Bei der logischen Replikation werden DDL-Änderungen nicht automatisch synchronisiert, anders als bei der replicate_ddl_command in pglogical. Das Open-Source-Tool pgl_ddl_deploy bietet zwar eine Lösung, Sie können DDL-Befehle aber auch manuell auf dem Abonnenten ausführen.

  1. Erstellen Sie dazu eine neue Tabelle mit dem Namen finance in der Datenbank customer im Publisher-Cluster.

    # On the publisher database
    $ kubectl exec -ti al-2bce-publisher-0  -- /bin/bash
    Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init)
    postgres@al-2bce-publisher-0:/$ psql -h localhost -U postgres customer
    customer=# create table finance (row text);
    CREATE TABLE
    customer=# insert into finance values ('critical data');
    INSERT 0 1
    customer=# ALTER PUBLICATION pub_customer ADD TABLE finance;
    ALTER PUBLICATION
    
  2. Wenn dem Publisher-Cluster eine neue Tabelle hinzugefügt wird, wenden Sie die DDL (Tabellenerstellung) manuell im Subscriber an und prüfen Sie dann die Replikation, indem Sie Folgendes im Subscriber-Cluster ausführen.

    postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres customer
    customer=# create table finance (row text);
    CREATE TABLE
    customer=# ALTER SUBSCRIPTION sub_customer REFRESH PUBLICATION;
    ALTER SUBSCRIPTION
    customer=# select * from finance;
          row
    ---------------
    critical data
    (1 row)
    

Nächste Schritte