Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Risoluzione dei problemi relativi al ritardo di replica dei log binari per Aurora MySQL
Questa sezione fornisce indicazioni sul ritardo di replica dei log binari per Aurora MySQL configurata come replica di log binario. Copre l'architettura di replica, la replica parallela, il monitoraggio delle dipendenze, il monitoraggio e le migliori pratiche di configurazione.
La replica binaria dei log replica i dati tra database. MySQL-compatible La replica del log binario trattata in questa sezione è asincrona: l'origine non attende che le repliche confermino l'applicazione delle modifiche prima di eseguire il commit delle transazioni. Ciò non si applica alla replica semisincrona. Nella replica semisincrona, l'origine attende che almeno una replica confermi la ricezione della transazione prima di effettuare il commit. Ad esempio, i cluster Multi-AZ DB per Amazon RDS for MySQL utilizzano la replica semisincrona, che non rientra nell'ambito di questa sezione. La replica mantiene una connessione persistente all'origine tramite il I/O thread per trasmettere continuamente eventi di log binari. Questa sezione si applica a tutte le topologie di replica binlog in cui Aurora MySQL è la replica. L'origine può essere un altro cluster Aurora MySQL, Amazon RDS per MySQL, MySQL locale o MySQL su Amazon EC2. Questa sezione si applica anche quando Aurora MySQL è l'origine che si replica su qualsiasi destinazione. MySQL-compatible
Nota
Per i casi d'uso della replica interregionale, considera l'utilizzo Utilizzo di Database globale Amazon Aurora come alternativa alla replica basata su log binari. Aurora Global Database utilizza un'infrastruttura dedicata per la replica, che offre una latenza inferiore e richiede una gestione operativa inferiore rispetto alla replica binaria dei log tra le regioni.
Stai riscontrando un picco di lag in questo momento? Salta il materiale di base e inizia con Identificazione del collo di bottiglia del ritardo di replica per determinare se il collo di bottiglia è il I/O thread o il thread SQL, quindi segui il link per quello scenario: o. Risoluzione dei problemi relativi I/O al ritardo del thread Risoluzione dei problemi relativi al ritardo dei thread SQL
Argomenti
Architettura di replica MySQL
La replica MySQL è implementata tramite thread specializzati:
-
Thread di dump del log binario (sorgente): creato quando una replica si connette. Invia il contenuto del log binario alla replica. Visibile nel
SHOW PROCESSLISTthread «Binlog Dump». -
I/O Thread di replica (replica): si connette all'origine e richiede gli aggiornamenti del registro binario. Li scrive nel log di inoltro della replica. Sempre un singolo thread per canale di replica indipendentemente dalla configurazione di replica multithread (MTR).
-
Thread SQL di replica (replica): legge il log di inoltro e applica le transazioni. L'applicatore è sempre costituito da un thread coordinatore che legge le transazioni dal log di inoltro, più N thread di lavoro che le applicano, dove N è il valore di.
replica_parallel_workersConreplica_parallel_workers=1, il singolo lavoratore applica le transazioni in sequenza. Conreplica_parallel_workers >= 2, il coordinatore assegna transazioni indipendenti a più thread di lavoro per l'applicazione parallela.Nota
L'impostazione
replica_parallel_workers=0è obsoleta a partire da MySQL 8.0.30 ed è soggetta a rimozione in una futura versione di MySQL. Usa invece per apply a thread singolo.replica_parallel_workers=1
Il processo di replica funziona come segue:
L'origine esegue istruzioni DML, DCL o DDL.
Al momento del commit, l'origine scrive i dati nel log binario.
Il I/O thread sulla replica recupera gli eventi e li scrive nel log di inoltro.
Il thread SQL applica le modifiche dal log di inoltro (a thread singolo o multithread).
Identificazione del collo di bottiglia del ritardo di replica
Il ritardo di replica può verificarsi in due aree: il thread o il I/O thread SQL. Il primo passo è determinare quale componente è in ritardo.
Nota
Il Seconds_Behind_Source campo in SHOW REPLICA STATUS misura il ritardo tra il momento in cui un evento è stato registrato nell'origine e il momento in cui il thread SQL lo applica. Questa metrica non indica specificamente il ritardo del I/O thread. Per identificare il ritardo del I/O thread, è necessario confrontare le posizioni dei log binari come descritto nei passaggi seguenti.
Nota
Alcuni comandi MySQL e le stringhe interne mostrati in questa sezione, ad esempio, utilizzano una terminologia SHOW MASTER STATUS precedente. Questa documentazione utilizza dappertutto i termini preferiti «source» e «replica».
Per determinare quale thread di replica è in ritardo
-
Sulla replica, esegui
SHOW REPLICA STATUSe confrontaSource_Log_File/Read_Source_Log_Pos(posizione del I/O thread) conFile/PositionfromSHOW MASTER STATUSsull'origine. Se questi differiscono in modo significativo (a differenza di >50 MB o >1 file binlog), il I/O thread è in ritardo. -
Confronta la posizione del I/O thread con la posizione del thread SQL (/).
Relay_Source_Log_FileExec_Source_Log_PosSe il I/O thread è bloccato ma il thread SQL è indietro (a >50 MB di distanza), il thread SQL è il collo di bottiglia.
Valutazione iniziale rapida utilizzando dati di sola replica
È possibile eseguire una valutazione iniziale utilizzando solo i dati relativi alla replica. Esegui SHOW REPLICA STATUS due volte, a distanza di 1—2 minuti, e osserva quanto segue:
Se
Read_Source_Log_Possta avanzando maExec_Source_Log_Posè bloccato o sta avanzando molto più lentamente, il thread SQL è il collo di bottiglia (Scenario B). Passa a Risoluzione dei problemi relativi al ritardo dei thread SQL.Se entrambi
Read_Source_Log_PosExec_Source_Log_Possono bloccati durante la crescita, è probabile che ilSeconds_Behind_Sourcethread sia in ritardo. I/O Prima di apportare modifiche alla configurazione, confermate confrontando le posizioni della replica con l'origine utilizzandoSHOW MASTER STATUSquanto descritto nel passaggio 1 della procedura precedente.
| Scenario | I/O thread vs Source | Thread SQL vs I/O thread | Collo di bottiglia |
|---|---|---|---|
| A | Molto indietro (>50 MB) | Chiudi (<10 MB) | I/O thread |
| B | Chiudi (<10 MB) | Chiudi (50 MB) | Thread SQL |
| C | Molto indietro | Molto indietro | Entrambi (inizia con I/O) |
Esempio Interpretazione delle posizioni dei log binari
L'esempio seguente mostra come confrontare le posizioni dei log binari per determinare il collo di bottiglia.
Sulla replica, restituisce: SHOW REPLICA STATUS
Source_Log_File: mysql-bin.000045 Read_Source_Log_Pos: 524288000 Relay_Source_Log_File: mysql-bin.000045 Exec_Source_Log_Pos: 524200000
Sulla fonte, SHOW MASTER STATUS restituisce:
File: mysql-bin.000045 Position: 1073741824
Per determinare il ritardo del I/O thread, sottrai la posizione del I/O thread dalla posizione di origine:
(1073741824 − 524288000)/1048576 = 524 MB — Il thread è molto indietro rispetto alla fonte (Scenario A). I/O
Per determinare il ritardo del thread SQL, sottrai la posizione del thread SQL dalla posizione del thread: I/O
(524288000 − 524200000)/1048576 = 0,08 MB: il thread SQL è al passo con il thread. I/O
In questo caso, focalizza la risoluzione dei problemi sul thread. I/O Per ulteriori informazioni, consulta Risoluzione dei problemi relativi I/O al ritardo del thread.
Anatomia di un picco di ritardo nella replicazione
Uno schema comune è un picco improvviso Seconds_Behind_Source seguito da un rapido ritorno vicino allo zero. Ciò si verifica quando l'esecuzione di un DML di lunga durata sull'origine (ad esempio un UPDATE che esegue la scansione di milioni di righe ma ne modifica solo alcune) richiede pochi minuti per essere eseguito. Con la registrazione ROW-based binaria, solo le righe modificate vengono scritte nel log binario. Quando il thread SQL rileva questo evento, calcola il ritardo in base all'ora di inizio della transazione nell'origine. Ciò produce un valore iniziale elevato. Tuttavia, poiché è necessario applicare solo poche righe, la replica recupera rapidamente il ritardo. Si tratta di un comportamento previsto e non indica un problema di replica prolungato.
Risoluzione dei problemi relativi I/O al ritardo del thread
Il I/O thread è responsabile del recupero degli eventi di log binari dall'origine e della loro scrittura nel log di inoltro. Cause e soluzioni comuni:
| Causa | Come identificare | Risoluzione |
|---|---|---|
| Limitazioni della larghezza di banda della rete | Controlla/ CloudWatch NetworkReceiveThroughputNetworkTransmitThroughput |
Usa istanze con una maggiore capacità di rete; assicurati classi di istanze simili sull'origine e sulla replica |
| Latenza di rete (interregionale o locale) | Distanza geografica tra sorgente e replica; tempo di andata e ritorno elevato | Per le sorgenti locali, utilizzalo per una connettività dedicata a bassa latenza |
| Vincoli relativi alle risorse all'origine | CPU elevata (CPUUtilization), pressione della memoria () FreeableMemory |
Espandi l'istanza sorgente. Ogni replica connessa crea un thread di dump binlog sull'origine: riduci il numero di repliche connesse se l'origine è limitata dalle risorse. |
| BLOB/TEXT Transazioni di grandi dimensioni con dati | Monitora le dimensioni degli eventi del registro binario tramite SumBinaryLogSize CloudWatch metrica |
Impostabinlog_row_image=noblob; abilita la compressione delle transazioni di log binario (binlog_transaction_compression=ON). Esegui prima il test in modalità non di produzione: la compressione aumenta l'utilizzo della CPU sia sull'origine che sulla replica. |
| È stato raggiunto il limite di spazio per il log di inoltro | Replica_IO_Statemostra «In attesa che il thread SQL di replica liberi abbastanza spazio nel log di inoltro» |
Ciò indica che la causa principale è il thread SQL, non il I/O thread. Risolvi prima il ritardo del thread SQL. In Aurora MySQL, il valore predefinito relay_log_space_limit è di circa 953 MiB. Questo messaggio fa parte del normale funzionamento quando il thread SQL non è in grado di applicare le modifiche abbastanza velocemente. Questo messaggio non indica necessariamente un problema di prestazioni del I/O thread. |
Strategie di ottimizzazione per il ritardo I/O del thread
-
Utilizza almeno la stessa classe di istanza dell'origine: questo approccio fornisce CPU, memoria, I/O capacità e larghezza di banda di rete sufficienti.
-
Garantisci una larghezza di banda di rete sufficiente: utilizza istanze con capacità di rete elevata. Per le sorgenti locali, prendi in considerazione una larghezza di banda dedicata e un'esperienza di rete più coerente.
-
Controlla le risorse lato sorgente, in particolare con molte repliche: monitora la CPU, la memoria, la rete e il binlog dell'origine. I/O Ogni replica connessa aggiunge un thread di dump binlog sul sorgente, quindi una fonte che serve molte repliche può diventare essa stessa il collo di bottiglia. Si consiglia di verificare che l'origine non sia satura prima di ridimensionare la replica. Se l'origine è soggetta a vincoli di risorse, valuta la possibilità di ridurre il numero di repliche connesse.
-
Verificate che la cache binlog di Aurora sia attiva: I/O la cache binlog riduce il disco I/O sull'origine per la pubblicazione degli I/O eventi di log binari. È abilitato automaticamente in Aurora MySQL versione 2.10 e successive: non è richiesta alcuna configurazione. Se l'origine è un cluster Aurora, verifica che la cache venga utilizzata con.
SHOW GLOBAL STATUS LIKE 'aurora_binlog_io_cache%'Per ulteriori informazioni, consulta Ottimizzazione della replica dei log binari. -
Abilita la compressione delle transazioni del log binario: impostata
binlog_transaction_compression=ONnel gruppo di parametri. Riduce i requisiti di larghezza di banda. Questa impostazione prevede le seguenti considerazioni:La compressione aumenta l'utilizzo della CPU sia sull'origine che sulla replica.
Effettua prima i test in un ambiente non di produzione per trovare l'equilibrio ottimale tra compressione e utilizzo delle risorse.
Facoltativamente, regolate il livello di compressione utilizzando
binlog_transaction_compression_level_zstd(impostazione predefinita: 3, intervallo: 1—22).
-
Riduci al minimo le scritture nei log binari: impostata
binlog_row_image=noblobper eliminare BLOB/TEXT i dati dai log binari. Non utilizzare se la replica dispone di trigger che fanno riferimento a colonne BLOB. Per ulteriori informazioni, vedete https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html#sysvar_binlog_row_imagebinlog_row_image sul sito Web MySQL. -
Implementa i filtri di replica sull'origine: utilizza o escludi database non necessari.
binlog-do-dbbinlog-ignore-dbSi tratta di parametri statici che richiedono un riavvio.Importante
Source-side i filtri influiscono interamente su ciò che viene scritto nei log binari. I database esclusi non vengono replicati in nessuna replica a valle. Se l'origine è un'istanza MySQL autogestita (locale o su Amazon EC2), anche i database esclusi non sono disponibili per il ripristino point-in-time basato su log binari. Amazon RDS for MySQL non supporta il filtro binlog sul lato sorgente (/non sono configurabili); utilizza invece filtri di replica lato replica.
binlog-do-dbbinlog-ignore-dbAurora utilizza il volume del cluster per PITR e non è influenzata dai filtri di log binari per scopi di backup.
Risoluzione dei problemi relativi al ritardo dei thread SQL
Il thread SQL è il collo di bottiglia quando il I/O thread è collegato all'origine ma è in crescita. Seconds_Behind_Source Per quantificare il ritardo, monitora una finestra di 15 minuti. Confronta il tasso di generazione del binlog sull'origine (il Position delta daSHOW MASTER STATUS) con il tasso di applicazione del thread SQL sulla replica (il Exec_Source_Log_Pos delta).
Cause e soluzioni comuni:
| Causa | Come identificare | Risoluzione |
|---|---|---|
| Single-threaded replica | SELECT @@global.replica_parallel_workers;restituisce 0 o 1 |
Abilita la replica multithread (MTR) con il monitoraggio delle dipendenze WRITESET. L'MTR da solo non risolve il ritardo se i conflitti di clock sono elevati. Vedi Tracciamento delle dipendenze dall'origine per ottimizzare il monitoraggio delle dipendenze e Registro degli errori: statistiche sulle repliche multi-thread per identificare i conflitti di clock. |
| Mancanza di chiavi primarie | Senza una chiave primaria (o una chiave univoca con NOT NULL), la replica esegue una scansione completa della tabella per ogni riga modificata nelle operazioni UPDATE e DELETE. Utilizzate la seguente query per identificare le tabelle senza chiavi primarie:
|
Aggiungi chiavi primarie a tutte le tabelle replicate. Se l'aggiunta di chiavi primarie esplicite non è immediatamente possibile, valuta la possibilità di abilitare Generated Invisible Primary Keys (GIPK) impostando il sql_generate_invisible_primary_key parametro su ON (disponibile nelle versioni Aurora MySQL 3 basate su MySQL 8.0.30 e successive). Per ulteriori informazioni sulle chiavi primarie invisibili generate, vedi Generated Invisible Primary Keys sul sito Web MySQL. https://dev.mysql.com/doc/refman/8.0/en/create-table-gipks.html |
| Transazioni di scrittura di grandi dimensioni sul codice sorgente | Una transazione che modifica molte righe (ad esempio, un UPDATE o DELETE in blocco) viene replicata come una singola unità che può essere applicata solo da un thread di lavoro, indipendentemente dalla configurazione MTR. All'origine, identifica le transazioni di scrittura attive di lunga durata con: Nella replica, un lavoratore rimane occupato sulla stessa dichiarazione SHOW PROCESSLIST mentre gli altri restano inattivi. Long-running le transazioni inattive o in attesa di blocchi sull'origine non causano di per sé ritardi nella replica: conta solo il volume di scrittura impegnato, perché gli eventi raggiungono il log binario al momento del commit. |
Suddividi le operazioni di massa in transazioni più piccole (ad esempio, poche migliaia di righe per commit) in modo che la replica possa applicarle in parallelo. Per un esempio funzionante, vediEsempio 4: una singola transazione di grandi dimensioni non può essere parallelizzata. |
| operazioni DDL | DDL blocca altri eventi di replica | Utilizza uno strumento online per la modifica dello schema o utilizza Blue/Green le distribuzioni. Pianifica il DDL durante i periodi di traffico limitato. Perpt-online-schema-change, vedi Percona Toolkit gh-ost, vedi https://github.com/github/gh-ost |
| Configurazione di replica parallela non ottimale | Basso utilizzo del personale; conflitti di clock elevati nelle statistiche dei coordinatori. Seleziona il campo «Conflitti in attesa» nella voce del registro degli errori delle statistiche di replica multithread (vedi). Registro degli errori: statistiche sulle repliche multi-thread Valori elevati relativi ai «secondi trascorsi» indicano che le transazioni sono spesso bloccate da dipendenze. | Ottimizza il monitoraggio delle dipendenze (WRITESET) e il numero di lavoratori |
| Conflitto di risorse dovuto ai carichi di lavoro analitici | Query OLAP complesse che competono con il thread SQL per quanto riguarda le risorse (CPU, memoria) | Separa i carichi di lavoro analitici dalle repliche dedicate |
| Tabelle statistiche obsolete | Piani di interrogazione non ottimali sulla replica. Utilizza la seguente query per identificare le tabelle con statistiche obsolete (più vecchie di 7 giorni):
|
Esegui ANALYZE TABLE periodicamente su tabelle con statistiche obsolete |
Riduci il carico di lavoro delle applicazioni con filtri di replica lato replica
Aurora MySQL versione 3.01.0 e successive supporta i filtri di replica lato replica. Usali per saltare database o tabelle irrilevanti durante l'applicazione, riducendo il carico di lavoro dei thread SQL. Replica-side i filtri vengono applicati dal thread SQL: il I/O thread recupera comunque tutti gli eventi di log binari dall'origine, quindi questi filtri riducono solo il lavoro di applicazione, non il trasferimento di rete. A differenza dei filtri sul lato sorgente (che funzionano solo a livello di database), i filtri lato replica supportano la granularità a livello di tabella utilizzando e. replicate-do-table replicate-ignore-table Per ulteriori informazioni, consulta Configurazione dei filtri di replica con Aurora MySQL.
Multi-threaded replica (MTR)
Con MTR, la replica applica transazioni indipendenti in parallelo. Non può suddividere una singola transazione di grandi dimensioni in parti parallele. Il grado di parallelismo è limitato dalle informazioni sulle dipendenze scritte dalla fonte.
Quando MTR è abilitato (replica_parallel_workers >= 2), l'applicatore SQL viene suddiviso in un thread coordinatore e più thread di lavoro. Il coordinatore legge le transazioni dal log di inoltro. Esamina i timestamp logici (last_committedesequence_number) che la fonte incorpora in ogni transazione. Quindi assegna transazioni indipendenti ai thread di lavoro disponibili per l'esecuzione parallela. Due transazioni sono indipendenti se non condividono le dipendenze dei dati, ovvero se modificano righe diverse. L'origine determina queste dipendenze al momento del commit utilizzando il metodo di tracciamento delle dipendenze configurato e le registra nel registro binario. La replica non può aumentare il parallelismo oltre quanto consentito dalla fonte.
MTR è l'impostazione predefinita consigliata
Consigliamo di eseguire le repliche con MTR abilitato. MTR è abilitato di default (replica_parallel_workers=4) in MySQL 8.0.27 e versioni successive, incluse le versioni Aurora MySQL 3 basate su tali versioni. Nelle versioni precedenti (Aurora MySQL 2.12.1 e successive o versioni basate su versioni di MySQL precedenti alla 8.0.27), abilitalo esplicitamente impostando un valore pari o superiore a 2. replica_parallel_workers Mantenere MTR abilitato costa poco quando il parallelismo non è disponibile e consente alla replica di sfruttarlo ogni volta che il carico di lavoro lo consente.
L'MTR non riduce il ritardo nei seguenti casi:
Il collo di bottiglia è il I/O thread (problema). network/bandwidth
Il ritardo è causato da una singola transazione di lunga durata.
La replica è CPU-saturated (più thread peggiorano le cose).
Le tabelle sono prive di chiavi primarie (impone la scansione completa delle tabelle, annullando il parallelismo).
Tracciamento delle dipendenze dall'origine
La fonte determina quali transazioni possono essere applicate in parallelo utilizzando il binlog_transaction_dependency_tracking parametro. Valore consigliato:WRITESET.
-
COMMIT_ORDER: tiene traccia delle dipendenze in base ai tempi di commit. Funziona al meglio con una concorrenza elevata e commit di grandi gruppi. Parallelismo limitato in ambienti a bassa concorrenza.
-
WRITESET (consigliato): tiene traccia delle effettive dipendenze dei dati a livello di riga. Le prestazioni sono sempre almeno pari a COMMIT_ORDER. Significativamente migliore con carichi di lavoro a bassa concorrenza. Richiede che le tabelle abbiano chiavi primarie.
Il monitoraggio delle dipendenze WRITESET produce writeset vuoti o parziali (limitando il parallelismo) nei seguenti casi:
Tabelle senza chiavi primarie o univoche
Istruzioni DDL (CREATE TABLE, ALTER TABLE e così via)
Transazioni che modificano le tabelle principali nelle relazioni di chiave esterna
Inoltre, la cronologia delle dipendenze viene cancellata quando il log binario ruota o quando viene raggiunto il
binlog_transaction_dependency_history_sizelimite, riducendo temporaneamente il parallelismo. -
WRITESET_SESSION — Uguale a WRITESET con un vincolo aggiuntivo che prevede che le transazioni della stessa sessione non possano essere parallelizzate.
Nota
MySQL 8.4 è stato rimosso e per impostazione predefinita è WRITESET (non configurabile). binlog_transaction_dependency_tracking Per impostazione predefinita, le versioni precedenti sono COMMIT_ORDER.
Tipo parallelo (replica_parallel_type)
Il replica_parallel_type parametro determina la modalità di distribuzione delle transazioni tra i thread di lavoro. Sono disponibili due opzioni:
-
LOGICAL_CLOCK (consigliato): utilizza timestamp logici per determinare quali transazioni possono essere eseguite in parallelo, anche all'interno dello stesso database. Questo approccio comporta un throughput di replica più elevato e una latenza inferiore per la maggior parte dei carichi di lavoro. Utilizzalo a meno che tu non disponga di un carico di lavoro specifico su più database che non ne tragga vantaggio.
-
DATABASE: assegna le transazioni ai thread di lavoro in base al database su cui influiscono. Consideratelo solo quando l'applicazione utilizza più database con carichi di lavoro chiaramente separati e le transazioni raramente superano i confini del database. Quando si utilizza DATABASE, l'
binlog_transaction_dependency_trackingimpostazione sull'origine non viene utilizzata: il parallelismo è determinato esclusivamente dal database a cui è destinata una transazione.
Nota
Nelle versioni di MySQL 8.0.26 e precedenti, il valore predefinito è. replica_parallel_type DATABASE A partire da MySQL 8.0.27, il valore predefinito è. LOGICAL_CLOCK Se stai usando una versione precedente, imposta esplicitamente questo parametro su per LOGICAL_CLOCK sfruttare il monitoraggio più dettagliato delle dipendenze.
Configurazione MTR
| Parametro | Valore consigliato | Note |
|---|---|---|
binlog_transaction_dependency_tracking |
SET DI SCRITTURA | Gruppo di parametri del cluster. Dinamico. Non necessario per MySQL 8.4. |
binlog_transaction_dependency_history_size |
25000 (impostazione predefinita) | Gruppo di parametri del cluster. Dinamico. Controlla il numero di hash di riga che il sorgente conserva per il monitoraggio delle dipendenze di WRITESET; quando la cronologia si riempie o il log binario ruota, viene cancellato e il parallelismo si interrompe temporaneamente. Valuta la possibilità di raddoppiare il valore (ad esempio, portandolo a 50000) nelle sorgenti ad alto contenuto di scrittura se la replica mostra picchi periodici nella statistica del log degli errori «waited at clock conflicts» (vedi) che si allineano alla rotazione del log binario. Registro degli errori: statistiche sulle repliche multi-thread Valori più grandi consumano più memoria sull'origine. |
binlog_format |
ROW | Gruppo di parametri del cluster. Statico (richiede il riavvio). |
binlog_group_commit_sync_delay |
0 (impostazione predefinita) | Microsecondi per ritardare il commit del gruppo. L'aumento di questo valore raggruppa più transazioni, migliorando il parallelismo sulla replica al costo di un leggero aumento della latenza di commit sull'origine. Utile solo quando si utilizza il monitoraggio delle dipendenze COMMIT_ORDER: WRITESET tiene già traccia delle effettive dipendenze a livello di riga indipendentemente dai tempi di commit. Dinamico. |
binlog_group_commit_sync_no_delay_count |
0 (impostazione predefinita) | Numero massimo di transazioni da attendere prima di effettuare il commit. Usa with binlog_group_commit_sync_delay per limitare il ritardo una volta che un numero sufficiente di transazioni è stato raggruppato in batch. Rilevante solo per il monitoraggio delle dipendenze COMMIT_ORDER. Dinamico. |
| Parametro | Valore consigliato | Note |
|---|---|---|
replica_parallel_workers |
Inizia dal numero di vCPU, fino al doppio del numero di vCPU | Gruppo di parametri dell'istanza. Dinamico ma richiede il riavvio della replica. L'impostazione predefinita della community è 4 a partire da MySQL 8.0.27 (e le versioni Aurora MySQL 3 basate su di esso); le versioni precedenti hanno il valore predefinito 0, che è deprecato a partire da MySQL 8.0.30. Consigliamo di iniziare dal conteggio delle vCPU, quindi di monitorare l'utilizzo della CPU e di visualizzare la statistica del log degli errori «Waited (count) when Workers busy» (vedi). Registro degli errori: statistiche sulle repliche multi-thread Incrementate solo quando il valore «Aspettato (conteggio) quando i lavoratori occupati» è costantemente elevato e l'utilizzo della CPU rimane inferiore all'80%. |
replica_parallel_type |
LOGICAL_CLOCK | Gruppo di parametri del cluster. Dinamico ma richiede il riavvio della replica. |
replica_pending_jobs_size_max |
> = max_allowed_packet nessuna fonte |
Gruppo di parametri di istanza. Dinamico. |
replica_preserve_commit_order |
ATTIVATO | Gruppo di parametri del cluster. Dinamico ma richiede il riavvio della replica. |
binlog_format |
OFF | Gruppo di parametri del cluster. Statico. Aurora-specific estensione per disabilitare la registrazione binaria. |
Dopo aver modificato le impostazioni dei lavoratori paralleli, riavvia la replica:
CALL mysql.rds_stop_replication; CALL mysql.rds_start_replication;
Aurora-specific ottimizzazioni della replica
Aurora MySQL offre le seguenti funzionalità per migliorare le prestazioni di replica dei log binari. La tabella seguente riassume la disponibilità, lo stato predefinito e come abilitare ciascuna funzionalità.
| Funzionalità | Versione | Predefinita | Come abilitare/verificare |
|---|---|---|---|
| In-memory registro di inoltro | Aurora MySQL 3.10+ | ON (per la Aurora-managed replica quando le condizioni sono soddisfatte) | Abilitato automaticamente per la Aurora-managed replica (blue/green distribuzioni e repliche tra regioni) quando la replica utilizza la replica a thread singolo (replica_parallel_workers=0) Aurora-to-Aurora, la replica multithread con modalità GTID e posizionamento automatico abilitati o la replica basata su file con. replica_preserve_commit_order=ON Controllato dal aurora_in_memory_relaylog parametro dinamico (cluster DB o livello di istanza): interrompi la replica, impostala su o nel gruppo di parametri, quindi riavvia la replica: non è richiesto il riavvio dell'istanza. ON OFF Non disponibile su. Aurora Serverless Verifica lo stato attuale conSHOW GLOBAL STATUS LIKE 'Aurora_in_memory_relaylog_status'. Per ulteriori informazioni, consulta In-memory registro di inoltro. |
| Modifiche parallele all'indice secondario | Aurora MySQL 3.06+ | DISATTIVATO (0) |
aurora_binlog_replication_sec_index_parallel_workersImpostato sul numero di thread desiderato. Interrompi la replica, imposta il parametro, quindi avvia la replica. Non è richiesto il riavvio dell'istanza. Per ulteriori informazioni, consulta Replica dei log binari multithread. |
| Cache Binlog I/O | Aurora MySQL 2.10+ e 3.x | ON (automatico) | Attivato automaticamente. Riduce il disco I/O sull'origine quando vengono trasmessi eventi di log binari alle repliche. Non è necessaria alcuna configurazione. Per ulteriori informazioni, consulta Ottimizzazione della replica dei log binari. |
Monitoraggio della replica parallela
Utilizza i seguenti metodi per monitorare le prestazioni di replica e identificare parallelamente i colli di bottiglia:
Schema delle prestazioni
Tabelle chiave per il monitoraggio dell'MTR:
performance_schema.replication_applier_status_by_worker— Mostra i dettagli delle transazioni gestite da ciascun thread di lavoro, inclusi i timestamp e gli errori di applicazione.performance_schema.replication_applier_status_by_coordinator— Mostra informazioni sull'attività di buffering del thread coordinatore.
Per valutare la distribuzione uniforme del lavoro tra i thread di lavoro, utilizzate la seguente query:
SELECT a.channel_name, rw1.thread_id AS replica_worker_thread_id, ts1.count_star AS number_of_trx_executed, ROUND((ts1.count_star / sum_count_star) * 100, 2) AS percent_of_trx_executed_by_worker FROM ( SELECT rw.channel_name, SUM(ts.count_star) AS sum_count_star FROM performance_schema.events_transactions_summary_by_thread_by_event_name AS ts JOIN performance_schema.replication_applier_status_by_worker AS rw ON ts.thread_id = rw.thread_id GROUP BY rw.channel_name ) AS a JOIN performance_schema.replication_applier_status_by_worker AS rw1 ON a.channel_name = rw1.channel_name JOIN performance_schema.events_transactions_summary_by_thread_by_event_name AS ts1 ON rw1.thread_id = ts1.thread_id;
Se uno o due lavoratori gestiscono la maggior parte delle transazioni, ciò indica un'elevata dipendenza dalle transazioni che limita il parallelismo. Prendi in considerazione la possibilità di passare al monitoraggio delle dipendenze di WRITESET sull'origine.
Se le posizioni del I/O thread e del thread SQL sono vicine l'una all'altra ma Seconds_Behind_Source sono ancora in crescita, il collo di bottiglia potrebbe essere il thread coordinatore stesso. Verifica la presenza di ritardi nel performance_schema.replication_applier_status_by_coordinator buffering. Un collo di bottiglia del coordinatore indica in genere forti dipendenze tra transazioni o un singolo thread di coordinatore sovraccarico che non è in grado di distribuire gli eventi con sufficiente rapidità.
Registro degli errori: statistiche sulle repliche multi-thread
Quando log_error_verbosity=3 (impostazione predefinita), Aurora MySQL scrive periodicamente le statistiche delle repliche multithread nel log degli errori di MySQL. È possibile visualizzare queste voci tramite:
Nella console RDS, nella sezione Registri ed eventi, visualizza il registro degli errori.
Scaricamento tramite AWS CLI:
aws rds download-db-log-file-portion --db-instance-identifier <instance-id> --log-file-name error/mysql-error-running.logSe l'esportazione CloudWatch dei log è abilitata per il log degli errori, esegui una ricerca nel gruppo di log esportato.
Per individuare le voci delle statistiche delle repliche multithread nel log degli errori, cercate la stringa mostrata nell'esempio seguente. Il log degli errori di MySQL utilizza una terminologia precedente in questa stringa interna; in questa documentazione viene utilizzato il termine preferito «replica» in tutte le sue parti.
Di seguito è riportato un esempio di voce nel log degli errori:
2026-05-10 14:54:28.045308 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 120; events assigned = 7215200; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 1203644200 waited (count) when Workers occupied = 1022462 waited when Workers occupied = 62349203500
Campi chiave da analizzare:
| Campo | Description | Azione |
|---|---|---|
| secondi trascorsi | Tempo in secondi dall'ultima uscita delle statistiche. Aurora MySQL non scrive statistiche a intervalli regolari: le scrive in base al numero di eventi eseguiti più il tempo trascorso. | Da utilizzare per calcolare il throughput: eventi assegnati/secondi trascorsi = media degli eventi per intervallo. |
| eventi assegnati | Numero di eventi assegnati dal thread coordinatore ai thread di lavoro dall'ultimo output. | Monitora le variazioni del throughput di replica nel tempo. |
| Code di lavoro riempite oltre il livello di esaurimento | Numero di eventi in coda ai thread di lavoro superiore al livello di superamento (90% della lunghezza massima della coda di 16384 eventi). Se è pari a zero, nessun lavoratore opera al massimo della capacità. | Indica che i lavoratori non riescono a tenere il passo con il coordinatore. Verifica la presenza di transazioni di lunga durata o indici mancanti. |
| Ho aspettato che la coda dei lavoratori fosse piena | Numero di volte in cui il coordinatore ha dovuto attendere perché la coda di un thread di lavoro era piena (ha raggiunto il 100% della capacità). | Verifica la presenza di transazioni di lunga durata, indici mancanti o blocca i conflitti nei thread di lavoro. |
| Aspettato a causa delle dimensioni totali | Numero di volte in cui il coordinatore ha aspettato il raggiungimento del replica_pending_jobs_size_max limite. Se un evento insolitamente grande supera questa dimensione, la transazione viene bloccata finché tutti i lavoratori non hanno code vuote. |
replica_pending_jobs_size_maxAumento. Verifica la presenza di transazioni di grandi dimensioni sulla fonte. |
| Aspettato a ore contraddittorie | Numero di nanosecondi che il coordinatore ha atteso perché una transazione dipendeva da un'altra transazione che non era ancora stata effettuata. Ciò quantifica l'ora in cui gli eventi non possono essere assegnati a causa delle dipendenze. | Passa al monitoraggio delle dipendenze WRITESET sull'origine. Assicurati che le tabelle abbiano chiavi primarie. Sono previste attese in conflitto di orario: concentrati sulla riduzione del rapporto rispetto alle altre attese. |
| Aspettato (conta) quando i lavoratori erano occupati | Numero di volte in cui il coordinatore ha dovuto assegnare il primo evento di una transazione ma tutte le code dei lavoratori non erano vuote. Il coordinatore rimane inattivo finché una coda non si svuota. | Ciò indica che la disponibilità è insufficiente. replica_parallel_workers Le dipendenze non sono il collo di bottiglia: avresti potuto eseguire più eventi in parallelo ma non disponevi dei thread di lavoro disponibili. replica_parallel_workersAumento. |
| Aspettava quando i lavoratori erano occupati | In totale, il coordinatore ha dormito in nanosecondi mentre aspettava una coda di lavoro vuota. | Valori elevati confermano che la capacità dei lavoratori è il collo di bottiglia. Aumento. replica_parallel_workers |
Esempi pratici: diagnosi delle strozzature applicate in parallelo
Gli esempi seguenti mostrano come utilizzare le fonti di monitoraggio precedenti per diagnosticare i più comuni colli di bottiglia nelle applicazioni parallele. Ogni esempio parte dallo stesso sintomo (è in costante crescita ed Seconds_Behind_Source è già stato confermato che il thread SQL è il collo di bottigliaIdentificazione del collo di bottiglia del ritardo di replica) e utilizza le statistiche delle repliche multithread e lo schema delle prestazioni per determinare l'azione correttiva.
Esempio 1: i lavoratori non dispongono di risorse sufficienti
In CloudWatch, la ReplicaLag metrica sale costantemente da quasi zero a circa 400 secondi nell'arco di 30 minuti. L'utilizzo della CPU sulla replica rimane intorno al 55%, quindi la replica no. CPU-bound
Per confermare dove si trova il ritardo, esegui SHOW REPLICA STATUS due volte, a 60 secondi di distanza. Read_Source_Log_Posavanza di circa 1,2 GB mentre Exec_Source_Log_Pos avanza solo di circa 300 MB. Il I/O thread è al passo con i sorgenti, ma il thread SQL è in ritardo: il thread SQL è il collo di bottiglia.
MTR è abilitato con. replica_parallel_workers=4 Recupera le statistiche di replica multithread più recenti dal registro degli errori (vedi): Registro degli errori: statistiche sulle repliche multi-thread
2026-05-10 14:54:28.045308 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 123; events assigned = 9876544; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 8455000 waited (count) when Workers occupied = 2456789 waited when Workers occupied = 110293847000
Interpreta i campi chiave:
ha atteso quando i lavoratori erano occupati = 110293847000 nanosecondi, ovvero circa 110 secondi. Dei 123 secondi di questo intervallo, il coordinatore ha impiegato circa il 90% del suo tempo ad aspettare che un thread di lavoro diventasse libero.
conflitti di attesa = 8455000 nanosecondi, o circa 0,008 secondi, il che è trascurabile. Le dipendenze delle transazioni non sono il fattore limitante.
Diagnosi: il coordinatore ha sempre più transazioni indipendenti pronte per essere applicate che dipendenti per eseguirle. Poiché l'attesa in caso di conflitto temporale è trascurabile, il parallelismo è limitato dal numero di lavoratori, non dalle dipendenze.
Azione: aumentare il numero replica_parallel_workers di vCPU della replica (ad esempio, 16 su a) e riavviare la replica: db.r6g.4xlarge
CALL mysql.rds_stop_replication; CALL mysql.rds_start_replication;
Verifica: una riga statistica successiva mostra che l'attesa è quasi scomparsa e ReplicaLag ritorna a meno di 5 secondi:
2026-05-10 15:02:14.882201 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 120; events assigned = 31840552; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 9120000 waited (count) when Workers occupied = 41233 waited when Workers occupied = 5980411000
l'espressione «attesa quando i lavoratori erano occupati» è scesa da circa 110 secondi a circa 6 secondi e la produttività (eventi assegnati) è più che triplicata. Smetti di aumentare il numero di dipendenti quando l'utilizzo della CPU si avvicina all'80% o l'attesa smette di diminuire.
Esempio 2: il monitoraggio delle dipendenze COMMIT_ORDER serializza un carico di lavoro a bassa concorrenza
L'origine è un'istanza Amazon RDS per MySQL che esegue un carico di lavoro OLTP con solo 4-8 thread di applicazione che eseguono il commit simultaneo. La replica è una db.r6g.4xlarge con e. replica_parallel_workers=16 replica_parallel_type=LOGICAL_CLOCK Nonostante i 16 dipendenti, ReplicaLag rimane stabile per circa 600 secondi e l'utilizzo della CPU di replica è solo del 20% circa: i lavoratori sembrano inattivi.
Innanzitutto, controlla in che modo le transazioni vengono distribuite uniformemente tra i lavoratori utilizzando la query di distribuzione dei lavoratori di: Schema delle prestazioni
+--------------+--------------------------+------------------------+-----------------------------------+ | channel_name | replica_worker_thread_id | number_of_trx_executed | percent_of_trx_executed_by_worker | +--------------+--------------------------+------------------------+-----------------------------------+ | | 45 | 1903556 | 96.41 | | | 46 | 23104 | 1.17 | | | 47 | 18995 | 0.96 | | | 48 | 16720 | 0.85 | . . +--------------+--------------------------+------------------------+-----------------------------------+
L'output precedente mostra i primi 4 dei 16 thread di lavoro. Un lavoratore applica oltre il 96% delle transazioni mentre gli altri 15 sono quasi inattivi (ciascuno dei lavoratori rimanenti ha eseguito meno dello 0,05%). Apply è effettivamente seriale.
Quindi, confermalo con le statistiche di replica multithread nel registro degli errori:
2026-05-10 15:22:11.110432 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 120; events assigned = 2014500; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 98712340000 waited (count) when Workers occupied = 50122 waited when Workers occupied = 1209847000
atteso a clock conflicts = 98712340000 nanosecondi, ovvero circa 99 dei 120 secondi. Il coordinatore ha impiegato circa l'82% dell'intervallo nell'impossibilità di inviare la transazione successiva perché dipendeva da una ancora in corso di applicazione.
ha atteso quando Workers era occupato = 1209847000 nanosecondi, ovvero circa 1,2 secondi. I lavoratori erano quasi sempre liberi, quindi più lavoratori non aiutano.
Ciò indica un problema di dipendenza, non un problema di capacità. Controlla il metodo di tracciamento delle dipendenze sulla fonte:
SELECT @@global.binlog_transaction_dependency_tracking;
+-------------------------------------------------+ | @@global.binlog_transaction_dependency_tracking | +-------------------------------------------------+ | COMMIT_ORDER | +-------------------------------------------------+
Causa principale: conCOMMIT_ORDER, la fonte decide quali transazioni possono essere eseguite in parallelo in base alle transazioni eseguite insieme nello stesso gruppo di log binario. In questo carico di lavoro a bassa concorrenza, solo una manciata di thread si esegue il commit alla volta, quindi i commit di gruppo sono esigui. Di conseguenza, la fonte contrassegna quasi tutte le transazioni con un last_committed valore uguale a quello della transazione precedentesequence_number, contrassegnandole come dipendenti da quella precedente. La replica deve quindi applicarli uno dopo l'altro, anche se modificano righe completamente indipendenti, motivo per cui 15 lavoratori su 16 rimangono inattivi.
Azione: passa dall'origine al monitoraggio delle dipendenze a livello di riga, che è indipendente dalla tempistica di commit. Impostalo in modo dinamico e conservalo nel gruppo di parametri del cluster (o DB):
SET GLOBAL binlog_transaction_dependency_tracking = WRITESET;
WRITESETcalcola un hash delle righe modificate da ogni transazione, in modo che le transazioni che toccano righe diverse ricevano timestamp indipendenti e possano essere applicate in parallelo indipendentemente dal momento in cui sono state eseguite il commit. Assicurati che tutte le tabelle abbiano chiavi primarie, perché WRITESET produce set di scrittura vuoti per le tabelle che ne sono prive (vedi). Risoluzione dei problemi relativi al ritardo dei thread SQL In MySQL 8.4, WRITESET è l'impostazione predefinita e questo parametro non esiste più.
Verifica: dopo la modifica, la query sulla distribuzione dei lavoratori mostra il lavoro distribuito uniformemente tra tutti i lavoratori (mostrando i primi 4 di 16; ogni lavoratore ora gestisce circa il 6% delle transazioni):
+--------------+--------------------------+------------------------+-----------------------------------+ | channel_name | replica_worker_thread_id | number_of_trx_executed | percent_of_trx_executed_by_worker | +--------------+--------------------------+------------------------+-----------------------------------+ | | 45 | 132540 | 6.30 | | | 46 | 125610 | 5.97 | | | 47 | 129774 | 6.17 | | | 48 | 122901 | 5.84 | . . +--------------+--------------------------+------------------------+-----------------------------------+
e le statistiche del registro degli errori mostrano che i conflitti di clock si riducono mentre ReplicaLag scendono quasi a zero:
2026-05-10 15:41:55.204713 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 120; events assigned = 19874100; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 412300000 waited (count) when Workers occupied = 88122 waited when Workers occupied = 7019847000
I «conflitti in attesa» sono scesi da circa 99 secondi a circa 0,4 secondi, la produttività è aumentata di circa dieci volte e il collo di bottiglia è passato dalle dipendenze alla capacità dei lavoratori: a questo punto è possibile regolare il numero di lavoratori come nell'Esempio 1.
Esempio 3: una chiave primaria mancante impone la scansione completa della tabella sulla replica
ReplicaLagsi verifica un picco durante un processo batch notturno di grandi dimensioni UPDATE e DELETE istruzioni, per poi essere ripristinato in seguito. Durante il picco, la CPU di replica è moderata ma un lavoratore appare bloccato.
Sulla replica, esegui SHOW PROCESSLIST e controlla i thread di lavoro della replica. Un lavoratore rimane nello Updating stato della stessa dichiarazione per molti secondi alla volta:
+----+-------------+------+---------+----------+------+ | Id | User | db | Command | State | Time | +----+-------------+------+---------+----------+------+ | 12 | system user | app | Connect | Updating | 38 | +----+-------------+------+---------+----------+------+
Verifica quali tabelle replicate sono prive di una chiave primaria utilizzando la query di rilevamento diRisoluzione dei problemi relativi al ritardo dei thread SQL:
+--------------+----------------+ | table_schema | table_name | +--------------+----------------+ | app | events_archive | +--------------+----------------+
Causa principale: con la registrazione ROW-based binaria, ogni riga di un DELETE evento UPDATE or deve trovarsi sulla replica prima di poter essere applicata. Se la tabella non ha una chiave primaria o una chiave NOT NULL univoca, la replica esegue una scansione completa della tabella per ogni riga interessata. In una tabella con milioni di righe, un'operazione batch si trasforma in milioni di scansioni complete e il lavoratore che la applica si blocca, bloccando l'avanzamento dell'applicazione e aumentando il ritardo.
Azione: aggiungere una chiave primaria alla tabella. Se non è possibile definire immediatamente una chiave esplicita, abilita Generated Invisible Primary Keys (GIPK) impostando il sql_generate_invisible_primary_key parametro su ON (disponibile nelle versioni Aurora MySQL 3 basate su MySQL 8.0.30 e successive), in modo che le nuove tabelle ricevano una chiave primaria automatica (vedi). Risoluzione dei problemi relativi al ritardo dei thread SQL
Verifica: dopo aver aggiunto la chiave primaria, il lavoratore non indugia più, la frequenza di applicazione del thread SQL viene ripristinata e Updating ritorna alla linea di base durante la finestra batch successiva. ReplicaLag
Esempio 4: una singola transazione di grandi dimensioni non può essere parallelizzata
ReplicaLagsalta bruscamente a un'ora prevedibile ogni giorno, rimane per diversi minuti, quindi torna quasi a zero. Il monitoraggio delle dipendenze di WRITESET è abilitato e tutte le tabelle hanno chiavi primarie, quindi gli esempi precedenti non si applicano. replica_parallel_workers=16
Durante il picco, la query sulla distribuzione dei lavoratori mostra un lavoratore occupato e il resto inattivo, ma a differenza dell'Esempio 2, il log degli errori non mostra né conflitti di clock elevati né attese occupate dai lavoratori:
2026-05-10 02:13:40.551922 [Note] [MY-010559] [Repl] Multi-threaded slave statistics for channel '': seconds elapsed = 95; events assigned = 4120000; worker queues filled over overrun level = 0; waited due a Worker queue full = 0; waited due the total size = 0; waited at clock conflicts = 1530000 waited (count) when Workers occupied = 980 waited when Workers occupied = 210440000
Sia le attese per dipendenza che le attese occupate dai lavoratori sono basse, ma è attivo un solo lavoratore. Ciò esclude sia il problema delle dipendenze (Esempio 2) che quello della capacità dei lavoratori (Esempio 1).
Ispeziona il lavoratore occupato che entra o scappa. performance_schema.replication_applier_status_by_worker SHOW PROCESSLIST Un singolo lavoratore applica una transazione per l'intera durata del picco. All'origine, un processo applicativo esegue una dichiarazione di grandi dimensioni, ad esempio DELETE FROM orders WHERE created_at < '2025-01-01' che interessa diversi milioni di righe, come un'unica transazione.
Causa principale: MTR esegue una parallelizzazione tra transazioni indipendenti; non può suddividere una singola transazione tra i lavoratori. Una transazione di grandi dimensioni viene applicata esattamente da un lavoratore, quindi aggiungere lavoratori, passare a WRITESET o aggiungere chiavi primarie non aiuta. Per ulteriori informazioni, consulta Multi-threaded replica (MTR).
Azione: suddividi l'operazione di grandi dimensioni in batch più piccoli sull'origine (ad esempio, elimina in blocchi di poche migliaia di righe per transazione, con una breve pausa tra i batch). Le transazioni più piccole vengono eseguite indipendentemente, in modo che la replica possa distribuirle tra i lavoratori. Pianifica i lavori in blocco durante le finestre a traffico limitato, ove possibile.
Verifica: dopo aver raggruppato il lavoro in batch, il ReplicaLag picco giornaliero si appiattisce e la query sulla distribuzione dei lavoratori mostra il batch distribuito su più lavoratori anziché su uno solo.
Le migliori pratiche di monitoraggio
Configura CloudWatch gli allarmi sulla
ReplicaLagmetrica con soglie appropriate.Utilizza le tabelle del battito cardiaco per una misurazione del ritardo più accurata rispetto a.
Seconds_Behind_SourceAd esempio, l'usopt-heartbeat, che richiede un'installazione separata (vedi Percona Toolkitsul sito web di Percona). Monitora la
SumBinaryLogSizeCloudWatch metrica sull'origine per tenere traccia della velocità di generazione dei log binari.Abilita le esportazioni CloudWatch dei log log in modo che il log degli errori conservi le statistiche delle repliche multithread.
Utilizza il monitoraggio avanzato per CPU, memoria e I/O utilizzo sia sull'origine che sulla replica.
Usa Amazon CloudWatch Database Insights per identificare i principali eventi di attesa e le query che causano conflitti tra le risorse. Performance Insights scadrà il 31 luglio 2026; dopo tale data, la console Performance Insights reindirizza a Database Insights. CloudWatch Scegli la modalità Database Insights più adatta alle tue esigenze: la modalità standard preserva l'esperienza di monitoraggio e i prezzi di base, mentre la modalità avanzata aggiunge il monitoraggio a livello di flotta, la diagnostica dei blocchi e l'acquisizione del piano di esecuzione. Per ulteriori informazioni, consulta Monitoraggio del carico del DB con Amazon CloudWatch Database Insights su Amazon Aurora.
Procedure consigliate per ridurre al minimo il ritardo nella replica
I seguenti consigli riassumono le azioni chiave per ridurre al minimo il ritardo di replica. Per una guida dettagliata su ciascun argomento, segui i collegamenti ai riferimenti incrociati.
-
Verifica che tutte le tabelle abbiano chiavi primarie: senza chiavi primarie, la replica esegue scansioni complete della tabella per ogni riga modificata nelle operazioni UPDATE e DELETE. Per ulteriori informazioni, consulta Risoluzione dei problemi relativi al ritardo dei thread SQL.
-
Abilita la replica multithread con WRITESET: parallelizza l'applicazione SQL per transazioni indipendenti. Per i dettagli sulla configurazione, vedere. Multi-threaded replica (MTR)
-
Utilizza almeno la stessa classe di istanza dell'origine: fornisce CPU, memoria e risorse di rete sufficienti per la replica. Per ulteriori informazioni, consulta Strategie di ottimizzazione per il ritardo I/O del thread.
-
Mantieni le dimensioni delle transazioni ridotte: le transazioni di grandi dimensioni riducono il parallelismo e aumentano la lunghezza dell'elenco cronologico. Per ulteriori informazioni, consulta Risoluzione dei problemi relativi al ritardo dei thread SQL.
-
Disabilita la registrazione binaria sulle repliche: impostata a
binlog_format=OFFmeno che non sia necessaria la replica a valle. Per i dettagli dei parametri, consulta Configurazione MTR. -
Evita transazioni e interrogazioni di lunga durata sulle repliche: le transazioni di Long-running lettura impediscono l'eliminazione dell'elenco cronologico, che può compromettere le prestazioni delle repliche.
-
Abilita GTID-based la replica: fornisce il monitoraggio automatico della posizione e abilita il log di inoltro in memoria Aurora (Aurora MySQL 3.10+). Per ulteriori informazioni, consulta Aurora-specific ottimizzazioni della replica.