Replica logica con AlloyDB Omni

1. Introduzione

Questo codelab mostra come configurare la replica logica tra istanze AlloyDB Omni indipendenti. Eseguirai il deployment di più istanze di AlloyDB Omni su una singola VM Compute Engine e configurerai la replica tra loro utilizzando l'estensione pglogical.

L'esecuzione di più istanze su un singolo nodo è utile per lo sviluppo, il test o la simulazione di ambienti di replica. Al termine di questo codelab, avrai una configurazione di replica funzionante con un'istanza che funge da fornitore e un'altra da abbonato.

Prerequisiti

  • Accesso a un progetto Google Cloud e a Cloud Shell dalla console Google Cloud.
  • Google Cloud SDK (gcloud) installato e configurato. Per informazioni dettagliate sull'installazione di gcloud, consulta gcloud-install.

Obiettivi didattici

  • Come creare e preparare una VM Compute Engine per più istanze AlloyDB Omni utilizzando gcloud.
  • Come installare i pacchetti RPM di AlloyDB Omni.
  • Come configurare e inizializzare più istanze AlloyDB Omni utilizzando i modelli systemd.
  • Come configurare la replica logica tra le istanze AlloyDB Omni utilizzando pglogical.
  • Come verificare la replica replicando i dati dal fornitore all'abbonato.

Che cosa ti serve

  • Ottieni un link URL agli RPM di AlloyDB Omni. I link vengono inviati alla tua email, incluso un link al server dell'URL del repository. Inizializza la seguente variabile di ambiente per mantenere l'URL pronto per l'uso durante il codelab.
    export ALLOYDB_OMNI_REPOSITORY_URL="..."
    
  • Un terminale funzionante con accesso a Google Cloud. A questo scopo, puoi utilizzare Cloud Shell.

2. Configurazione e requisiti

Configurazione del progetto

Creare un progetto Google Cloud

  1. Nella console Google Cloud, nella pagina di selezione del progetto, seleziona o crea un progetto Google Cloud.
  2. Verifica che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata per un progetto.

Avvia Cloud Shell

Sebbene tu possa gestire Google Cloud da remoto dal tuo laptop, in questo codelab utilizzerai Google Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.

Icona per attivare Cloud Shell

  1. Apri la console Google Cloud e fai clic sull'icona di Cloud Shell nella barra degli strumenti in alto a destra.Puoi anche aprire Cloud Shell in uno dei seguenti modi:

In genere, Cloud Shell richiede pochi istanti per eseguire il provisioning e connettersi all'ambiente. Al termine dell'operazione, visualizzerai un output simile al seguente:

Terminale Google Cloud Shell che mostra che l'ambiente è connesso

3. Crea la VM di Compute Engine

