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 Standardnutzerrollepostgres
, codiert als Base64-String, z. B.Q2hhbmdlTWUxMjM=
fürChangeMe123
.ALLOYDB_OMNI_VERSION
: Die AlloyDB Omni-Version muss15.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 beispielsweisecpu
in diesem Manifest zuvor auf2
gesetzt haben, empfehlen wir,memory
auf16Gi
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 auftrue
fest. Wenn nicht explizit festgelegt, ist der Standardwertfalse
. - 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
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"
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.
Wenn die in der Replikationsressource angegebene
DATABASE_NAME
nicht vorhanden ist, erstellen Sie eine Datenbank.CREATE DATABASE DATABASE_NAME;
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.
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;
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.