Gestione delle repliche di lettura

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

Per ulteriori informazioni sul funzionamento della replica, consulta Replica in Cloud SQL.

Disabilita replica

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

La disabilitazione della replica non arresta l'istanza di replica, che diventa un'istanza di sola lettura che non è più replicata dalla sua istanza principale. Continuerai a ricevere addebiti per l'istanza. Nella replica disabilitata, puoi riattivarla, eliminarla o promuoverla su un'istanza autonoma.

Per disabilitare 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 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 al 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, effettua 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 al 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, effettua 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 è in fase di replica da molto tempo, impiegherà più tempo per raggiungere l'istanza principale. In questo caso, elimina la replica e creane una nuova.

Per abilitare 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 nome.
  3. Fai clic su Abilita la replica.
  4. Fai clic su Ok.

gcloud

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

REST v1

Per eseguire questo comando cURL al 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, effettua 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 al 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, effettua 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:

Promuovi una replica

La promozione di una replica di lettura interrompe la replica e converte l'istanza in un'istanza principale di Cloud SQL autonoma con funzionalità di lettura e scrittura.

Se 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 come per un'istanza principale. Scopri di più sulla configurazione dell'istanza per l'alta disponibilità.

Prima di promuovere una replica di lettura, se quella principale è ancora disponibile e gestisce i client, devi:

  1. Arresta tutte le scritture nell'istanza principale.
  2. Controlla lo stato di replica della replica (segui le istruzioni nella scheda psql Client).
  3. Verifica che la replica sia in fase di replica, quindi attendi che il ritardo di replica riportato dalla metrica replay_lag sia pari a 0.

In caso contrario, un'istanza appena promossa potrebbe non disporre di alcune transazioni impegnate nell'istanza principale.

Per promuovere una replica a un'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 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 al 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:promoteReplica per inviare la richiesta API REST.

Prima di utilizzare i dati della richiesta, effettua 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 al 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:promoteReplica per inviare la richiesta API REST.

Prima di utilizzare i dati della richiesta, effettua 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 sponsorizzata sia configurata correttamente. In particolare, se necessario, valuta la possibilità di configurare l'istanza per l'alta disponibilità.

Controlla 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, tra cui stato e metriche. Quando utilizzi gcloud CLI, ottieni un breve riepilogo della configurazione della replica.

Prima di controllare lo stato della replica di un'istanza di replica Cloud SQL, utilizza il comando
gcloud sql instances describe per visualizzare lo stato dell'istanza. Di conseguenza, puoi verificare 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 trasmette attivamente un flusso di log dall'istanza principale alla replica. I valori possibili sono:

  • Running
  • Stopped
  • Error

Questa metrica registra Running se:

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

Per maggiori informazioni, consulta Il raccoglitore Statistics e le Funzioni di amministrazione di sistema nel Manuale di riferimento di PostgreSQL.

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

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

Per le repliche a cascata, ogni coppia di replica principale viene monitorata separatamente e non esiste un'unica metrica che restituisce il ritardo end-to-end (da quello principale a quello di replica).

Per ulteriori informazioni, consulta Tempo di replica.

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

Segnala il numero di byte in base ai quali la replica di lettura è in ritardo rispetto all'unità principale. Per ogni replica vengono prodotte quattro serie temporali, che mostrano il numero di byte nel log write-ahead dell'unità primaria che non sono ancora stati...

  • sent_location: ...inviato alla replica
  • write_location: ...scritto su disco dalla replica
  • flush_location: ... svuotato su 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 impegnate nell'istanza principale 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 sull'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 maggiori informazioni, consulta Il raccoglitore di statistiche nel Manuale di riferimento di PostgreSQL.

Byte max in ritardo
(cloudsql.googleapis.com/database/postgresql/external_sync/max_replica_byte_lag)

Per una replica di un'istanza principale esterna, segnala il ritardo di replica massimo (in byte) su tutti i database che vengono replicati in questa istanza. Per ogni database, questo valore è definito come il numero di byte nel log write-ahead dell'unità primaria di cui la replica non ha confermato la ricezione.

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 maggiori informazioni, consulta Il raccoglitore di statistiche nel Manuale di riferimento di PostgreSQL.

Per controllare lo stato della replica:

