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
- Omni Operator in Kubernetes installieren
- Achten Sie darauf, dass Sie einen Replikationsslot, einen Publisher-Cluster und eine Publikation erstellen. Weitere Informationen finden Sie unter Replikations-Slots und Publikation 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 Datenbankanmeldepasswort 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 Menge an Arbeitsspeicher pro Datenbankinstanz dieses Datenbankclusters. Wir empfehlen, diesen Wert auf 8 GB pro CPU festzulegen. Wenn Sie beispielsweisecpu
weiter oben in diesem Manifest auf2
gesetzt haben, empfehlen wir,memory
auf16Gi
zu setzen.DISK_SIZE
: die Laufwerksgröße pro Datenbankinstanz, z. B.10Gi
.
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"
Melden Sie sich beim 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 Publisher-DBcluster, 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
Erstellen Sie 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 im Zielcluster (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 Publisher-DBcluster.Wenden Sie die Sicherung in der 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. Prüfen Sie, ob die Publikation bereits im DBCluster des Verlags oder Webpublishers erstellt wurde.
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 Replikations-Slot herstellt.
- DATABASE_NAME: Der Name der Datenbank, deren Änderungen Sie aus dem Replikations-Slot streamen möchten.
- PUBLISHER_CLUSTER_PASSWORD: Das Datenbankanmeldepasswort für den
postgres
-Nutzer des Publisher-DBClusters. - PUBLICATION_NAME: Der Name der Publikation, die der Abonnent abonniert.
- REPLICATION_SLOT_NAME: Der Name des Replikations-Slots, der im Publisher-DBCluster erstellt wurde.
Optional: Replikation im Abonnentencluster prüfen
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 im Publisher-Cluster der Tabelle 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 Publisher-DBCluster, für die der Abonnent ein Abo hat.
Prüfen Sie im Abonnentencluster, ob die Zeile, die der Tabelle im Publisher-Cluster hinzugefügt wurde, in die 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
Bei der logischen Replikation werden DDL-Änderungen nicht automatisch synchronisiert, anders als bei der replicate_ddl_command
in pglogical
. 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.
Erstellen Sie dazu eine neue Tabelle mit dem Namen
finance
in der Datenbankcustomer
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 im Subscriber an und prüfen Sie dann die Replikation, indem Sie Folgendes im Subscriber-Cluster 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)