Gestione delle repliche di lettura

Questa pagina descrive come gestire le repliche di lettura. Queste operazioni includono l'attivazione e la disattivazione della replica, la promozione di una replica, la configurazione della replica parallela e il controllo dello stato della replica.

Per saperne di più su come funziona la replica, consulta Replica in Cloud SQL.

Disabilita replica

Per impostazione predefinita, una replica viene avviata con la replica abilitata. Tuttavia, puoi disattivare la replica, ad esempio, per eseguire il debug o analizzare lo stato di un'istanza. Quando è tutto pronto, riattiva esplicitamente la replica. La disattivazione o la riattivazione della replica non riavvia l'istanza di replica.

La disattivazione della replica non arresta l'istanza di replica, che diventa un'istanza di sola lettura che non esegue più la replica dall'istanza principale. Continuerai a ricevere addebiti per l'istanza. Nella replica disattivata, puoi riattivare la replica, eliminare la replica o promuovere la replica a un'istanza autonoma.

Se disattivi la replica per un periodo di tempo prolungato, i requisiti di spazio di archiviazione su disco potrebbero aumentare. Ad esempio, la tua istanza potrebbe accumulare log transazionali per consentirti di riprendere la replica quando la riattivi. Per evitare di aumentare i requisiti di spazio di archiviazione su disco, anziché disattivare la replica per un periodo di tempo prolungato, valuta la possibilità di promuovere la replica o creare un clone dell'istanza primaria.

Per disattivare la replica:

Console

  1. Nella console Google Cloud , vai alla pagina Istanze Cloud SQL.

    Vai a Istanze Cloud SQL

  2. Seleziona un'istanza di replica facendo clic sul relativo nome.
  3. Fai clic su Disabilita replica nella barra dei pulsanti.
  4. Fai clic su OK.

gcloud

gcloud sql instances patch REPLICA_NAME \
--no-enable-database-replication

REST v1

Per eseguire questo comando cURL in un prompt della riga di comando, acquisisci un token di accesso utilizzando il comando gcloud auth print-access-token. Puoi anche utilizzare Explorer API nella pagina Instances:patch per inviare la richiesta API REST.

Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:

  • project-id: l'ID progetto
  • replica-name: il nome dell'istanza di replica

Metodo HTTP e URL:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/replica-name

Corpo JSON della richiesta:

{
  "settings":
  {
    "databaseReplicationEnabled": "False"
  }
}

Per inviare la richiesta, espandi una di queste opzioni:

Dovresti ricevere una risposta JSON simile alla seguente:

REST v1beta4

Per eseguire questo comando cURL in un prompt della riga di comando, acquisisci un token di accesso utilizzando il comando gcloud auth print-access-token. Puoi anche utilizzare Explorer API nella pagina Instances:patch per inviare la richiesta API REST.

Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:

  • project-id: l'ID progetto
  • replica-name: il nome dell'istanza di replica

Metodo HTTP e URL:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/replica-name

Corpo JSON della richiesta:

{
  "settings":
  {
    "databaseReplicationEnabled": "False"
  }
}

Per inviare la richiesta, espandi una di queste opzioni:

Dovresti ricevere una risposta JSON simile alla seguente:

Abilita replica

Se una replica non viene replicata da molto tempo, ci vorrà più tempo perché raggiunga l'istanza principale. In questo caso, elimina la replica e creane una nuova.

Per attivare la replica:

Console

  1. Nella console Google Cloud , vai alla pagina Istanze Cloud SQL.

    Vai a Istanze Cloud SQL

  2. Seleziona un'istanza di replica facendo clic sul relativo nome.
  3. Fai clic su Abilita replica.
  4. Fai clic su Ok.

gcloud

gcloud sql instances patch REPLICA_NAME \
--enable-database-replication

REST v1

Per eseguire questo comando cURL in un prompt della riga di comando, acquisisci un token di accesso utilizzando il comando gcloud auth print-access-token. Puoi anche utilizzare Explorer API nella pagina Instances:patch per inviare la richiesta API REST.

Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:

  • project-id: l'ID progetto
  • replica-name: il nome dell'istanza di replica

Metodo HTTP e URL:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/replica-name

Corpo JSON della richiesta:

{
  "settings":
  {
    "databaseReplicationEnabled": "True"
  }
}

Per inviare la richiesta, espandi una di queste opzioni:

Dovresti ricevere una risposta JSON simile alla seguente:

REST v1beta4

Per eseguire questo comando cURL in un prompt della riga di comando, acquisisci un token di accesso utilizzando il comando gcloud auth print-access-token. Puoi anche utilizzare Explorer API nella pagina Instances:patch per inviare la richiesta API REST.

Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:

  • project-id: l'ID progetto
  • replica-name: il nome dell'istanza di replica

Metodo HTTP e URL:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/replica-name

Corpo JSON della richiesta:

{
  "settings":
  {
    "databaseReplicationEnabled": "True"
  }
}

Per inviare la richiesta, espandi una di queste opzioni:

Dovresti ricevere una risposta JSON simile alla seguente:

Promuovere una replica

Con la promozione di una replica di lettura, la replica viene interrotta e l'istanza convertita in un'istanza Cloud SQL principale autonoma con capacità di lettura e scrittura.

Quando vengono promosse, le repliche di lettura vengono configurate automaticamente con i backup, ma non vengono configurate automaticamente come istanze ad alta disponibilità (HA). Puoi abilitare l'alta disponibilità dopo aver promosso la replica proprio come faresti per qualsiasi istanza non di replica. La configurazione di una replica di lettura per l'alta disponibilità viene eseguita nello stesso modo dell'istanza principale. Scopri di più sulla configurazione dell'istanza per l'alta disponibilità.

Prima di promuovere una replica di lettura, se l'istanza primaria è ancora disponibile e serve i client, devi procedere nel seguente modo:

  1. Interrompi tutte le scritture nell'istanza primaria.
  2. Controlla lo stato della replica della replica (segui le istruzioni nella scheda Client psql).
  3. Verifica che la replica sia in corso e attendi che il ritardo di replica segnalato dalla metrica replay_lag sia pari a 0.

In caso contrario, in un'istanza appena promossa potrebbero mancare alcune transazioni di cui è stato eseguito il commit nell'istanza principale.

Per promuovere una replica a istanza autonoma:

Console

  1. Nella console Google Cloud , vai alla pagina Istanze Cloud SQL.

    Vai a Istanze Cloud SQL

  2. Seleziona un'istanza di replica facendo clic sul relativo nome.
  3. Fai clic su Promuovi replica.
  4. Fai clic su Ok.

gcloud

gcloud sql instances promote-replica REPLICA_NAME
  

REST v1

Per eseguire questo comando cURL in un prompt della riga di comando, acquisisci un token di accesso utilizzando il comando gcloud auth print-access-token. Puoi anche utilizzare Explorer API nella pagina Istanze:promuovi replica per inviare la richiesta API REST.

Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:

  • project-id: l'ID progetto
  • replica-name: il nome dell'istanza di replica

Metodo HTTP e URL:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/replica-name/promoteReplica

Per inviare la richiesta, espandi una di queste opzioni:

Dovresti ricevere una risposta JSON simile alla seguente:

REST v1beta4

Per eseguire questo comando cURL in un prompt della riga di comando, acquisisci un token di accesso utilizzando il comando gcloud auth print-access-token. Puoi anche utilizzare Explorer API nella pagina Istanze:promuovi replica per inviare la richiesta API REST.

Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:

  • project-id: l'ID progetto
  • replica-name: il nome dell'istanza di replica

Metodo HTTP e URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/replica-name/promoteReplica

Per inviare la richiesta, espandi una di queste opzioni:

Dovresti ricevere una risposta JSON simile alla seguente:

Verifica che l'istanza promossa sia configurata correttamente. In particolare, valuta la possibilità di configurare l'istanza per l'alta disponibilità, se necessario.

Controllare lo stato della replica

Quando visualizzi un'istanza di replica utilizzando la console Google Cloud o accedi all'istanza utilizzando un client di amministrazione, ottieni dettagli sulla replica, inclusi stato e metriche. Quando utilizzi gcloud CLI, ricevi un breve riepilogo della configurazione della replica.

Prima di controllare lo stato della replica per un'istanza di replica Cloud SQL, utilizza il comando
gcloud sql instances describe per visualizzare lo stato dell'istanza. Di conseguenza, puoi vedere se la replica è abilitata per l'istanza di replica.

Per le istanze di replica sono disponibili le seguenti metriche. (Scopri di più sulle metriche aggiuntive disponibili per tutte le istanze, incluse quelle non di replica.)

MetricaDescrizione
Stato di replica
(cloudsql.googleapis.com/database/replication/state)

