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
- Omni Operator in Kubernetes installieren
- Erstelle einen Replikationsslot, einen Publisher-Cluster und eine Publikation. Weitere Informationen finden Sie unter Replikationsslots und Veröffentlichungen erstellen.
Abonnentencluster erstellen und konfigurieren
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 Standardnutzerrollepostgres
, codiert als Base64-String, z. B.Q2hhbmdlTWUxMjM=
fürChangeMe123
.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
.
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"
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.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
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.Wende die Sicherung auf die Abonnentendatenbank an.
postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres < /tmp/customer.schema-only.sql
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)
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.
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)
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.
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.
Erstelle dazu eine neue Tabelle namens
finance
in dercustomer
-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
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)