In questa sezione, crea una singola macchina virtuale (VM) Compute Engine utilizzando lo strumento a riga di comando gcloud. Utilizza un'immagine Rocky Linux 9, completamente compatibile con gli RPM di AlloyDB Omni.

  1. Definisci le variabili di ambiente per l'ID progetto, il nome della VM, la zona e la regione.
    export PROJECT="your-project-id"
    export INSTANCE_NAME="alloydb-omni-multi-vm"
    export ZONE="us-central1-c"
    export REGION="us-central1"
    
  2. Accedi con il tuo account Google Cloud e configura il progetto predefinito.
    gcloud auth login
    gcloud config set project $PROJECT
    
  3. Per consentire le connessioni SSH alla tua VM utilizzando Identity-Aware Proxy (IAP), crea una regola firewall.
    gcloud compute firewall-rules create allow-ssh-alloydb-omni \
        --project=$PROJECT \
        --direction=INGRESS \
        --action=allow \
        --rules=tcp:22 \
        --source-ranges="0.0.0.0/0"
    
  4. Poiché la VM viene creata senza un indirizzo IP pubblico, configura un router Cloud e un gateway Cloud NAT per consentire alla VM di accedere ai repository di pacchetti esterni e scaricare il software richiesto.
    gcloud compute routers create alloydb-omni-router \
        --project=$PROJECT \
        --network=default \
        --region=$REGION
    
    gcloud compute routers nats create alloydb-omni-nat \
        --project=$PROJECT \
        --router=alloydb-omni-router \
        --region=$REGION \
        --nat-all-subnet-ip-ranges \
        --auto-allocate-nat-external-ips
    
  5. Verifica che la tua rete Virtual Private Cloud (VPC) abbia una route del gateway internet predefinita valida. Questa route è necessaria per consentire a Cloud NAT di inoltrare il traffico in uscita a internet.
    gcloud compute routes create default-internet-route \
        --project=$PROJECT \
        --network=default \
        --destination-range=0.0.0.0/0 \
        --next-hop-gateway=default-internet-gateway
    
  6. Crea l'istanza VM di Compute Engine con le specifiche richieste (16 vCPU, disco permanente bilanciato da 20 GB, Rocky Linux 9). Per una maggiore sicurezza, utilizza il flag --no-address per assicurarti che alla VM non venga assegnato un indirizzo IP pubblico.
    gcloud compute instances create $INSTANCE_NAME \
        --project=$PROJECT \
        --zone=$ZONE \
        --machine-type=n2-highmem-16 \
        --image-family=rocky-linux-9 \
        --image-project=rocky-linux-cloud \
        --boot-disk-size=20GB \
        --boot-disk-type=pd-balanced \
        --no-address
    
  7. Dopo aver creato la VM, verifica il suo stato.
    gcloud compute instances list --filter="name=$INSTANCE_NAME" --project=$PROJECT
    

4. Prepara la VM

In questa sezione, ti connetti alla VM appena creata e prepari l'ambiente del sistema operativo.

  1. Connettiti alla VM tramite SSH utilizzando IAP. Poiché la VM non ha un indirizzo IP pubblico, gcloud esegue automaticamente il tunneling della connessione SSH tramite IAP.
    gcloud compute ssh $INSTANCE_NAME --zone=$ZONE --project=$PROJECT --tunnel-through-iap
    
  2. Definisci una variabile di ambiente per la directory di dati di base.
    export BASE_PGDATA="/var/lib/alloydbomni"
    
  3. Crea la directory di base dei dati.
    sudo mkdir -p $BASE_PGDATA
    
  4. Installa il pacchetto policycoreutils-python-utils in modo che sia possibile configurare il criterio SELinux.
    sudo dnf install -y policycoreutils-python-utils
    

5. Installa AlloyDB Omni

Ora che la VM è preparata, puoi configurare il repository dei pacchetti e installare il pacchetto RPM di AlloyDB Omni.

  1. Configura il repository YUM sulla VM creando il file di configurazione del repository. Sostituisci $ALLOYDB_OMNI_REPOSITORY_URL con l'URL che hai ricevuto.
    export ALLOYDB_OMNI_REPOSITORY_URL="..."
    sudo tee /etc/yum.repos.d/alloydbomni.repo << EOF
    [alloydbomni]
    name=alloydbomni
    baseurl=$ALLOYDB_OMNI_REPOSITORY_URL
    enabled=1
    repo_gpgcheck=0
    gpgcheck=1
    gpgkey=https://dl.google.com/linux/linux_signing_key.pub
    EOF
    
  2. Aggiorna la cache YUM.
    sudo yum makecache
    
  3. Installa la versione 18 del pacchetto RPM di AlloyDB Omni.
    sudo dnf install -y alloydbomni18
    

6. Configura più istanze