Console

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

Per visualizzare altre metriche per le repliche all'interno di una o più 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. In 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. Quindi, aggiungi un filtro per state = "Running". Il grafico mostra 1 se la replica è in esecuzione e 0 negli altri casi.
    2. Per monitorare il ritardo di replica, in byte, per una replica di lettura: nel campo Seleziona una metrica, digita Lag Bytes. Quindi, 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 nell'istanza principale, ma che non sono ancora stati riprodotti nella replica.
    3. Per monitorare il ritardo di replica, in byte, per una replica di un'istanza principale esterna: 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 sull'istanza principale, ma di cui la replica non ha ancora confermato la ricezione.

gcloud

Per un'istanza di 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

Cerca la proprietà replicaNames nell'output.

Client psql

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

Per informazioni, consulta Opzioni di connessione per le 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 di eventi nel log di inoltro è in esecuzione. Il valore è streaming quando viene avviata la replica.
    • replay_lag: il numero di byte del thread SQL di replica dietro l'istanza principale. Il valore è O o un numero ridotto di byte.
  2. Per controllare lo stato della replica dall'istanza di 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 di 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 messa in pausa:

    select pg_is_wal_replay_paused();

    Il valore è t se la replica è in pausa e f in caso contrario.

    Per verificare se sono state ricevute transazioni dall'account principale, 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 dall'istanza principale.

  • Per maggiori dettagli sull'output da questi comandi, consulta la documentazione di PostgreSQL sul raccoglitore di statistiche.
  • Risolvere i problemi

    Problema Risoluzione dei problemi
    La replica di lettura non ha avviato la replica al momento della creazione. È probabile che i file di log contengano un errore più specifico. Ispeziona i log in Cloud Logging per trovare l'errore effettivo.
    Impossibile creare la replica di lettura: errore non validoFlagValue. Uno dei flag nella richiesta non è valido. Potrebbe essere un flag che hai fornito esplicitamente o un flag impostato su un valore predefinito.

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

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

    Impossibile creare la replica di lettura: errore sconosciuto. È probabile che i file di log contengano 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 l'account di servizio necessario per continuare il processo.

    Lo spazio sul disco è esaurito. La dimensione del disco dell'istanza principale può diventare piena durante la creazione della replica. Modifica l'istanza principale per eseguirne l'upgrade a una dimensione del disco più grande.
    Lo spazio su disco aumenta in modo significativo. Uno slot che non viene utilizzato attivamente per monitorare i dati fa sì che PostgreSQL trattiene i segmenti WAL per un tempo indeterminato, causando un'aumento infinito dello spazio su disco. Se utilizzi le funzionalità di replica e decodifica logica in Cloud SQL, gli slot di replica vengono creati e eliminati automaticamente. Per rilevare gli slot di replica inutilizzati, puoi eseguire una query sulla visualizzazione di sistema di pg_replication_slots e applicare un filtro sulla 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 più richieste, il che può portare a utilizzare più memoria rispetto all'istanza principale.

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

    Replica 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 della replica è costantemente elevato. Il carico di scrittura è troppo elevato per essere gestito dalla replica. Il ritardo della replica si verifica quando il thread SQL su una replica non è in grado di stare al passo con il thread di IO. 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 più comuni del ritardo di replica sono:
    • Query lente sulla replica. Trovale e correggile.
    • Tutte le tabelle devono avere una chiave univoca/primaria. Ogni aggiornamento in una tabella di questo tipo senza una chiave univoca/principale causa scansioni complete della tabella sulla replica.
    • Le query come DELETE ... WHERE field < 50000000 causano un ritardo di replica con la replica basata su righe, poiché un numero enorme di aggiornamenti è accumulato sulla replica.

    Ecco alcune possibili soluzioni:

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

    Se devi utilizzare gli indici hash, esegui l'upgrade a PostgreSQL 10 e 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, la query SELECT * from pg_stat_activity where state = 'active' and pid = XXXX and username = 'cloudsqlreplica' dovrebbe essere eseguita continuamente sull'istanza principale.
    La creazione della replica non riesce a causa del timeout. Le transazioni non impegnate a lunga esecuzione nell'istanza principale possono causare la mancata creazione della replica di lettura.

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

    Passaggi successivi