Configura gli slot di replica utilizzando l'operatore AlloyDB Omni Kubernetes

Questo documento descrive come creare slot di replica logica in AlloyDB Omni. La replica logica in AlloyDB Omni viene utilizzata per trasmettere continuamente modifiche specifiche dei dati dal database di origine (publisher) ad altri database o applicazioni (subscriber). Le modifiche in streaming possono essere aggiornamenti, inserzioni 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 dello streaming dei dati, quindi se si verifica un'interruzione, lo streaming riprende da dove era stato interrotto.

Per ulteriori informazioni sulla replica logica in PostgreSQL, consulta Replica logica.

Configura il cluster di publisher e sottoscrittori

Prima di creare gli slot di replica, devi creare il cluster del publisher e dell'abbonato con la replica logica abilitata. Il parametro wal_level deve essere impostato su logical nei rispettivi manifest.

Per creare un cluster di database del publisher con la replica logica abilitata, crea e applica un manifest DBCluster.

Di seguito è riportato un esempio di manifest del publisher:

apiVersion: v1
kind: Secret
metadata:
  name: db-pw-mydbc
type: Opaque
data:
  mydbc: "Q2hhbmdlTWUxMjM="
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
  name: mydbc
spec:
  databaseVersion: "15.7.0"
  spec:
  availability:
    numberOfStandbys: 1
  primarySpec:
    parameters:
      wal_level: "logical"
    adminUser:
      passwordRef:
        name: db-pw-mydbc
    resources:
      cpu: 1
      memory: 8Gi
      disks:
      - name: DataDisk
        size: 10Gi

Per creare un cluster di database degli abbonati con la replica logica abilitata, crea e applica un manifest DBCluster.

Di seguito è riportato un esempio di manifest degli abbonati:

apiVersion: v1
kind: Secret
metadata:
  name: db-pw-subscriber
type: Opaque
data:
  subscriber: "Q2hhbmdlTWUxMjM=" #ChangeMe123
---
apiVersion: alloydbomni.dbadmin.goog/v1
kind: DBCluster
metadata:
  name: subscriber
spec:
  databaseVersion: "15.7.0"
  primarySpec:
    parameters:
      wal_level: "logical"
    adminUser:
      passwordRef:
        name: db-pw-subscriber
    resources:
      memory: 10Gi
      cpu: 1
      disks:
      - name: DataDisk
        size: 40Gi
—

Crea uno slot di replica

Dopo aver creato i cluster di publisher e sottoscrittori, puoi creare uno slot di replica logica utilizzando la risorsa Replication nel cluster di 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 del publisher, applica il seguente manifest:

apiVersion: v1
kind: Secret
metadata:
  name: USER_PASSWORD_SECRET_NAME
  namespace: USER_PASSWORD_SECRET_NAMESPACE
type: Opaque
data:
  rep-user-pw: BASE64_ENCODED_PASSWORD
---
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

Sostituisci quanto segue:

  • REPLICATION_NAME: un nome per questa risorsa Replication, ad esempio replication-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 al momento della 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, consulta Plug-in di output.
  • DATABASE_NAME: impostato sul nome del database di cui vuoi trasmettere le modifiche in streaming allo slot di replica. Assicurati che il database sia già stato creato nel cluster del publisher.
  • APPLICATION_NAME (facoltativo): impostato sul nome dell'applicazione che si connette allo slot di replica. Questo campo è obbligatorio quando la modalità di streaming è impostata su sincrona.
  • REPLICATION_MODE (facoltativo): impostato su false per la replica asincrona. Se vuoi attivare la replica sincrona, ma a scapito della velocità, imposta questo valore su true. Il valore predefinito è false, se non impostato esplicitamente.
  • REPLICATION_SLOT_NAME: il nome dello slot di replica che verrà creato e utilizzato dall'abbonato.
  • 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.
  • BASE64_ENCODED_PASSWORD (Facoltativo): la password codificata in base64 dell'utente dell'applicazione. Obbligatorio se è impostato l'utente dell'applicazione.

Concedi le autorizzazioni all'utente di replica

Per concedere le autorizzazioni di replica e pubblicazione all'utente di replica nel cluster del publisher:

  1. Connettiti al pod principale nel cluster del 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 del publisher.
    • USERNAME: l'utente postgres del database.
    • DATABASE_NAME: il database a cui l'abbonato vuole iscriversi.
  2. 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;
    

Creare una pubblicazione e una sottoscrizione

Crea pubblicazione

Per creare una pubblicazione nel cluster di publisher:

  1. Connettiti al pod principale nel cluster del 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 del publisher.
    • USERNAME: l'utente postgres del database.
    • DATABASE_NAME: il database a cui l'abbonato vuole iscriversi.
  2. 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 iscriversi.
    • TABLE_NAME: la tabella a cui l'abbonato vuole iscriversi.

Crea abbonamento

Per creare un abbonamento nel cluster di abbonati:

  1. Connettiti al pod principale nel cluster di abbonati utilizzando psql:

    psql -h IP_ADDRESS -U USERNAME -d DATABASE_NAME

    Sostituisci quanto segue:

    • IP_ADDRESS: l'indirizzo IP del pod principale del cluster dell'abbonato.
    • USERNAME: l'utente postgres del database.
    • DATABASE_NAME: il database a cui l'abbonato vuole iscriversi.
  2. Crea un abbonamento eseguendo il seguente comando:

    CREATE SUBSCRIPTION SUBSCRIPTION_NAME CONNECTION 'host=IP_ADDRESS port=PORT user=REPLICATION_USER dbname=DATABASE_NAME password=PASSWORD sslmode=require' PUBLICATION PUBLICATION_NAME WITH (slot_name=REPLICATION_SLOT_NAME, create_slot=false);
    
    alter subscription SUBSCRIPTION_NAME refresh publication ;
    

    Sostituisci quanto segue:

    • SUBSCRIPTION_NAME: il nome dell'abbonamento.
    • IP_ADDRESS: l'indirizzo IP del pod principale del cluster del publisher.

Eventuali aggiornamenti alla tabella nel cluster del publisher vengono replicati nella tabella del cluster dell'abbonato.

Visualizza lo stato dello slot di replica

Per visualizzare lo stato degli slot di replica, esegui il seguente comando:

kubectl get replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE -oyaml

Il campo status, insieme ad altri dettagli, è incluso 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

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 l'applicazione si connette allo slot di replica, lo stato nella colonna HEALTHY diventa TRUE.

Limitazioni

  • Gli aggiornamenti alla configurazione dell'area di replica non sono supportati. Per aggiornare la configurazione, elimina lo slot di replica e ricréalo con la configurazione aggiornata.

    Per eliminare lo slot di replica, esegui il seguente comando: kubectl delete replication.alloydbomni.dbadmin.goog REPLICATION_NAME -n NAMESPACE

  • Puoi configurare lo slot di replica logica solo nel database del publisher. Le configurazioni degli abbonati non sono supportate.

  • Se il cluster di database a cui fa riferimento l'oggetto di replica è configurato per l'alta disponibilità, lo slot di replica logica viene ricreato nella risorsa standby promossa dopo un failover. Una volta ricreato lo slot di replica, la posizione dello stream nello slot non è più disponibile e tutte le applicazioni che si abbonano allo stream devono ricollegarsi e riprodurlo di nuovo.

Passaggi successivi