In questa sezione, configura due istanze: inst1 e inst2.

  1. Per supportare più istanze, crea il systemdfile di servizio del modello alloydbomni18@.service.
    sudo tee /etc/systemd/system/alloydbomni18@.service << EOF
    [Unit]
    Description=AlloyDB Omni Database server instance %I
    After=syslog.target
    After=network-online.target
    
    [Service]
    SyslogIdentifier=alloydbomni-%I
    Type=notify
    
    User=postgres
    Group=postgres
    
    # Load configuration for the instance
    EnvironmentFile=/etc/alloydbomni/%I.conf
    
    OOMScoreAdjust=-1000
    Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
    Environment=PG_OOM_ADJUST_VALUE=0
    
    ExecStartPre=/usr/lib/postgresql/18/bin/alloydbomni18-check-db-dir \${PGDATA}
    ExecStart=/usr/lib/postgresql/18/bin/postgres -D \${PGDATA}
    ExecReload=/bin/kill -HUP \$MAINPID
    
    KillMode=mixed
    KillSignal=SIGINT
    
    TimeoutSec=0
    TimeoutStartSec=0
    TimeoutStopSec=1h
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
  2. Ricarica la configurazione del gestore systemd per riconoscere il nuovo servizio di modelli.
    sudo systemctl daemon-reload
    
  3. Crea la directory di configurazione per le istanze AlloyDB Omni.
    sudo mkdir -p /etc/alloydbomni
    
  4. Configura la directory dei dati per inst1.
    sudo tee /etc/alloydbomni/inst1.conf << EOF
    PGDATA=/var/lib/alloydbomni/inst1
    EOF
    
  5. Configura la directory dei dati per inst2.
    sudo tee /etc/alloydbomni/inst2.conf << EOF
    PGDATA=/var/lib/alloydbomni/inst2
    EOF
    
  6. Imposta le autorizzazioni appropriate sui file di configurazione.
    sudo chmod 640 /etc/alloydbomni/*.conf
    sudo chown postgres:postgres /etc/alloydbomni/*.conf
    
  7. Crea le directory di dati per entrambe le istanze e imposta la proprietà corretta.
    sudo mkdir -p /var/lib/alloydbomni/inst1
    sudo mkdir -p /var/lib/alloydbomni/inst2
    sudo chown -R postgres:postgres /var/lib/alloydbomni
    sudo chmod 750 /var/lib/alloydbomni/inst1 /var/lib/alloydbomni/inst2
    
  8. (Facoltativo) Imposta i limiti delle risorse per ogni istanza. In questo modo, un'istanza non consuma tutte le risorse VM. Crea directory e file di override systemd per entrambe le istanze.Nota:i limiti delle risorse utilizzati nelle seguenti configurazioni (40%) sono valori di esempio. Modifica i limiti in base al carico di lavoro specifico e alla capacità della VM.Per inst1:
    sudo mkdir -p /etc/systemd/system/alloydbomni18@inst1.service.d
    sudo tee /etc/systemd/system/alloydbomni18@inst1.service.d/override.conf << EOF
    [Service]
    CPUQuota=40%
    MemoryMax=40%
    EOF
    
    Per inst2:
    sudo mkdir -p /etc/systemd/system/alloydbomni18@inst2.service.d
    sudo tee /etc/systemd/system/alloydbomni18@inst2.service.d/override.conf << EOF
    [Service]
    CPUQuota=40%
    MemoryMax=40%
    EOF
    

7. Inizializzare e preparare i database

Inizializza e prepara ogni istanza del database separatamente.

  1. Configura SELinux in modalità permissiva per la configurazione.
    sudo setenforce 0
    
    Attenzione: l'impostazione di SELinux in modalità permissiva disattiva l'applicazione e deve essere utilizzata con cautela. Viene utilizzato in questo codelab per semplificare l'installazione. In produzione, configura le policy SELinux appropriate per AlloyDB Omni in modo che venga eseguito in modalità di applicazione. Puoi riattivare l'applicazione dopo la configurazione eseguendo sudo setenforce 1.
  2. Definisci una password efficace per l'utente amministratore postgres di PostgreSQL. Questa password viene utilizzata per entrambe le istanze in questo codelab.
    export PGPASSWORD="YourStrongPassword123!"
    
    Nota: il passaggio delle password utilizzando le variabili di ambiente nella riga di comando (ad es. PGPASSWORD=$PGPASSWORD) viene utilizzato qui per semplicità nel codelab, ma può esporre la password negli elenchi dei processi. In produzione, utilizza metodi più sicuri come un file .pgpass o un secret manager.

Configura inst1

  1. Inizializza la directory del database per inst1.
    sudo PGPASSWORD=$PGPASSWORD \
      PGDATA=/var/lib/alloydbomni/inst1 \
      /usr/lib/postgresql/18/bin/alloydbomni18-setup initdb
    
  2. Configura l'istanza in modo che ascolti sulla porta 5433 aggiornando il file postgresql.conf.
    sudo sed -i \
      "s/^#*[[:space:]]*port[[:space:]]*=[[:space:]]*[0-9]*/port = 5433/" \
      /var/lib/alloydbomni/inst1/postgresql.conf
    
  3. Prepara l'istanza del database per AlloyDB Omni.
    sudo PGPASSWORD=$PGPASSWORD \
      PGDATA=/var/lib/alloydbomni/inst1 \
      PGPORT=5433 \
      /usr/lib/postgresql/18/bin/alloydbomni18-setup preparedb
    

