Replikationsslot und ‑publikation erstellen

In diesem Dokument wird beschrieben, wie Sie logische Replikationsslots in AlloyDB Omni erstellen. In PostgreSQL ist die logische Replikation eine Methode zum Kopieren von Datenänderungen aus einer Publisher-Datenbank in eine oder mehrere Abonnenten, die Datenbanken oder andere Anwendungen sein können. Sie können die logische Replikation in Clustern aktivieren und konfigurieren, die Sie mit dem AlloyDB Omni Kubernetes-Operator erstellen.

Die gestreamten Änderungen können Aktualisierungen, Einfügungen oder Löschungen einzelner Zeilen sein. Abonnenten stellen über einen eindeutigen Replikations-Slot eine Verbindung zum Publisher her, was eine dauerhafte Verbindung gewährleistet. Bei einer dauerhaften Verbindung wird der Status des Datenstreams beibehalten. Bei einer Unterbrechung wird das Streaming an der Stelle fortgesetzt, an der es unterbrochen wurde.

Weitere Informationen zur logischen Replikation in PostgreSQL finden Sie unter Logische Replikation.

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

Publisher-Cluster erstellen

Bevor Sie die Replikationsslots erstellen, müssen Sie den Publisher-Cluster mit aktivierter logischer Replikation erstellen. Sie müssen den Parameter wal_level im DBCluster-Manifest auf logical festlegen.

Wenn Sie einen Publisher-Datenbankcluster mit aktivierter logischer Replikation erstellen möchten, wenden Sie das folgende Manifest an:

  apiVersion: v1
  kind: Secret
  metadata:
    name: db-pw-DB_CLUSTER_NAME
    namespace: DB_CLUSTER_NAMESPACE
  type: Opaque
  data:
    DB_CLUSTER_NAME: "ENCODED_PASSWORD"
  ---
  apiVersion: alloydbomni.dbadmin.goog/v1
  kind: DBCluster
  metadata:
    name: DB_CLUSTER_NAME
    namespace: DB_CLUSTER_NAMESPACE
  spec:
    databaseVersion: "ALLOYDB_OMNI_VERSION"
    spec:
    availability:
      numberOfStandbys: 1
    primarySpec:
      parameters:
        wal_level: "logical"
      adminUser:
        passwordRef:
          name: db-pw-DB_CLUSTER_NAME
      resources:
        cpu: CPU_COUNT
        memory: MEMORY_SIZE
        disks:
        - name: DataDisk
          size: DISK_SIZE

Ersetzen Sie Folgendes:

  • DB_CLUSTER_NAME: Der Name dieses Datenbankclusters, z. B. publisher.

  • DB_CLUSTER_NAMESPACE (optional): der Namespace, in dem Sie den Datenbankcluster erstellen möchten, z. B. publisher-namespace.

  • ENCODED_PASSWORD: Das Datenbank-Anmeldepasswort für die Standardnutzerrolle postgres, codiert als Base64-String, z. B. Q2hhbmdlTWUxMjM= für ChangeMe123.

  • ALLOYDB_OMNI_VERSION: Die AlloyDB Omni-Version muss 15.7.0 oder höher sein.

  • 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.

Replikationsslot erstellen

Nachdem du den Publisher-Cluster erstellt hast, kannst du mit der Replication-Ressource im Publisher-Cluster einen logischen Replikationsslot erstellen. Jede Replication-Ressource ist einer entsprechenden Datenbankclusterressource zugeordnet. Mit einem Datenbankcluster können mehrere logische Replikationsressourcen verknüpft sein.

Wende das folgende Manifest an, um einen Replikationsslot in deinem Publisher-Cluster zu konfigurieren:

$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: USER_PASSWORD_SECRET_NAME
  namespace: USER_PASSWORD_SECRET_NAMESPACE
type: Opaque
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: Replication
metadata:
  name: REPLICATION_NAME
  namespace: NAMESPACE
spec:
  dbcluster:
    name: DB_CLUSTER_NAME
  upstream:
    logicalReplication:
      pluginName: DECODER_PLUGIN
      databaseName: DATABASE_NAME
    applicationName: APPLICATION_NAME
    replicationSlotName: REPLICATION_SLOT_NAME
    synchronous: "REPLICATION_MODE"
    username: APPLICATION_USER
    password:
      name: USER_PASSWORD_SECRET_NAME
      namespace: USER_PASSWORD_SECRET_NAMESPACE
