Questa pagina descrive come risolvere e correggere il ritardo di replica per le repliche di lettura Cloud SQL.
Panoramica
Le repliche di lettura Cloud SQL utilizzano la replica basata su riga di MySQL utilizzando gli identificatori di transazione globali (GTID). Le modifiche vengono scritte nel log binario dell'istanza principale e inviate alla replica, dove vengono ricevute e poi applicate al database.Il ritardo della replica può verificarsi in alcuni scenari, ad esempio:
- L'istanza principale non riesce a inviare le modifiche alla replica abbastanza velocemente.
- La replica non riesce a ricevere le modifiche abbastanza rapidamente.
- La replica non riesce ad applicare le modifiche abbastanza rapidamente.
network_lag
per monitorare i primi due scenari quando
l'istanza principale non riesce a inviare le modifiche abbastanza velocemente o la replica non riesce a riceverle
abbastanza rapidamente.
Il ritardo totale viene osservato con la metrica replica_lag
.
La differenza tra replica_lag
e network_lag
può indicare
il terzo motivo per cui la replica non può applicare le modifiche di replica abbastanza rapidamente.
Queste metriche sono descritte nella sezione Monitorare il ritardo di replica
di seguito.
Configurazione più rapida della replica
Esistono due modi per fare in modo che una replica MySQL applichi le modifiche più rapidamente. Gli utenti possono configurare le repliche con le seguenti opzioni:
- Replica parallela
- Scarico ad alte prestazioni
Replica parallela
La replica parallela può contribuire a ridurre il ritardo della replica configurando la replica in modo che utilizzi più thread che agiscono in parallelo per applicare le modifiche alla replica. Per informazioni sull'utilizzo della replica parallela, consulta Configurazione della replica parallela.
Scarico ad alte prestazioni
Per impostazione predefinita, Cloud SQL per MySQL scarica i log di ripristino su disco dopo ogni transazione. Lo scaricamento ad alte prestazioni riduce la frequenza con cui i log di ripetizione vengono scaricati sul disco a una volta al secondo, il che migliora le prestazioni di scrittura.
Imposta il flag innodb_flush_log_at_trx_commit
sulla replica di lettura su 2. Devi anche impostare il flag sync_binlog
su un valore
superiore affinché il flag innodb_flush_log_at_trx_commit
sia efficace.
Per ulteriori informazioni su questo flag, consulta Suggerimenti per l'utilizzo dei flag.
Quando il flag innodb_flush_log_at_trx_commit è impostato sulla replica di lettura e Cloud SQL rileva che potrebbe essersi verificato un arresto anomalo, Cloud SQL ricrea automaticamente la replica.
Ottimizzare query e schema
Questa sezione suggerisce alcune ottimizzazioni comuni di query e schemi che puoi apportare per migliorare le prestazioni della replica.
Livello di isolamento delle query nella replica di lettura
I livelli di isolamento delle transazioni REPEATABLE READ
e SERIALIZABLE
acquisiscono blocchi che potrebbero impedire le modifiche di replica. Valuta la possibilità di ridurre
il livello di isolamento per le query nella replica. Il livello di isolamento delle transazioni READ COMMITTED
potrebbe avere un rendimento migliore.
Transazioni a lunga esecuzione nel database principale
Se un numero elevato di righe viene aggiornato in una singola transazione, può causare un picco improvviso nel numero di modifiche che devono essere applicate all'istanza principale e poi inviate alla replica. Ciò vale per gli aggiornamenti o le eliminazioni di una sola istruzione che interessano molte righe contemporaneamente. Le modifiche vengono inviate alla replica dopo il commit. L'applicazione di un picco improvviso di modifiche nella replica può aumentare la possibilità di contesa dei blocchi nella replica se anche il carico di query nella replica è elevato, causando un ritardo nella replica.
Valuta la possibilità di suddividere le transazioni di grandi dimensioni in più transazioni più piccole.
Chiavi primarie mancanti
Le repliche di lettura Cloud SQL utilizzano la replica basata su riga, che ha un rendimento scarso se le tabelle MySQL replicate non hanno chiavi primarie. Ti consigliamo di fare in modo che tutte le tabelle replicate abbiano chiavi primarie.
Per MySQL 8 o versioni successive, ti consigliamo di impostare il flag
sql_require_primary_key
su ON
per richiedere che le tabelle del database abbiano chiavi primarie.
Blocchi esclusivi dovuti al DDL
I comandi Data Definition Language (DDL), come ALTER TABLE
e
CREATE INDEX
, possono causare un ritardo della replica nella replica a causa di
blocchi esclusivi. Per evitare conflitti di blocco, valuta la possibilità di pianificare l'esecuzione di DDL
durante i periodi in cui il carico di query è inferiore sulle repliche.
Replica sovraccarica
Se una replica di lettura riceve troppe query, la replica potrebbe essere bloccata. Valuta la possibilità di dividere le letture tra più repliche per ridurre il carico su ciascuna.
Per evitare picchi di query, valuta la possibilità di limitare le query di lettura delle repliche nella logica dell'applicazione o in un livello proxy, se ne utilizzi uno.
Se si verificano picchi di attività nell'istanza principale, valuta la possibilità di distribuire gli aggiornamenti.
Database primario monolitico
Valuta la possibilità di partizionare verticalmente (o orizzontalmente) il database principale per evitare che una o più tabelle in ritardo blocchino tutte le altre tabelle.
Monitorare il ritardo della replica
Puoi utilizzare le metriche replica_lag
e network_lag
per monitorare il ritardo
della replica e identificare se la causa del ritardo si trova nel database primario,
nella rete o nella replica.
Metrica | Descrizione |
---|---|
Ritardo della replica ( cloudsql.googleapis.com ) |
Il numero di secondi di ritardo dello stato della replica rispetto allo stato dell'istanza principale. Si tratta della differenza tra l'ora attuale e il timestamp originale in cui il database principale ha eseguito il commit della transazione attualmente in fase di applicazione sulla 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. Questa metrica indica il valore di |
Ultimo numero di errori del thread I/O ( cloudsql.googleapis.com ) |
Indica l'ultimo errore che ha causato l'interruzione del thread I/O. Se questo valore è diverso da zero,
la replica è interrotta. È un caso raro, ma potrebbe verificarsi. Controlla la
documentazione di MySQL per capire cosa indica il codice di errore. Ad esempio, i file binlog nell'istanza primaria potrebbero essere stati eliminati prima che la replica li ricevesse.
Cloud SQL di solito ricrea automaticamente la replica se la replica è interrotta.
Questa metrica |
Ultimo numero di errore del thread SQL ( cloudsql.googleapis.com ) |
Indica l'ultimo errore che ha causato l'interruzione del thread SQL. Se questo valore è diverso da zero,
la replica è interrotta. È un caso raro, ma potrebbe verificarsi. Controlla la
documentazione di MySQL per capire cosa indica il codice di errore.
Cloud SQL di solito ricrea automaticamente la replica se la replica è interrotta.
Questa metrica |
Ritardo di rete ( cloudsql.googleapis.com ) |
Il tempo, in secondi, necessario per scrivere il binlog nel database principale e raggiungere il thread I/O nella replica. Se |
Verifica la replica
Per verificare che la replica funzioni, esegui questa istruzione sulla replica:
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Queueing master event to the relay log
Master_Host: xx.xxx.xxx.xxx
Master_User: cloudsqlreplica
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.199927
Read_Master_Log_Pos: 83711956
Relay_Log_File: relay-log.000025
Relay_Log_Pos: 24214376
Relay_Master_Log_File: mysql-bin.199898
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 24214163
Relay_Log_Space: 3128686571
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Yes
Master_SSL_CA_File: master_server_ca.pem
Master_SSL_CA_Path: /mysql/datadir
Master_SSL_Cert: replica_cert.pem
Master_SSL_Cipher:
Master_SSL_Key: replica_pkey.pem
Seconds_Behind_Master: 2627
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 321071839
Master_UUID: 437d04e9-8456-11e8-b13d-42010a80027b
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: System lock
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 437d04e9-8456-11e8-b13d-42010a80027b:52111095710-52120776390
Executed_Gtid_Set: 437d04e9-8456-11e8-b13d-42010a80027b:1-52113039508
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
Se la replica è in corso, la prima colonna, Slave_IO_State
, mostra Waiting
for master to send event
o un messaggio simile. Inoltre, il campo Last_IO_Error
è vuoto.
Se la replica non viene eseguita, la colonna Slave_IO_State
mostra lo stato
Connecting to master
e la colonna Last_IO_Error
mostra lo stato
error connecting to master cloudsqlreplica@x.x.x.x:3306
.
Secondo la documentazione di MySQL, alcuni altri campi interessanti relativi al ritardo di replica includono i seguenti:
Campo | Descrizione |
---|---|
Master_Log_File |
Il nome del file di log binario di origine da cui il thread I/O sta attualmente leggendo. |
Read_Master_Log_Pos |
La posizione nel file di log binario di origine corrente fino alla quale è stato letto il thread I/O. |
Relay_Log_File |
Il nome del file di log di relay da cui il thread SQL sta attualmente leggendo ed eseguendo. |
Relay_Log_Pos |
La posizione nel file di log di relay corrente che il thread SQL ha letto ed eseguito. |
Relay_Master_Log_File |
Il nome del file di log binario di origine contenente l'evento più recente eseguito dal thread SQL. |
Nell'esempio precedente, Relay_Master_Log_File
ha il valore mysql-bin.199898
.
Master_Log_File
ha il valore mysql-bin.199927
. Il suffisso numerico 199898 è
inferiore a 199927. Ciò significa che, anche se la replica ha ricevuto un file di log mysql-bin.199927
più recente, sta ancora applicando il file mysql-bin.199898
precedente.
In questo caso, il thread SQL è in ritardo nella replica.
Puoi anche connetterti al database principale ed eseguire:
SHOW MASTER STATUS;
Questo comando mostra il file binlog in cui vengono scritti i dati nel database primario.
Se il file di log binario del database principale è più recente di Master_Log_File
nella replica, significa che il thread I/O è in ritardo. La replica sta ancora leggendo un file
di log binario precedente dal database principale.
Quando il thread I/O è in ritardo, anche la metrica network_lag
è elevata. Quando il thread SQL
è in ritardo, ma il thread I/O non lo è, la metrica network_lag
non è elevata, ma
replica_lag
è elevata.
I comandi precedenti consentono di osservare i dettagli del ritardo mentre si verifica,
ma le metriche network_lag
e replica_lag
offrono un modo per
esaminare le occorrenze passate del ritardo.
Ricrea replica in ritardo
Ricrea una replica in ritardo quando la replica è in ritardo di un periodo di tempo accettabile.
Con Cloud SQL, puoi configurare la replica di lettura in modo che si ricrei se la replica è in ritardo oltre un periodo di tempo accettabile,e il ritardo persiste per almeno cinque minuti.
Se definisci un ritardo di replica accettabile inferiore a 360 secondi (sei minuti) e un ritardo di replica di almeno 361 secondi persiste per più di cinque minuti, dopo cinque minuti l'istanza primaria crea un nuovo snapshot di se stessa e la replica di lettura viene ricreata utilizzando questo snapshot.
La ricreazione di una replica di lettura in ritardo offre i seguenti vantaggi:
- Controlli ciò che viene considerato un intervallo accettabile per il ritardo di replica.
- Puoi ridurre il tempo dedicato alla risoluzione dei problemi relativi al ritardo di replica di ore o addirittura giorni.
Si applicano ulteriori dettagli sulle funzionalità:
- Compatibile con le seguenti versioni:
- MySQL 5.7
- MySQL 8.0
- MySQL 8.4
- È necessario definire un intervallo accettabile per il ritardo di replica in secondi.
- Il valore minimo accettabile è 300 secondi o 5 minuti.
- Il valore massimo accettabile è 31.536.000 secondi o un anno.
- Se attivi la ricreazione della replica in ritardo per un'istanza, ma non imposti il ritardo di replica massimo accettabile, Cloud SQL utilizza il valore predefinito di un anno.
- Tipi di istanze supportati:
- Replica in lettura
- Replica di lettura tra regioni
- Replica a cascata
- Il valore impostato per il campo
replicationLagMaxSeconds
è specifico per ogni istanza di replica. Se un'istanza primaria ha più istanze di replica, puoi impostare ogni replica con un valore diverso. - Quando viene ricreata una replica, gli utenti possono aspettarsi un periodo di inattività mentre vengono completate le seguenti operazioni:
- La replica è stata interrotta.
- La replica è stata eliminata.
- Viene creato uno snapshot dell'istanza principale.
- La replica viene ricreata da questo ultimo snapshot. La nuova replica utilizza lo stesso nome e lo stesso indirizzo IP della precedente. Di conseguenza, MySQL deve arrestarsi e riavviarsi.
- La nuova replica inizia a replicare i dati.
replicationLagMaxSeconds
è un campo a livello di istanza. Ogni istanza ha il proprio valore.Se hai più repliche di lettura per la stessa istanza principale, puoi impostare un valore univoco per il campo
replicationLagMaxSeconds
per ogni replica.Definire soglie di tempo diverse per repliche diverse può aiutarti a evitare uno scenario in cui tutte le repliche si interrompono contemporaneamente.
Abilita ricreazione della replica in ritardo
La funzionalità di ricreazione della replica in ritardo è disattivata per impostazione predefinita. Per abilitarlo quando crei un'istanza, utilizza uno dei seguenti metodi:
gcloud
Utilizza il comando gcloud sql instances create
per creare una nuova istanza di replica di lettura con il flag
--replication-lag-max-seconds-for-recreate
:
gcloud beta sql instances create REPLICA_INSTANCE_NAME \ --master-instance-name=PRIMARY_INSTANCE_NAME \ --database-version=DATABASE_VERSION \ --tier=TIER \ --edition=EDITION \ --region=REGION \ --root-password=PASSWORD \ --replication-lag-max-seconds-for-recreate=REPLICATION_LAG_MAX_SECONDS
Dove:
REPLICA_INSTANCE_NAME
è il nome dell'istanza replica.PRIMARY_INSTANCE_NAME
è il nome dell'istanza principale.DATABASE_VERSION
è la versione del database dell'istanza. Ad esempio,MYSQL_8_0_31
.TIER
è il tipo di macchina che vuoi utilizzare per l'istanza di replica. Ad esempio,db-perf-optimized-N-4
. Per ulteriori informazioni, consulta Configurazioni personalizzate delle istanze.EDITION
è la versione che vuoi utilizzare per l'istanza di replica. Ad esempio,ENTERPRISE_PLUS
. Per saperne di più, vedi Creare un'istanza.REGION
è la regione che vuoi utilizzare per l'istanza di replica. Ad esempio,us-central1
.PASSWORD
è la password root per l'istanza.REPLICATION_LAG_MAX_SECONDS
è il ritardo o il ritardo di replica massimo accettabile in secondi. Ad esempio,600
. Il valore minimo accettabile è 300 secondi o 5 minuti. Il valore massimo accettabile è 31.536.000 secondi o un anno.
API REST
Il campo replicationLagMaxSeconds
si trova nella risorsa DatabaseInstance
. Aggiungi questo campo al corpo della richiesta:
{ "settings": { "replicationLagMaxSeconds" :REPLICATION_LAG_MAX_SECONDS, } ... }
Dove:
REPLICATION_LAG_MAX_SECONDS
è il ritardo o il ritardo di replica massimo accettabile in secondi. Ad esempio,600
.
Aggiorna il periodo di ricreazione per il ritardo di replica
Per visualizzare le impostazioni di un'istanza, utilizza uno dei metodi descritti in Visualizzare le informazioni di riepilogo dell'istanza.
Con queste informazioni, puoi scegliere se aggiornare o meno l'intervallo di tempo di ritardo della replica che hai specificato come accettabile prima che la replica venga ricreata.
gcloud
Utilizza il comando gcloud sql instances patch
per aggiornare il periodo di tempo per la ricreazione dell'istanza in base
al ritardo di replica:
gcloud beta sql instances patch INSTANCE_NAME \ --replication-lag-max-seconds-for-recreate=REPLICATION_LAG_MAX_SECONDS
Dove:
INSTANCE_NAME
è il nome dell'istanza.REPLICATION_LAG_MAX_SECONDS
è il ritardo o il ritardo di replica massimo accettabile in secondi. Ad esempio,700
. Se vuoi ripristinare il valore predefinito di un anno, inserisci31536000
. Il valore minimo accettabile è 300 secondi o 5 minuti. Il valore massimo accettabile è 31.536.000 secondi o un anno.
API REST
Il criterio può essere aggiornato utilizzando instances.patch
e instance.insert
.
Per vedere un esempio di come aggiornare l'impostazione utilizzando l'API REST, consulta Modificare un'istanza.
Limitazioni
Si applicano le seguenti limitazioni alla ricreazione delle repliche in ritardo:
- I valori per
replicationLagMaxSeconds
possono essere impostati solo in secondi. - Gli indici creati sulla replica di lettura prima di un'operazione di ricreazione non verranno mantenuti. Se esiste un indice, crea un indice secondario dopo la ricreazione della replica.
- Per evitare tempi di inattività frequenti sulle repliche di lettura, le ricreazioni sono limitate a una al giorno per istanza.
- Le repliche di server esterni non sono supportate con questa funzionalità.
- Se abiliti la ricreazione delle repliche in ritardo in una replica a cascata, Cloud SQL ricrea prima le repliche foglia per mantenere la coerenza della replica.
- La ricreazione di una replica tra regioni comporta un costo aggiuntivo.
- Non puoi attivare la ricreazione delle repliche in ritardo nella console Google Cloud .