Configura inst2

  1. Inizializza la directory del database per inst2.
    sudo PGPASSWORD=$PGPASSWORD \
      PGDATA=/var/lib/alloydbomni/inst2 \
      /usr/lib/postgresql/18/bin/alloydbomni18-setup initdb
    
  2. Configura l'istanza in modo che sia in ascolto sulla porta 5434.
    sudo sed -i \
      "s/^#*[[:space:]]*port[[:space:]]*=[[:space:]]*[0-9]*/port = 5434/" \
      /var/lib/alloydbomni/inst2/postgresql.conf
    
  3. Prepara l'istanza di database.
    sudo PGPASSWORD=$PGPASSWORD \
      PGDATA=/var/lib/alloydbomni/inst2 \
      PGPORT=5434 \
      /usr/lib/postgresql/18/bin/alloydbomni18-setup preparedb
    

8. Avvia i servizi AlloyDB Omni

Ora puoi avviare i servizi systemd per entrambe le istanze.

  1. Per riconoscere la nuova configurazione e gli override, ricarica la configurazione del gestore systemd.
    sudo systemctl daemon-reload
    
  2. Attiva e avvia il servizio per inst1.
    sudo systemctl enable alloydbomni18@inst1
    sudo systemctl start alloydbomni18@inst1
    
  3. Attiva e avvia il servizio per inst2.
    sudo systemctl enable alloydbomni18@inst2
    sudo systemctl start alloydbomni18@inst2
    
  4. Verifica che entrambi i servizi siano attivi e in esecuzione.
    sudo systemctl status alloydbomni18@inst1
    sudo systemctl status alloydbomni18@inst2
    
    Verifica che l'output per entrambi indichi Active: active (running).

9. Verifica delle istanze AlloyDB Omni

Verifica che entrambe le istanze funzionino correttamente e siano indipendenti.

  1. Connettiti a inst1 (porta 5433). Ti viene chiesto di inserire la password che hai configurato in Inizializzare e preparare i database.
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5433 -U postgres -W
    
  2. Esegui una query per verificare la connessione.
    postgres=# SELECT version();
    
  3. Disconnettiti dall'istanza.
    postgres=# \q
    
  4. Connettiti a inst2 (porta 5434).
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5434 -U postgres -W
    
  5. Esegui una query per verificare la connessione.
    postgres=# SELECT version();
    
  6. Disconnettiti dall'istanza.
    postgres=# \q
    

10. Configura per la replica pglogical

Configura la replica logica tra le due istanze utilizzando l'estensione pglogical. In questo scenario, inst1 funge da fornitore e inst2 da abbonato.

Nota:questo codelab utilizza il superutente postgres per le connessioni di replica. In un ambiente di produzione, crea un utente di replica dedicato con privilegi REPLICATION e concedigli l'accesso solo alle tabelle replicate.