EOF

Ersetzen Sie Folgendes:

  • REPLICATION_NAME: ein Name für diese Replication-Ressource, z. B. replication-1.
  • NAMESPACE: der Kubernetes-Namespace für diese Replication-Ressource. Er muss mit dem Namespace des Datenbankclusters übereinstimmen.
  • DB_CLUSTER_NAME: Der Name Ihres Datenbankclusters, den Sie beim Erstellen zugewiesen haben.
  • DECODER_PLUGIN: Legen Sie das Decodierungs-Plug-in fest, das Sie für die logische Replikation verwenden möchten, z. B. pgoutput. Weitere Informationen zu verschiedenen Dekodierungs-Plug-ins findest du unter Ausgabe-Plug-ins.
  • DATABASE_NAME: Muss auf den Namen der Datenbank festgelegt sein, deren Änderungen zum Replikations-Speicherplatz gestreamt werden sollen. Die Datenbank muss bereits im Verlags- oder Webpublishercluster erstellt worden sein.
  • APPLICATION_NAME (optional): Legen Sie den Namen der Anwendung fest, die eine Verbindung zum Replikationsslot herstellen soll. Dieses Feld ist erforderlich, wenn der Streamingmodus auf „synchron“ gesetzt ist.
  • REPLICATION_MODE (optional): Legen Sie false für die asynchrone Replikation fest. Wenn Sie die synchrone Replikation aktivieren möchten, aber auf Kosten der Geschwindigkeit, legen Sie diesen Wert auf true fest. Wenn nicht explizit festgelegt, ist der Standardwert false.
  • REPLICATION_SLOT_NAME: der Name des Replikationsslots, der erstellt und vom Abonnenten verwendet wird, z. B. logicalrepltestslot.
  • REPLICATION_USER (Optional): Der Name des Nutzers, der eine Verbindung zum Replikationsslot herstellt. Wenn Sie den Nutzer für die Replikation festlegen, müssen Sie auch den Namen des Secrets, den Namespace und das Passwort festlegen.
  • USER_PASSWORD_SECRET_NAME (optional): der Name des Kubernetes-Secrets des Anwendungsnutzers. Erforderlich, wenn der Anwendungsnutzer festgelegt ist.
  • USER_PASSWORD_SECRET_NAMESPACE (optional): der Namespace, in dem sich das Kubernetes-Secret für den Anwendungsnutzer befindet. Erforderlich, wenn der Anwendungsnutzer festgelegt ist.

Replikationsslot-Status ansehen

Führen Sie den folgenden Befehl aus, um den Status der Replikationsslots aufzurufen:

kubectl get replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE -oyaml

Das Feld status ist zusammen mit anderen Details in der Antwort enthalten:

apiVersion: alloydbomni.dbadmin.goog/v1
kind: Replication
metadata:
  name: REPLICATION_NAME
  namespace: NAMESPACE
...
...
status:
  conditions:
  - lastTransitionTime: "2025-01-25T06:49:25Z"
    message: Ready for replication
    reason: Ready
    status: "True"
    type: Ready
  - lastTransitionTime: "2025-01-25T06:49:25Z"
    message: Replication slot is not being used
    reason: Unhealthy
    status: "False"
    type: Healthy
  observedGeneration: 2
  upstream:
    host: DATABASE_ENDPOINT
    password:
      name: USER_PASSWORD_SECRET_NAME
      namespace: USER_PASSWORD_SECRET_NAMESPACE
    port: DATABASE_PORT
    replicationSlotName: REPLICATION_SLOT_NAME
    username: APPLICATION_USER

Unter DATABASE_ENDPOINT wird die IP-Adresse angezeigt, mit der Sie eine Verbindung zur Datenbank herstellen. Der Status TRUE in der Spalte READY gibt an, dass der Slot zum Streamen bereit ist. Wenn der DBCluster oder die Anwendung des Abonnenten eine Verbindung zum Replikationsslot herstellt, ändert sich der Status in der Spalte HEALTHY in TRUE.

