Questo documento descrive come creare slot di replica logica in AlloyDB Omni. In PostgreSQL, la replica logica è un metodo per copiare le modifiche ai dati da un database publisher a uno o più abbonati, che possono essere database o altre applicazioni. Puoi abilitare e configurare la replica logica sui cluster che crei utilizzando l'operatore Kubernetes di AlloyDB Omni.
Le modifiche trasmesse in streaming possono essere aggiornamenti, inserimenti o eliminazioni di singole righe. I sottoscrittori si connettono al publisher tramite uno slot di replica univoco che garantisce una connessione persistente. Una connessione persistente mantiene lo stato di streaming dei dati, quindi, in caso di interruzione, lo streaming riprende da dove era stato interrotto.
Per saperne di più sulla replica logica in PostgreSQL, consulta la sezione Replica logica.
Gli snippet di codice in questa pagina sono esempi che puoi utilizzare come modelli, sostituendo i valori con quelli delle tue risorse AlloyDB Omni.
Prima di iniziare
Crea un cluster publisher
Prima di creare gli slot di replica, devi creare il cluster publisher
con la replica logica abilitata. Devi impostare il parametro wal_level
su
logical
nel manifest DBCluster
.
Per creare il cluster di database publisher con la replica logica abilitata, applica il seguente manifest:
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
Sostituisci quanto segue:
DB_CLUSTER_NAME
: il nome di questo cluster di database, ad esempiopublisher
.DB_CLUSTER_NAMESPACE
(facoltativo): lo spazio dei nomi in cui vuoi creare il cluster di database, ad esempiopublisher-namespace
.ENCODED_PASSWORD
: la password di accesso al database per il ruolo utentepostgres
predefinito, codificata come stringa base64, ad esempioQ2hhbmdlTWUxMjM=
perChangeMe123
.ALLOYDB_OMNI_VERSION
: la versione di AlloyDB Omni,15.7.0
o versioni successive.CPU_COUNT
: il numero di CPU disponibili per ogni istanza di database in questo cluster di database.MEMORY_SIZE
: la quantità di memoria per istanza di database di questo cluster di database. Ti consigliamo di impostare questo valore su 8 gigabyte per CPU. Ad esempio, se in precedenza in questo manifest hai impostatocpu
su2
, ti consigliamo di impostarememory
su16Gi
.DISK_SIZE
: le dimensioni del disco per istanza di database, ad esempio10Gi
.
Crea uno slot di replica
Dopo aver creato il cluster publisher, puoi creare uno slot di replica logica
utilizzando la risorsa Replication
nel cluster publisher. Ogni risorsa
Replication
è associata a una risorsa cluster di database corrispondente. A un cluster di database possono essere associate più risorse di replica logica.
Per configurare uno slot di replica nel cluster publisher, applica il seguente manifest:
$ 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
Sostituisci quanto segue:
- REPLICATION_NAME: un nome per questa risorsa
Replication
, ad esempioreplication-1
. - NAMESPACE: lo spazio dei nomi Kubernetes per questa risorsa
Replication
. Deve corrispondere allo spazio dei nomi del cluster di database. - DB_CLUSTER_NAME: il nome del cluster di database che hai assegnato durante la creazione.
- DECODER_PLUGIN: impostato sul plug-in di decodifica, ad esempio
pgoutput
, che vuoi utilizzare per la replica logica. Per ulteriori informazioni sui vari plug-in di decodifica, vedi Plug-in di output. - DATABASE_NAME: impostato sul nome del database di cui vuoi trasmettere in streaming le modifiche allo slot di replica. Assicurati che il database sia già creato nel cluster publisher.
- APPLICATION_NAME (facoltativo): impostato sul nome dell'applicazione che si connetterà allo slot di replica. Questo campo è obbligatorio quando la modalità di streaming è impostata su sincrona.
- REPLICATION_MODE (Facoltativo): imposta
false
per la replica asincrona. Se vuoi attivare la replica sincrona, ma a scapito della velocità, imposta questo valore sutrue
. Se non è impostato esplicitamente, il valore predefinito èfalse
. - REPLICATION_SLOT_NAME: il nome dello slot di replica che
verrà creato e utilizzato dal sottoscrittore, ad esempio
logicalrepltestslot
. - REPLICATION_USER (facoltativo): il nome dell'utente che si connette allo slot di replica. Se imposti l'utente di replica, è necessario impostare il nome del secret, lo spazio dei nomi e la password.
- USER_PASSWORD_SECRET_NAME (Facoltativo): il nome del secret Kubernetes dell'utente dell'applicazione. Obbligatorio se è impostato l'utente dell'applicazione.
- USER_PASSWORD_SECRET_NAMESPACE (facoltativo): lo spazio dei nomi in cui si trova il secret Kubernetes per l'utente dell'applicazione. Obbligatorio se è impostato l'utente dell'applicazione.
Visualizza lo stato dello slot di replica
Per visualizzare lo stato degli slot di replica, esegui questo comando:
kubectl get replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE -oyaml
Il campo status
e altri dettagli sono inclusi nella risposta:
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
Il campo DATABASE_ENDPOINT
mostra l'indirizzo IP che utilizzi per connetterti al
database. Lo stato TRUE
nella colonna READY
indica che lo slot è
pronto per lo streaming. Quando il DBCluster o l'applicazione del sottoscrittore si connette allo slot di replica, lo stato nella colonna HEALTHY
cambia in TRUE
.
Configura il cluster publisher
Trova il pod che ti serve.
$ 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"
Connettiti al pod principale sul cluster publisher utilizzando
psql
:psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME
Sostituisci quanto segue:
- IP_ADDRESS: l'indirizzo IP del pod principale del cluster publisher.
- USERNAME: l'utente postgres del database.
- DATABASE_NAME: il database a cui l'abbonato vuole abbonarsi.
Se il
DATABASE_NAME
specificato nella risorsa di replica non esiste, crea un database.CREATE DATABASE DATABASE_NAME;
(Facoltativo) A scopo di test, aggiungi una tabella al database e inserisci alcuni dati. Puoi utilizzare questi dati per osservare la replica dei dati dall'editore all'abbonato.
$ 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)
Sostituisci TABLE_NAME con una tabella in cui vuoi archiviare i dati e a cui l'abbonato si abbona.
Concedi le autorizzazioni:
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;
Crea la pubblicazione eseguendo il seguente comando:
CREATE PUBLICATION PUBLICATION_NAME; ALTER PUBLICATION PUBLICATION_NAME ADD TABLE TABLE_NAME;
Sostituisci quanto segue:
- PUBLICATION_NAME: il nome della pubblicazione che l'abbonato utilizzerà per abbonarsi.
Dopo aver creato la pubblicazione, puoi configurare il cluster di abbonati per la replica logica o configurare l'applicazione per avviare la replica.
Limitazioni
Gli aggiornamenti alla configurazione dello slot di replica non sono supportati. Per aggiornare la configurazione, elimina lo slot di replica e ricrealo con la configurazione aggiornata.
Per eliminare lo slot di replica, esegui questo comando:
kubectl delete replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE
Puoi configurare lo slot di replica logica solo nel database publisher. L'API di replica non supporta DBCluster o applicazioni di sottoscrizione della replica logica.
Se il cluster di database a cui fa riferimento l'oggetto di replica è configurato per la disponibilità elevata, lo slot di replica logica viene ricreato sullo standby promosso dopo un failover. Dopo la ricreazione dello slot di replica, la posizione dello stream nello slot non è più disponibile e tutte le applicazioni che si abbonano allo stream devono riconnettersi e riprodurlo.