Questa pagina descrive come utilizzare lo slot di failover logico per configurare la replica logica di Cloud SQL per PostgreSQL in modo che funzioni perfettamente con le operazioni di disaster ripristino di emergenza (RE) avanzato, in particolare lo switchover e il failover della replica sulle istanze con Cloud SQL Enterprise Plus.
Le funzionalità di ripristino di emergenza (RE) avanzato di Cloud SQL consentono di disporre di solide funzionalità di disaster recovery. Se combinato con la replica logica di PostgreSQL, è fondamentale che il flusso di replica rimanga integro dopo un cambio di ruolo o un failover della replica.
Utilizzando il ripristino di emergenza (RE) avanzato con la replica logica di PostgreSQL, puoi assicurarti che i tuoi sottoscrittori logici non subiscano alcuna perdita di dati e che possano riconnettersi automaticamente alla nuova istanza principale dopo un evento di ripristino di emergenza, garantendo così la continuità aziendale.
Puoi utilizzare questa funzionalità sulle istanze Cloud SQL con la seguente configurazione:
- PostgreSQL versione 17 o successive
- Versione Cloud SQL Enterprise Plus
Accesso privato ai servizi
Ti consigliamo di utilizzare l'endpoint di scrittura del servizio di nomi di dominio (DNS) di accesso privato ai servizi per abilitare le riconnessioni automatiche dei sottoscrittori logici.
Prima di iniziare
-
Devi utilizzare la versione 502.0.0 o successive. Per controllare la versione di Google Cloud SDK, esegui
gcloud --version. Per aggiornare Google Cloud SDK, eseguigcloud components update. Crea un Cloud de Confiance by S3NS progetto o selezionane uno esistente.
Concedi i ruoli e le autorizzazioni Identity and Access Management (IAM) richiesti.
Per creare un progetto: Project Creator (
roles/resourcemanager.projectCreator)Per creare e gestire istanze Cloud SQL: Amministratore Cloud SQL (
roles/cloudsql.admin)Per creare e gestire le VM Compute Engine: Compute Instance Admin (v1) (
roles/compute.instanceAdmin.v1) e Compute Viewer (roles/compute.networkViewer)Per creare reti VPC: Network Admin (
roles/compute.networkAdmin)
Per saperne di più, consulta Ruoli e autorizzazioni.
Per scoprire come concedere ruoli e autorizzazioni IAM, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.
Configura il ripristino di emergenza (RE) avanzato con la replica logica
La procedura per configurare il ripristino di emergenza (RE) avanzato con la replica logica di PostgreSQL prevede i seguenti passaggi di alto livello:
- Configura le variabili di ambiente e la VM bastion.
- Crea e configura l'istanza principale.
- Crea e designa RE DR.
- Crea e configura un'istanza di sottoscrittore logico.
- Crea una sottoscrizione di replica logica.
- Eseguire un cambio o un failover della replica.
- Convalida la replica.
- Liberare spazio nello slot di replica orfano sulla nuova replica.
- (Facoltativo) Esegui il rollback.
Configura le variabili di ambiente e la VM bastion
Imposta le seguenti variabili di ambiente.
# Project export PROJECT="PROJECT_ID" # Instance names export PRIMARY_INSTANCE_NAME="PRIMARY_INSTANCE" export DR_REPLICA_NAME="DR_REPLICA" export SUBSCRIBER_INSTANCE_NAME="SUBSCRIBER_INSTANCE" export BASTION_VM_NAME="BASTION_VM" # Regions and zones export PRIMARY_REGION="PRIMARY_REGION" export REPLICA_REGION="REPLICA_REGION" export SUBSCRIBER_REGION="SUBSCRIBER_REGION" export VM_ZONE="VM_ZONE" # Network export NETWORK_NAME="NETWORK" # Credentials export POSTGRES_PASSWORD="PASSWORD" # Set gcloud project gcloud config set project PROJECT_IDSostituisci quanto segue:
- PROJECT_ID: l'ID progetto.
- PRIMARY_INSTANCE: il nome dell'istanza Cloud SQL primaria.
- DR_REPLICA: il nome della replica.
- SUBSCRIBER_INSTANCE: il nome dell'istanza di sottoscrizione.
- BASTION_VM: il nome della VM bastion.
- PRIMARY_REGION: la regione in cui si trova l'istanza primaria.
- REPLICA_REGION: la regione in cui si trova la replica. La replica deve trovarsi in una regione diversa da quella dell'istanza primaria.
- SUBSCRIBER_REGION: la regione in cui si trova l'abbonato.
- VM_ZONE: la zona in cui si trova la VM bastion.
- NETWORK: il nome della tua rete VPC.
- PASSWORD: la password per l'utente
postgres.
Crea una VM bastion di Compute Engine.
Le istanze Cloud SQL utilizzano l'IP privato. Pertanto, crea una VM bastion host di Compute Engine nella tua rete VPC.
gcloud compute instances create $BASTION_VM_NAME \ --zone=$VM_ZONE \ --machine-type=e2-small \ --network=projects/$PROJECT_ID/global/networks/$NETWORK_NAME \ --image-project=debian-cloud \ --image-family=debian-11 \ --project=$PROJECTConnettiti alla VM bastion.
gcloud compute ssh $BASTION_VM_NAME \ --zone=$VM_ZONE \ --project=$PROJECTSulla VM bastion, installa il client PostgreSQL.
sudo apt-get update sudo apt-get install -y postgresql-client exit
I comandi PostgreSQL nei passaggi successivi devono essere eseguiti dalla VM bastion.
Crea e configura l'istanza principale
Crea l'istanza Cloud SQL principale.
gcloud sql instances create $PRIMARY_INSTANCE_NAME \ --database-version=POSTGRES_17 \ --edition=ENTERPRISE_PLUS \ --region=$PRIMARY_REGION \ --tier=db-perf-optimized-N-2 \ --no-assign-ip \ --network=projects/$PROJECT/global/networks/$NETWORK_NAME \ --project=$PROJECTAbilita la decodifica logica.
gcloud sql instances patch $PRIMARY_INSTANCE_NAME \ --database-flags=cloudsql.logical_decoding=on \ --project=$PROJECTImposta la password per l'utente
postgressul server primario.gcloud sql users set-password postgres \ --instance=$PRIMARY_INSTANCE_NAME \ --password="$POSTGRES_PASSWORD" \ --project=$PROJECTConnettiti all'istanza principale dalla VM bastion.
Recupera l'indirizzo IP privato dell'istanza principale.
gcloud sql instances describe $PRIMARY_INSTANCE_NAME \ --format="value(ipAddresses[0].ipAddress)" \ --project=$PROJECTCopia e conserva l'indirizzo IP privato dell'istanza principale.
Accedi tramite SSH alla VM bastion.
gcloud compute ssh $BASTION_VM_NAME --zone=$VM_ZONE --project=$PROJECTDalla VM bastion, connettiti all'istanza principale.
psql -h PRIMARY_PRIVATE_IP -U postgresSostituisci PRIMARY_PRIVATE_IP con l'IP privato dell'istanza primaria che hai recuperato nel passaggio 4.a di questa procedura.
Quando viene richiesta la password, inserisci la variabile
$POSTGRES_PASSWORD.La VM bastion è ora connessa all'istanza primaria tramite PostgreSQL.
Concedi le autorizzazioni e crea la pubblicazione.
Concedi il privilegio
REPLICATIONall'utentepostgres.ALTER USER postgres WITH REPLICATION;Concedi i privilegi necessari sullo schema e sulle tabelle pubblici.
GRANT SELECT ON ALL TABLES IN SCHEMA public TO postgres;Crea la pubblicazione per tutte le tabelle.
CREATE PUBLICATION my_publication FOR ALL TABLES;Digita
exitper uscire da PostgreSQL, quindiexitdi nuovo per chiudere la sessione SSH della VM bastion.
Crea e designa la replica di ripristino di emergenza (replica RE)
Crea una replica di RE.
gcloud sql instances create $DR_REPLICA_NAME \ --master-instance-name=$PRIMARY_INSTANCE_NAME \ --edition=ENTERPRISE_PLUS \ --tier=db-perf-optimized-N-2 \ --region=$REPLICA_REGION \ --no-assign-ip \ --network=projects/$PROJECT/global/networks/$NETWORK_NAME \ --project=$PROJECTDesigna questa replica come replica RE.
gcloud sql instances patch $PRIMARY_INSTANCE_NAME \ --failover-dr-replica-name=$DR_REPLICA_NAME \ --project=$PROJECTConfigura la replica RE per la sincronizzazione degli slot logici.
gcloud sql instances patch $DR_REPLICA_NAME \ --database-flags="^:^cloudsql.logical_decoding=on:hot_standby_feedback=on:sync_replication_slots=on:cloudsql.logical_slot_sync_dbname=postgres" \ --project=$PROJECTConfigura la replica sincrona tra l'istanza principale e la replica di RE.
Per evitare la potenziale perdita di dati sul sottoscrittore logico in caso di interruzione improvvisa dell'istanza principale e successivo failover della replica di ripristino di emergenza, ti consigliamo di configurare la replica sincrona tra l'istanza principale e la replica di ripristino di emergenza.
L'impostazione di
cloudsql.synchronized_standby_replicassull'istanza principale impone al mittente del log Write-Ahead (WAL) di replica logica dell'istanza principale di attendere che la replica di RE abbia ricevuto e scaricato il WAL per una determinata transazione prima di inviarla al subscriber logico. In questo modo, lo stato della replica diRER è sempre uguale o successivo allo stato del sottoscrittore logico.gcloud sql instances patch $PRIMARY_INSTANCE_NAME \ --database-flags="^:^cloudsql.logical_decoding=on:cloudsql.synchronized_standby_replicas=$DR_REPLICA_NAME" \ --project=$PROJECT
Crea e configura un'istanza di sottoscrittore logico
Crea un'istanza di sottoscrittore.
gcloud sql instances create $SUBSCRIBER_INSTANCE_NAME \ --database-version=POSTGRES_17 \ --tier=db-perf-optimized-N-2 \ --region=$SUBSCRIBER_REGION \ --no-assign-ip \ --network=projects/$PROJECT/global/networks/$NETWORK_NAME \ --project=$PROJECTAbilita la decodifica logica sul sottoscrittore.
gcloud sql instances patch $SUBSCRIBER_INSTANCE_NAME \ --database-flags=cloudsql.logical_decoding=on \ --project=$PROJECT
Crea una sottoscrizione di replica logica
Recupera l'endpoint di scrittura dell'accesso privato ai servizi dell'istanza principale.
gcloud sql instances describe $PRIMARY_INSTANCE_NAME \ --format="value(replicationCluster.psaWriteEndpoint)" \ --project=$PROJECTCopia e conserva l'endpoint di scrittura.
Connettiti all'istanza di sottoscrizione.
Aggiorna la password per l'utente
postgresdell'istanza abbonato.gcloud sql users set-password postgres \ --instance=$SUBSCRIBER_INSTANCE_NAME \ --password="$POSTGRES_PASSWORD" \ --project=$PROJECTRecupera l'indirizzo IP privato dell'istanza di sottoscrizione.
gcloud sql instances describe $SUBSCRIBER_INSTANCE_NAME \ --format="value(ipAddresses[0].ipAddress)" \ --project=$PROJECTCopia e conserva l'indirizzo IP privato.
Accedi tramite SSH alla VM bastion.
gcloud compute ssh $BASTION_VM_NAME \ --zone=$VM_ZONE \ --project=$PROJECTDalla VM bastion, connettiti all'istanza abbonata tramite PostgreSQL.
psql -h SUBSCRIBER_PRIVATE_IP -U postgresSostituisci SUBSCRIBER_PRIVATE_IP con l'IP privato dell'istanza abbonata che hai copiato nel passaggio 2.b di questa procedura.
Quando viene richiesta la password, inserisci la variabile
$POSTGRES_PASSWORD.
Crea un abbonamento.
CREATE SUBSCRIPTION my_subscription CONNECTION 'host=DR_CLUSTER_PSA_DNS_WRITE_ENDPOINT port=5432 dbname=postgres user=postgres password=PASSWORD' PUBLICATION my_publication WITH (failover = true);Sostituisci quanto segue:
- DR_CLUSTER_PSA_DNS_WRITE_ENDPOINT: l'endpoint di scrittura dell'accesso ai servizi privati che hai copiato nel passaggio 1 di questa procedura.
- PASSWORD: il valore della variabile
${POSTGRES_PASSWORD}.
Esci da PostgreSQL e dalla sessione SSH della VM bastion.
Facoltativo. Verifica la persistenza dello slot nella replica RE.
Questa transizione alla modalità persistente (
temporary = false) in genere avviene rapidamente, spesso in pochi secondi se l'attività del dispositivo principale è bassa. In caso di carico di scrittura elevato sul database primario, questo processo potrebbe richiedere più tempo, in genere circa un minuto. Lo slot deve essere persistente dopo aver completato questi comandi manuali.Ottieni l'indirizzo IP privato della replica di RE.
gcloud sql instances describe $DR_REPLICA_NAME \ --format="value(ipAddresses[0].ipAddress)" \ --project=$PROJECTCopia e conserva l'indirizzo IP privato della replica di RE.
Accedi tramite SSH alla VM bastion.
gcloud compute ssh $BASTION_VM_NAME \ --zone=$VM_ZONE \ --project=$PROJECTDalla VM bastion, connettiti alla replica di RE.
psql -h DR_REPLICA_PRIVATE_IP -U postgresSostituisci DR_REPLICA_PRIVATE_IP con l'indirizzo IP privato della replica di RE che hai recuperato nel passaggio 5.a di questa procedura.
Quando viene richiesta la password, inserisci la variabile
$POSTGRES_PASSWORD.Controlla lo stato dello slot.
SELECT slot_name, slot_type, temporary, failover, synced FROM pg_replication_slots WHERE slot_type = 'logical' AND failover = true;Attendi che la colonna
temporarydiventif. In genere, questa operazione richiede meno di un minuto.Esci da PostgreSQL e dalla sessione SSH della VM bastion.
Esegui uno switchover o un failover della replica
Scegli l'operazione che vuoi eseguire in base al tuo scenario:
Switchover (inversione pianificata dei ruoli): scegli questa opzione per la manutenzione pianificata, i test di ripristino di emergenza o per invertire i ruoli quando l'istanza principale è online e integra. Questa operazione garantisce la perdita zero di dati per la replica fisica.
gcloud sql instances switchover $DR_REPLICA_NAME \ --project=$PROJECTFailover della replica (ripristino di emergenza): scegli questa opzione quando l'istanza primaria non è disponibile o non risponde. Questa operazione promuove la replica di RE a primaria. Per ridurre al minimo il rischio di perdita di dati per il sottoscrittore logico, assicurati che
cloudsql.synchronized_standby_replicassia stato impostato nell'istanza principale come consigliato in Crea e designa la replica di ripristino di emergenza (replica RE).gcloud sql instances promote-replica $DR_REPLICA_NAME \ --failover \ --project=$PROJECTLa promozione di
$DR_REPLICA_NAMEavviene rapidamente. Tuttavia, l'istanza principale originale ($PRIMARY_INSTANCE_NAME) viene riconfigurata come replica della nuova istanza principale solo quando torna online. Puoi monitorare questa operazione cercando il completamento dell'operazioneRECONFIGURE_OLD_PRIMARYsu$PRIMARY_INSTANCE_NAMEnel log delle operazioni. Esegui questo comando:gcloud sql operations list --instance=$PRIMARY_INSTANCE_NAME --project=$PROJECT --limit=10`La configurazione del ripristino di emergenza viene ripristinata completamente solo al termine di questa fase.
Dopo una delle due operazioni, il sottoscrittore si riconnette automaticamente al nuovo
$DR_REPLICA_NAME principale tramite l'endpoint di scrittura dell'accesso privato ai servizi.
Gestione dei flag
I workflow di Cloud SQL gestiscono automaticamente i flag di database necessari su entrambe le istanze all'interno del cluster di ripristino di emergenza durante e dopo le operazioni di switchover e failover della replica, tra cui:
- I flag di sincronizzazione degli slot logici (
cloudsql.logical_decoding,hot_standby_feedback,sync_replication_slots,cloudsql.logical_slot_sync_dbname) sono corretti nell'istanza che diventa la nuova replica. - Il flag
cloudsql.synchronized_standby_replicassull'istanza che diventa la nuova istanza principale viene aggiornato automaticamente in modo che punti al nome della nuova replica di RE.
Non è necessario riapplicare o modificare manualmente questi flag dopo un'operazione di switchover o di failover della replica. Cloud SQL gestisce la configurazione corretta per i ruoli primario e di replica.
Convalida la replica
Controlla lo stato dell'iscritto.
Dalla VM bastion, esegui il seguente comando.
psql -h SUBSCRIBER_PRIVATE_IP -U postgresSostituisci SUBSCRIBER_PRIVATE_IP con l'indirizzo IP privato dell'istanza abbonata.
Sull'istanza di sottoscrizione, esegui il comando seguente.
SELECT subname, pid IS NOT NULL AS is_active FROM pg_stat_subscription;Lo stato deve essere
streaming.
Controlla lo stato dello slot di replica del nuovo primario. Il nuovo primario è la precedente replica RE (
$DR_REPLICA_NAME).Ottieni l'indirizzo IP privato del nuovo primario.
gcloud sql instances describe $DR_REPLICA_NAME \ --project=$PROJECT --format="value(ipAddresses[0].ipAddress)"Copia e conserva l'indirizzo IP privato del nuovo primario.
Accedi tramite SSH alla VM bastion.
psql -h NEW_PRIMARY_PRIVATE_IP -U postgresSostituisci NEW_PRIMARY_PRIVATE_IP con l'indirizzo IP privato del nuovo primario che hai copiato nel passaggio precedente.
Sulla nuova istanza primaria, esegui questi comandi.
SELECT slot_name, slot_type, active, synced, active_pid, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn)) AS replication_lag FROM pg_replication_slots WHERE slot_type = 'logical';Lo slot (ad esempio,
my_subscription) deve essereactive = t.SELECT application_name, state FROM pg_stat_replication;pg_stat_replicationdovrebbe mostrare l'abbonato connesso.
Pulisci lo slot di replica orfano nella nuova replica
Al termine dell'operazione di cambio e failover, l'istanza principale originale ($PRIMARY_INSTANCE_NAME) è ora una replica. Questa nuova istanza di replica
conserva ancora lo slot di replica logica originale denominato
my_subscription sul disco. Questo slot my_subscription è ora orfano perché
il sottoscrittore deve connettersi al nuovo primario ($DR_REPLICA_NAME)
tramite l'endpoint di scrittura dell'accesso privato ai servizi.
Cloud SQL non rimuove automaticamente questo slot orfano dalla nuova replica. Questo perché Cloud SQL non può determinare se il sottoscrittore è stato configurato per utilizzare l'indirizzo IP dell'istanza anziché l'endpoint di scrittura di accesso ai servizi privati. L'abbonato potrebbe ancora tentare di connettersi a questo vecchio slot sulla nuova replica finché l'abbonamento non viene modificato manualmente. L'eliminazione automatica dello slot potrebbe interrompere queste configurazioni.
La presenza di questo slot orfano nella nuova replica ($PRIMARY_INSTANCE_NAME)
fa sì che il processo di worker slotsync su questa istanza generi errori nei
log. Potresti visualizzare un messaggio di errore simile al seguente in postgres.log della nuova replica. Questo errore si ripete continuamente mentre il worker slotsync continua a riprovare.
ERROR: exiting from slot synchronization because same name slot "my_subscription" already exists on the standby
Per evitare questi errori e consentire al worker slotsync di stabilire correttamente una
nuova versione sincronizzata dello slot my_subscription su questa replica, devi
eliminare manualmente lo slot orfano. In questo modo, l'istanza viene preparata correttamente se intendi eseguire il rollback in futuro.
Recupera l'indirizzo IP privato della nuova replica (
$PRIMARY_INSTANCE_NAME).gcloud sql instances describe $PRIMARY_INSTANCE_NAME \ --project=$PROJECT --format="value(ipAddresses[0].ipAddress)"Copia e conserva l'indirizzo IP privato della nuova replica.
Accedi tramite SSH alla VM bastion.
gcloud compute ssh $BASTION_VM_NAME \ --zone=$VM_ZONE \ --project=$PROJECTDalla VM bastion, connettiti alla nuova replica.
psql -h NEW_REPLICA_IP -U postgresSostituisci NEW_REPLICA_IP con l'indirizzo IP della nuova replica che hai copiato nel passaggio 1 di questa procedura.
Quando viene richiesta la password, inserisci la variabile
$POSTGRES_PASSWORD.Nella nuova replica (
$PRIMARY_INSTANCE_NAME), elimina lo slot orfano.SELECT slot_name, slot_type, temporary, failover, synced, active FROM pg_replication_slots WHERE slot_name = 'my_subscription';Verifica che lo slot esista con
synced = falseeactive = false, quindi eliminalo.SELECT pg_drop_replication_slot('my_subscription');Lo slot orfano viene rimosso.
Risincronizzazione automatica degli slot
Una volta eliminato lo slot orfano, il worker slotsync sulla nuova replica ($PRIMARY_INSTANCE_NAME) si connette automaticamente al nuovo nodo primario ($DR_REPLICA_NAME) nel ciclo successivo. Crea un nuovo slot my_subscription
locale sincronizzato con lo slot attivo della nuova emittente principale.
Puoi visualizzare i messaggi in postgres.log della nuova replica che indicano l'esito positivo,
simili ai seguenti:
LOG: newly created slot "my_subscription" is sync-ready now
Il nuovo slot sincronizzato ha failover=true e alla fine diventa persistente
(temporary=false), garantendo che se torni indietro in un secondo momento, questa istanza sia pronta.
(Facoltativo) Esegui il rollback
Ora torna indietro, impostando di nuovo
$PRIMARY_INSTANCE_NAMEcome istanza primaria.gcloud sql instances switchover $PRIMARY_INSTANCE_NAME \ --project=$PROJECTEsegui la verifica dopo il rollback.
Controlla lo stato dell'istanza di abbonato.
SELECT subname, pid IS NOT NULL AS is_active FROM pg_stat_subscription;L'abbonamento dovrebbe essere ancora attivo, ovvero
is_active = t.Controlla lo stato dello slot della nuova risorsa principale (
$PRIMARY_INSTANCE_NAME).SELECT slot_name, active FROM pg_replication_slots WHERE slot_type = 'logical'; SELECT * FROM pg_stat_replication;Lo slot deve essere attivo e l'abbonato deve essere connesso.
Risoluzione dei problemi
| Problema | Risoluzione dei problemi |
|---|---|
Errore nella nuova replica (ovvero la vecchia istanza principale) dopo il cambio:
|
Segui i passaggi descritti in Pulire lo slot di replica orfano nella nuova replica. |