Publisher-Cluster konfigurieren

  1. 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"
    
  2. Stelle über psql eine Verbindung zum primären Pod im Publisher-Cluster her:

    psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME

    Ersetzen Sie Folgendes:

    • IP_ADDRESS: die IP-Adresse des primären Pods des Publisher-Clusters.
    • USERNAME: der postgres-Nutzer der Datenbank.
    • DATABASE_NAME: die Datenbank, die der Abonnent abonnieren möchte.
  3. Wenn die in der Replikationsressource angegebene DATABASE_NAME nicht vorhanden ist, erstellen Sie eine Datenbank.

    CREATE DATABASE DATABASE_NAME;
    
  4. Optional: Fügen Sie der Datenbank zu Testzwecken eine Tabelle hinzu und geben Sie einige Daten ein. Anhand dieser Daten kannst du die Datenreplikation vom Publisher zum Abonnenten beobachten.

    $ psql -h localhost -U postgres DATABASE_NAME
    customer=# CREATE TABLE TABLE_NAME(
    customer(#    ID INT PRIMARY KEY     NOT NULL,
    customer(#    NAME           TEXT    NOT NULL,
    customer(#    AGE            INT     NOT NULL,
    customer(#    SALARY         REAL
    customer(# );
    CREATE TABLE
    customer=# INSERT INTO TABLE_NAME (ID,NAME,AGE,SALARY) VALUES
    customer-# (1, 'Quinn', 25, 65000.00),
    customer-# (2, 'Kim', 22, 72250.00),
    customer-# (3, 'Bola', 31, 53000.00),
    customer-# (4, 'Sasha', 33, 105000.00),
    customer-# (5, 'Yuri', 27, 85000.00);
    INSERT 0 5
    customer=# \dt
              List of relations
    Schema |  Name   | Type  |  Owner
    --------+---------+-------+----------
    public | company | table | postgres
    (1 row)
    
    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
    (5 rows)
    

    Ersetzen Sie TABLE_NAME durch eine Tabelle, in der Sie die Daten speichern möchten und die der Abonnent abonniert.

  5. Erteilen Sie die Berechtigungen:

    GRANT SELECT ON ALL TABLES IN SCHEMA public TO REPLICATION_USER;
    GRANT USAGE ON SCHEMA public TO REPLICATION_USER;
    ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT ON TABLES TO REPLICATION_USER;
    
  6. Erstellen Sie die Publikation mit dem folgenden Befehl:

    CREATE PUBLICATION PUBLICATION_NAME;
    ALTER PUBLICATION PUBLICATION_NAME ADD TABLE TABLE_NAME;
    

    Ersetzen Sie Folgendes:

    • PUBLICATION_NAME: Der Name der Publikation, über den der Abonnent ein Abo abschließt.

Nachdem Sie die Publikation erstellt haben, können Sie entweder Ihren Abonnentencluster für die logische Replikation einrichten oder Ihre Anwendung so konfigurieren, dass die Replikation gestartet wird.

Beschränkungen

  • Aktualisierungen der Replikationsspalte werden nicht unterstützt. Wenn Sie die Konfiguration aktualisieren möchten, löschen Sie den Replikationsslot und erstellen Sie ihn mit der aktualisierten Konfiguration neu.

    Führen Sie den folgenden Befehl aus, um den Replikationsslot zu löschen:

    kubectl delete replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE
    
  • Sie können den logischen Replikationsslot nur in der Publisher-Datenbank konfigurieren. Die Replikations-API unterstützt keine DBCluster oder Anwendungen von logischen Replikationsabonnenten.

  • Wenn der Datenbankcluster, auf den das Replikationsobjekt verweist, für Hochverfügbarkeit konfiguriert ist, wird der logische Replikations-Speicherplatz nach einem Failover auf dem beförderten Standby-Knoten neu erstellt. Nachdem der Replikationsslot neu erstellt wurde, ist die Position des Streams im Slot nicht mehr verfügbar. Alle Anwendungen, die den Stream abonniert haben, müssen sich wieder verbinden und den Stream wiedergeben.

Nächste Schritte