Crea uno slot di replica e una pubblicazione

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ù sottoscrittori, che possono essere database o altre applicazioni. Puoi attivare e configurare la replica logica sui cluster che crei utilizzando l'operatore Kubernetes AlloyDB Omni.

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 di dati, quindi se si verifica un'interruzione, lo streaming riprende da dove si era interrotto.

Per ulteriori informazioni sulla replica logica in PostgreSQL, consulta 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 di publisher

Prima di creare gli slot di replica, devi creare il cluster del publisher con la replica logica abilitata. Devi impostare il parametro wal_level su logical nel file manifest DBCluster.

Per creare un cluster di database del 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 esempio publisher.

  • DB_CLUSTER_NAMESPACE (facoltativo): il nome dello spazio dei nomi in cui vuoi creare il cluster di database, ad esempio publisher-namespace.

  • ENCODED_PASSWORD: la password di accesso al database per il ruolo postgres utente predefinito, codificata come stringa base64, ad esempio Q2hhbmdlTWUxMjM= per ChangeMe123.

  • ALLOYDB_OMNI_VERSION: la versione di AlloyDB Omni, 15.7.0 o successiva.

  • 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 hai impostato cpu su 2 in precedenza in questo manifest, ti consigliamo di impostare memory su 16Gi.

  • DISK_SIZE: le dimensioni del disco per istanza di database, ad esempio 10Gi.

Crea uno slot di replica

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

$ 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 esempio replication-1.
  • NAMESPACE: lo spazio dei nomi Kubernetes per questa Replication risorsa. 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 su vari plug-in di decodifica, consulta Plug-in di output.
  • DATABASE_NAME: impostato sul nome del database di cui vuoi eseguire lo streaming delle modifiche nello 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 connetterà 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, ad esempio logicalrepltestslot.
  • REPLICATION_USER (Facoltativo): il nome dell'utente che si connette allo slot di replica. Se imposti l'utente di replica, è obbligatorio 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 dove 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 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 utilizzato per connettersi al database. Lo stato TRUE nella colonna READY indica che lo slot è pronto per lo streaming. Quando l'applicazione o il DBCluster dell'abbonato si connette allo slot di replica, lo stato nella colonna HEALTHY diventa TRUE.

Configura il cluster del publisher

  1. Trova il pod di cui hai bisogno.

    $ 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"
    
  2. 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 abbonarsi.
  3. Se DATABASE_NAME specificato nella risorsa di replica non esiste, crea un database.

    CREATE DATABASE DATABASE_NAME;
    
  4. (Facoltativo) A scopo di test, aggiungi una tabella al database e inserisci alcuni dati. Puoi utilizzare questi dati per osservare la replica dei dati dal 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 iscrive.

  5. 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;
    
  6. 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.

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 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. L'API di replica non supporta i DBCluster o le applicazioni sottoscrittori 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 sul database standby promosso dopo un failover. Dopo aver ricreato lo slot di replica, la posizione dello stream nello slot non è più disponibile e tutte le app che si abbonano allo stream devono ricollegarsi e riprodurre lo stream.

Passaggi successivi