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