Indica se la replica sta trasmettendo attivamente i log dalla replica alla primaria. I valori possibili sono:

  • Running
  • Stopped
  • Error

Questa metrica indica Running se:

  1. pg_catalog.pg_stat_wal_receiver segnala un status di "streaming", e
  2. pg_catalog.pg_is_wal_replay_paused() restituisce "f" (false).

Per ulteriori informazioni, consulta le sezioni The Statistics Collector e System Administration Functions nel manuale di riferimento di PostgreSQL.

Ritardo della replica
(cloudsql.googleapis.com/database/replication/replica_lag)

Il tempo di ritardo dello stato della replica rispetto allo stato dell'istanza principale. Si tratta della differenza tra (1) l'ora attuale e (2) il timestamp originale in cui il primario ha eseguito la transazione attualmente applicata alla replica. In particolare, le scritture potrebbero essere conteggiate come in ritardo anche se sono state ricevute dalla replica, se la replica non ha ancora applicato la scrittura al database.

Per le repliche a cascata, ogni coppia primaria-replica viene monitorata separatamente e non esiste una singola metrica che fornisca il ritardo end-to-end (dalla primaria alla replica).

Per ulteriori informazioni, vedi Ritardo di replica.

Byte di ritardo
(cloudsql.googleapis.com/database/postgresql/replication/replica_byte_lag)

Indica il numero di byte di ritardo della replica di lettura rispetto all'istanza principale. Per ogni replica vengono prodotte quattro serie temporali che mostrano il numero di byte nel log write-ahead della primaria che non sono ancora stati…

  • sent_location: … inviato alla replica
  • write_location: …written to disk by the replica
  • flush_location: …scaricato sul disco dalla replica
  • replay_location: …riprodotto dalla replica

Queste metriche hanno scopi diversi. Ad esempio, replay_location fornisce un'indicazione del ritardo di replica (il numero di transazioni di cui è stato eseguito il commit nel database primario e che non sono ancora state applicate alla replica), mentre flush_location fornisce un'indicazione del numero di transazioni che non sono state registrate in modo duraturo nell'istanza di replica.

Queste metriche vengono calcolate confrontando pg_catalog.pg_current_wal_lsn() con uno dei seguenti campi di pg_stat_replication: sent_lsn, write_lsn, flush_lsn o replay_lsn. Per saperne di più, consulta la sezione The Statistics Collector (Il raccoglitore di statistiche) nel manuale di riferimento di PostgreSQL.

Max Lag Bytes
(cloudsql.googleapis.com/database/postgresql/external_sync/max_replica_byte_lag)

Per una replica di un server primario esterno, indica il ritardo di replica massimo (in byte) in tutti i database replicati in questa istanza. Per ogni database, questo valore è definito come il numero di byte nel log write-ahead del database primario che non è stato confermato come ricevuto dalla replica.

Questa metrica viene calcolata inviando una query all'istanza principale per confrontare pg_catalog.pg_current_wal_lsn() con il valore di confirmed_flush_lsn per ogni database replicato in questa istanza di replica. Per saperne di più, consulta la sezione The Statistics Collector (Il raccoglitore di statistiche) nel manuale di riferimento di PostgreSQL.

Per controllare lo stato della replica:

Console

Cloud SQL riporta la metrica Replication State nella dashboard di monitoraggio di Cloud SQL predefinita.

Per visualizzare altre metriche per le repliche nella regione e tra regioni e per le repliche di server esterni, crea una dashboard personalizzata e aggiungi le metriche che vuoi monitorare:

  1. Nella console Google Cloud , vai alla pagina Monitoring.

    Vai a Monitoring

  2. Seleziona la scheda Dashboard.
  3. Fai clic su Crea dashboard.
  4. Assegna un nome alla dashboard e fai clic su OK.
  5. Fai clic su Aggiungi grafico.
  6. Per Tipo di risorsa, seleziona Database Cloud SQL.
  7. Esegui una delle seguenti operazioni:
    1. Per monitorare la metrica dello stato di replica: nel campo Seleziona una metrica, digita Replication state. Poi aggiungi un filtro per state = "Running". Il grafico mostra 1 se la replica è in esecuzione e 0 in caso contrario.
    2. Per monitorare il ritardo di replica, in byte, per una replica di lettura: nel campo Seleziona una metrica, digita Lag Bytes. Poi aggiungi un filtro su replica_lag_type = "replay_location". Il grafico mostra il numero di byte associati alle transazioni di cui è stato eseguito il commit sul database primario, ma che non sono ancora state riprodotte sulla replica.
    3. Per monitorare il ritardo di replica, in byte, per una replica di un primario esterno: nel campo Seleziona una metrica, digita Max Lag Bytes. Il grafico mostra il numero di byte associati alle transazioni di cui è stato eseguito il commit sul database primario, ma di cui la replica non ha ancora confermato la ricezione.