Configura le istanze per pglogical

  1. Attiva pglogical in shared_preload_libraries e configura altri parametri di replica in postgresql.conf per inst1.
    # Append pglogical to shared_preload_libraries
    sudo sed -i \
      "s/\(shared_preload_libraries\s*=\s*'\)\([^']*\)'/\1\2,pglogical'/" \
      /var/lib/alloydbomni/inst1/postgresql.conf
    
    # Append replication settings
    sudo tee -a /var/lib/alloydbomni/inst1/postgresql.conf << EOF
    wal_level = logical
    max_replication_slots = 10
    max_wal_senders = 10
    max_worker_processes = 20
    track_commit_timestamp = on
    alloydb.enable_pglogical = on
    alloydb.logical_decoding = on
    EOF
    
  2. Configura le impostazioni per inst2 che hai configurato per inst1.
    # Append pglogical to shared_preload_libraries
    sudo sed -i \
      "s/\(shared_preload_libraries\s*=\s*'\)\([^']*\)'/\1\2,pglogical'/" \
      /var/lib/alloydbomni/inst2/postgresql.conf
    
    # Append replication settings
    sudo tee -a /var/lib/alloydbomni/inst2/postgresql.conf << EOF
    wal_level = logical
    max_replication_slots = 10
    max_wal_senders = 10
    max_worker_processes = 20
    track_commit_timestamp = on
    alloydb.enable_pglogical = on
    alloydb.logical_decoding = on
    EOF
    
  3. Per applicare le modifiche alla configurazione, riavvia entrambe le istanze.
    sudo systemctl restart alloydbomni18@inst1
    sudo systemctl restart alloydbomni18@inst2
    

Configura ruoli e tabelle di replica

  1. Su inst1 (provider, porta 5433), crea un ruolo di replica e la tabella da replicare.
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5433 \
      -U postgres -d postgres -c "
      DO \$\$
      BEGIN
        IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'app_owner') THEN
          CREATE ROLE app_owner WITH LOGIN PASSWORD 'Password123';
        END IF;
      END
      \$\$;
      GRANT ALL ON SCHEMA public TO app_owner;
      CREATE TABLE IF NOT EXISTS replication_test (
          id SERIAL PRIMARY KEY,
          data TEXT,
          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
      );
      ALTER TABLE replication_test OWNER TO app_owner;
    "
    
  2. Su inst2 (abbonato, porta 5434), crea la stessa struttura di ruolo e tabella.
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5434 \
      -U postgres -d postgres -c "
      DO \$\$
      BEGIN
        IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'app_owner') THEN
          CREATE ROLE app_owner WITH LOGIN PASSWORD 'Password123';
        END IF;
      END
      \$\$;
      GRANT ALL ON SCHEMA public TO app_owner;
      CREATE TABLE IF NOT EXISTS replication_test (
          id SERIAL PRIMARY KEY,
          data TEXT,
          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
      );
      ALTER TABLE replication_test OWNER TO app_owner;
    "
    

Configura i nodi e l'abbonamento pglogical

  1. Inizializza il nodo del provider pglogical su inst1.
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5433 \
      -U postgres -d postgres -c "
      CREATE EXTENSION IF NOT EXISTS pglogical;
      SELECT pglogical.create_node(
          node_name := 'provider',
          dsn := 'host=127.0.0.1 port=5433 dbname=postgres user=postgres password=YourStrongPassword123!'
      );
      SELECT pglogical.replication_set_add_table('default', 'replication_test');
    "
    
  2. Inizializza il nodo di sottoscrizione pglogical e crea la sottoscrizione su inst2.
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5434 \
      -U postgres -d postgres -c "
      CREATE EXTENSION IF NOT EXISTS pglogical;
      SELECT pglogical.create_node(
          node_name := 'subscriber',
          dsn := 'host=127.0.0.1 port=5434 dbname=postgres user=postgres password=YourStrongPassword123!'
      );
      SELECT pglogical.create_subscription(
          subscription_name := 'test_subscription',
          provider_dsn := 'host=127.0.0.1 port=5433 dbname=postgres user=postgres password=YourStrongPassword123!'
      );
    "
    
    Nota:dopo aver creato l'abbonamento, potrebbe essere necessario un po' di tempo prima che la sincronizzazione iniziale venga completata.

