Abonnentencluster für die logische Replikation konfigurieren

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 Vorlage verwenden können. Ersetzen Sie dazu 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: "15.7.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 Datenbank-Anmeldepasswort 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 Größe des Arbeitsspeichers pro Datenbankinstanz dieses Datenbankclusters. Wir empfehlen, diesen Wert auf 8 Gigabyte pro CPU festzulegen. Wenn Sie beispielsweise cpu in diesem Manifest zuvor auf 2 gesetzt haben, empfehlen wir, memory auf 16Gi festzulegen.

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

  2. Suchen Sie den gewünschten 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. Melde dich im 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 DBCluster des Publishers, 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. Erstelle 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 am Ziel (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 DBCluster des Publishers.

  6. Wende die Sicherung auf die 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. Die Publikation muss bereits im DBCluster des Publishers erstellt worden sein.

    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 Replikationsslot herstellt.
    • DATABASE_NAME: Muss auf den Namen der Datenbank festgelegt sein, deren Änderungen aus dem Replikationsslot gestreamt werden sollen.
    • PUBLISHER_CLUSTER_PASSWORD: Das Anmeldepasswort für die Datenbank für den Nutzer postgres des DBClusters des Publishers.
    • PUBLICATION_NAME: Der Name der Publikation, die der Abonnent abonniert hat.
    • REPLICATION_SLOT_NAME: Der Name des Replikationsslots, der im Publisher-DBCluster erstellt wurde.
  9. Optional: Prüfen Sie die Replikation im Abonnentencluster.

    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 der Tabelle im Publisher-Cluster 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 DBCluster des Publishers, für den der Abonnent angemeldet ist.

  11. Prüfen Sie im Abonnentencluster, ob die Zeile, die der Tabelle im Publisher-Cluster hinzugefügt wurde, in der 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

Im Gegensatz zur replicate_ddl_command in pglogical werden DDL-Änderungen bei der logischen Replikation nicht automatisch synchronisiert. 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. Erstelle dazu eine neue Tabelle namens finance in der customer-Datenbank 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 auf den Abonnenten an und prüfen Sie dann die Replikation, indem Sie Folgendes im Abonnentencluster 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