gcloud

Per un'istanza replica, controlla lo stato della replica con:

gcloud sql instances describe REPLICA_NAME

Nell'output, cerca le proprietà databaseReplicationEnabled e masterInstanceName.

Per un'istanza principale, controlla se esistono repliche con:

gcloud sql instances describe PRIMARY_INSTANCE_NAME

Nell'output, cerca la proprietà replicaNames.

Client psql

Alcune metriche di stato della replica sono prodotte dall'istanza principale, mentre altre dalla replica. Per i passaggi successivi, connettiti alla replica o all'istanza primaria (come indicato di seguito) con un client PostgreSQL.

Per informazioni, vedi Opzioni di connessione per applicazioni esterne.

  1. Per controllare lo stato della replica dall'istanza principale:
    select * from pg_stat_replication;
    Cerca le seguenti metriche nell'output del comando:
    • client_addr: l'indirizzo IP dell'istanza di replica.
    • state: indica se il thread SQL per l'esecuzione degli eventi nel log di inoltro è in esecuzione. Il valore è streaming quando viene avviata la replica.
    • replay_lag: il numero di byte di ritardo del thread SQL di replica rispetto all'istanza principale. Il valore è O o un numero ridotto di byte.
  2. Per controllare lo stato della replica dall'istanza replica:
    select * from pg_stat_wal_receiver;

    Cerca le seguenti metriche nell'output del comando:

    • sender_host: L'indirizzo IP dell'istanza principale.
    • status: indica se il thread SQL per l'esecuzione degli eventi nel log di inoltro è in esecuzione. Il valore è streaming quando viene avviata la replica.
    • last_msg_send_time e last_msg_receipt_time: la differenza tra questi due timestamp è il tempo di attesa.

    Per verificare se la replica è stata sospesa:

    select pg_is_wal_replay_paused();

    Il valore è t se la replica è sospesa e f altrimenti.

    Per verificare se sono presenti transazioni ricevute dal cluster primario ma non ancora applicate:

    # for PostgreSQL 9.6
    select pg_catalog.pg_last_xlog_receive_location(), pg_catalog.pg_last_xlog_replay_location();
    # for PostgreSQL 10 and above
    select pg_catalog.pg_last_wal_receive_lsn(), pg_catalog.pg_last_wal_replay_lsn();

    Se i due valori sono uguali, la replica ha elaborato tutte le transazioni ricevute dal database primario.

  • Per maggiori dettagli sull'output di questi comandi, consulta la documentazione di PostgreSQL su The Statistics Collector.
  • Risoluzione dei problemi

    Problema Risoluzione dei problemi
    La replica di lettura non ha iniziato la replica al momento della creazione. Probabilmente nei file di log è presente un errore più specifico. Ispeziona i log in Cloud Logging per trovare l'errore effettivo.
    Impossibile creare la replica di lettura - errore invalidFlagValue. Uno dei flag nella richiesta non è valido. Potrebbe trattarsi di un flag che hai fornito esplicitamente o di uno impostato su un valore predefinito.

    Innanzitutto, verifica che il valore del flag max_connections sia maggiore o uguale al valore dell'istanza principale.

    Se il flag max_connections è impostato correttamente, esamina i log in Cloud Logging per trovare l'errore effettivo.

    Impossibile creare la replica di lettura. Errore sconosciuto. Probabilmente nei file di log è presente un errore più specifico. Ispeziona i log in Cloud Logging per trovare l'errore effettivo.

    Se l'errore è: set Service Networking service account as servicenetworking.serviceAgent role on consumer project, disattiva e riattiva Service Networking API. Questa azione crea il account di servizio necessario per continuare la procedura.

    Lo spazio sul disco è esaurito. La dimensione del disco dell'istanza principale può esaurirsi durante la creazione della replica. Modifica l'istanza principale per eseguire l'upgrade a una dimensione del disco maggiore.
    Lo spazio su disco aumenta in modo significativo. Uno slot non utilizzato attivamente per il monitoraggio dei dati fa sì che PostgreSQL mantenga i segmenti WAL indefinitamente, causando una crescita indefinita dello spazio su disco. Se utilizzi le funzionalità di replica e decodifica logiche in Cloud SQL, gli slot di replica vengono creati ed eliminati automaticamente. Gli slot di replica inutilizzati possono essere rilevati eseguendo query sulla visualizzazione di sistema pg_replication_slots e filtrando in base alla colonna active. Gli slot inutilizzati possono essere eliminati per rimuovere i segmenti WAL utilizzando il comando pg_drop_replication_slot.
    L'istanza di replica utilizza troppa memoria. La replica utilizza la memoria temporanea per memorizzare nella cache le operazioni di lettura richieste di frequente, il che può portare a un utilizzo di memoria superiore rispetto all'istanza principale.

    Riavvia l'istanza di replica per recuperare lo spazio di memoria temporaneo.

    La replica è stata interrotta. È stato raggiunto il limite massimo di spazio di archiviazione e l'aumento automatico dello spazio di archiviazione non è abilitato.

    Modifica l'istanza per abilitare automatic storage increase.

    Il ritardo di replica è costantemente elevato. Il carico di scrittura è troppo elevato per la replica. Il ritardo di replica si verifica quando il thread SQL su una replica non riesce a tenere il passo con il thread I/O. Alcuni tipi di query o carichi di lavoro possono causare un ritardo di replica elevato temporaneo o permanente per un determinato schema. Alcune delle cause tipiche del ritardo della replica sono:
    • Query lente sulla replica. Trova e correggi gli errori.
    • Tutte le tabelle devono avere una chiave univoca/primaria. Ogni aggiornamento di una tabella senza una chiave univoca/primaria causa scansioni complete della tabella sulla replica.
    • Query come DELETE ... WHERE field < 50000000 causano un ritardo della replica con la replica basata su righe, poiché un numero elevato di aggiornamenti si accumula nella replica.

    Alcune possibili soluzioni includono:

    • Modifica l'istanza per aumentare le dimensioni della replica.
    • Riduci il carico sul database.
    • Invia il traffico di lettura alla replica di lettura.
    • Indica le tabelle.
    • Identifica e correggi le query di scrittura lente.
    • Ricrea la replica.
    Errori durante la rigenerazione degli indici in PostgreSQL 9.6. Ricevi un errore da PostgreSQL che ti informa che devi ricompilare un indice specifico. Questa operazione può essere eseguita solo sull'istanza principale. Se crei una nuova istanza di replica, l'errore si ripresenterà a breve. Gli indici hash non vengono propagati alle repliche nelle versioni di PostgreSQL precedenti alla 10.

    Se devi utilizzare gli indici hash, esegui l'upgrade a PostgreSQL 10 o versioni successive. Altrimenti, se vuoi utilizzare anche le repliche, non utilizzare gli indici hash in PostgreSQL 9.6.

    La query sull'istanza principale è sempre in esecuzione. Dopo aver creato una replica, è previsto che la query SELECT * from pg_stat_activity where state = 'active' and pid = XXXX and username = 'cloudsqlreplica' venga eseguita continuamente sull'istanza principale.
    La creazione della replica non riesce a causa del timeout. Le transazioni non sottoposte a commit a esecuzione prolungata sull'istanza principale possono causare la mancata creazione della replica di lettura.

    Ricrea la replica dopo aver interrotto tutte le query in esecuzione.

    Se l'istanza primaria e la replica hanno dimensioni vCPU diverse, potrebbero verificarsi problemi di prestazioni delle query perché l'ottimizzatore di query tiene conto delle dimensioni vCPU.

    Per risolvere il problema, completa i seguenti passaggi:

    1. Attiva il flag log_duration e imposta il parametro log_statement su ddl. In questo modo, vengono forniti sia le query sia il tempo di esecuzione sul database. Tuttavia, a seconda del carico di lavoro, ciò potrebbe causare problemi di prestazioni.
    2. Sia sull'istanza principale che sulla replica di lettura, esegui explain analyze per le query.
    3. Confronta il piano di query e verifica la presenza di differenze.

    Se si tratta di una query specifica, modificala. Ad esempio, puoi modificare l'ordine dei join per verificare se ottieni un rendimento migliore.

    Passaggi successivi