Replikationsslot und ‑publikation erstellen

Wählen Sie eine Dokumentationsversion aus:

In diesem Dokument wird beschrieben, wie Sie Slots für die logische Replikation in AlloyDB Omni erstellen. In PostgreSQL ist die logische Replikation eine Methode zum Kopieren von Datenänderungen von einer Publisher-Datenbank zu einem oder mehreren Abonnenten, die Datenbanken oder andere Anwendungen sein können. Sie können die logische Replikation für Cluster aktivieren und konfigurieren, die Sie mit dem AlloyDB Omni Kubernetes-Operator erstellen.

Die gestreamten Änderungen können einzelne Zeilenaktualisierungen, Einfügungen oder Löschungen sein. Abonnenten stellen über einen eindeutigen Replikations-Slot eine Verbindung zum Publisher her, der eine dauerhafte Verbindung ermöglicht. Bei einer persistenten Verbindung wird der Datenstreaming-Status beibehalten. Wenn also eine Unterbrechung auftritt, 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 Modelle verwenden können. Ersetzen Sie die Werte durch Werte für Ihre AlloyDB Omni-Ressourcen.

Hinweise

Publisher-Cluster erstellen

Bevor Sie die Replikations-Slots 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.

Wenden Sie das folgende Manifest an, um einen Publisher-Datenbankcluster mit aktivierter logischer Replikation zu erstellen:

  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 Datenbankanmeldepasswort für die Standardnutzerrolle postgres, codiert als Base64-String, z. B. Q2hhbmdlTWUxMjM= für ChangeMe123.

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

  • 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 zuvor in diesem Manifest auf 2 gesetzt haben, empfehlen wir, memory auf 16Gi zu setzen.

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

Replikationsslot erstellen

Nachdem Sie den Publisher-Cluster erstellt haben, können Sie mit der Replication-Ressource im Publisher-Cluster einen Slot für die logische Replikation erstellen. Jede Replication-Ressource ist mit einer entsprechenden Datenbankcluster-Ressource verknüpft. Ein Datenbankcluster kann mehrere Ressourcen für die logische Replikation haben.

Wenden Sie das folgende Manifest an, um einen Replikations-Slot in Ihrem 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: Auf das Decodierungs-Plug-in, z. B. pgoutput, das Sie für die logische Replikation verwenden möchten. Weitere Informationen zu den verschiedenen Decodierungs-Plug-ins finden Sie unter Ausgabe-Plug-ins.
  • DATABASE_NAME: Auf den Namen der Datenbank festlegen, deren Änderungen Sie in den Replikations-Slot streamen möchten. Prüfen Sie, ob die Datenbank bereits im Publisher-Cluster erstellt wurde.
  • APPLICATION_NAME (optional): Auf den Namen der Anwendung festlegen, die eine Verbindung zum Replikationsslot herstellt. Dieses Feld ist erforderlich, wenn der Streamingmodus auf „synchron“ festgelegt ist.
  • REPLICATION_MODE (Optional): Auf false für die asynchrone Replikation festlegen. 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 Replikations-Slots, der erstellt und vom Abonnenten verwendet wird, z. B. logicalrepltestslot.
  • REPLICATION_USER (optional): Der Name des Nutzers, der eine Verbindung zum Replikations-Slot herstellt. Wenn Sie den Replikationsnutzer festlegen, müssen Sie auch den Secret-Namen, 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.

Status des Replikationsslots ansehen

Führen Sie den folgenden Befehl aus, um den Status der Replikations-Slots 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

DATABASE_ENDPOINT zeigt die IP-Adresse an, die Sie zum Herstellen einer Verbindung zur Datenbank verwenden. Der Status TRUE in der Spalte READY gibt an, dass der Slot für das Streaming bereit ist. Wenn der Abonnenten-DBCluster oder die Anwendung eine Verbindung zum Replikations-Slot herstellt, ändert sich der Status in der Spalte HEALTHY zu TRUE.

Publisher-Cluster konfigurieren

  1. 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"
    
  2. Stellen Sie mit 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 PostgreSQL-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 für Testzwecke der Datenbank eine Tabelle hinzu und fügen Sie einige Daten ein. Anhand dieser Daten können Sie 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. Berechtigungen erteilen:

    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 Veröffentlichung 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, die Abonnenten zum Abonnieren verwenden.

Nachdem Sie die Publikation erstellt haben, können Sie entweder Ihren Abonnentencluster für die logische Replikation einrichten oder Ihre Anwendung für den Start der Replikation konfigurieren.

Beschränkungen

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

    Führen Sie den folgenden Befehl aus, um den Replikations-Slot 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 für die logische Replikation.

  • Wenn der vom Replikationsobjekt referenzierte Datenbankcluster für Hochverfügbarkeit konfiguriert ist, wird der logische Replikationsslot nach einem Failover auf dem hochgestuften Standby neu erstellt. Nachdem der Replikationsslot neu erstellt wurde, ist die Position des Streams im Slot nicht mehr verfügbar. Alle Anwendungen, die den Stream abonnieren, müssen die Verbindung neu herstellen und den Stream noch einmal abspielen.

Nächste Schritte