11. Verifica la replica pglogical

Verifica che la replica funzioni come previsto inserendo i dati nel provider ed eseguendo una query su di essi nel sottoscrittore.

  1. Verifica che l'abbonamento sia attivo. Il passaggio a replicating potrebbe richiedere alcuni secondi.
    /usr/lib/postgresql/18/bin/psql -t -A -h localhost -p 5434 \
      -U postgres -d postgres -c "
      SELECT status FROM pglogical.show_subscription_status() WHERE subscription_name = 'test_subscription';
      "
    
  2. Prima di continuare, verifica che l'output mostri replicating.
  3. Inserisci una riga di test sul fornitore (inst1).
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5433 \
      -U postgres -d postgres -c "
      INSERT INTO replication_test (data) VALUES ('Hello from replication provider!');
    "
    
  4. Per verificare che i dati siano stati replicati, esegui una query sulla tabella in inst2.
    /usr/lib/postgresql/18/bin/psql -h localhost -p 5434 \
      -U postgres -d postgres -c "SELECT * FROM replication_test;"
    
    Verifica di visualizzare la riga inserita il giorno inst1.

12. Esegui la pulizia

Libera spazio dalle risorse. Innanzitutto, elimina le istanze AlloyDB Omni sulla VM, poi elimina le risorse Google Cloud.

Elimina le istanze AlloyDB Omni

Prima di eliminare la VM, puoi liberare spazio nelle istanze AlloyDB Omni interrompendo e disattivando i servizi e rimuovendo la loro configurazione e i loro dati.

  1. Interrompi e disattiva il servizio per inst1 e rimuovi i relativi dati e la configurazione.
    sudo systemctl stop alloydbomni18@inst1
    sudo systemctl disable alloydbomni18@inst1
    sudo rm -rf /var/lib/alloydbomni/inst1
    sudo rm -f /etc/alloydbomni/inst1.conf
    
  2. Interrompi e disattiva il servizio per inst2 e rimuovi i relativi dati e la configurazione.
    sudo systemctl stop alloydbomni18@inst2
    sudo systemctl disable alloydbomni18@inst2
    sudo rm -rf /var/lib/alloydbomni/inst2
    sudo rm -f /etc/alloydbomni/inst2.conf
    
  3. Ricarica la configurazione del gestore systemd e reimposta le unità non riuscite.
    sudo systemctl daemon-reload
    sudo systemctl reset-failed
    

Libera spazio dalle risorse Google Cloud

Dopo aver liberato spazio dalle istanze, elimina la VM Compute Engine e le altre risorse.

  1. Disconnettiti dalla sessione SSH.
    exit
    
  2. Elimina l'istanza VM di Compute Engine.
    gcloud compute instances delete $INSTANCE_NAME --zone=$ZONE --project=$PROJECT --quiet
    
  3. Elimina la regola firewall.
    gcloud compute firewall-rules delete allow-ssh-alloydb-omni --project=$PROJECT --quiet
    
  4. Elimina Cloud NAT e il router.
    gcloud compute routers nats delete alloydb-omni-nat --router=alloydb-omni-router --region=$REGION --project=$PROJECT --quiet
    gcloud compute routers delete alloydb-omni-router --region=$REGION --project=$PROJECT --quiet
    
  5. Elimina la route internet predefinita.
    gcloud compute routes delete default-internet-route --project=$PROJECT --quiet
    

13. Complimenti

Hai eseguito il deployment e la configurazione di più istanze di AlloyDB Omni su una singola VM Compute Engine.

Argomenti trattati

  • Come eseguire il provisioning e preparare una VM di Compute Engine.
  • Come installare i pacchetti RPM di AlloyDB Omni.
  • Come configurare i modelli systemd per più istanze.
  • Come inizializzare, configurare e avviare più servizi indipendenti su porte diverse.
  • Come verificare l'indipendenza di ogni istanza.

Scopri di più