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à.
Utilizzo dell'inoltro di scrittura locale in un cluster database Amazon Aurora MySQL
L'inoltro di scrittura locale (all'interno del cluster) consente alle applicazioni di eseguire transazioni di lettura/scrittura direttamente su una replica di Aurora. Queste transazioni vengono quindi inoltrate all'istanza database di scrittura in attesa che venga eseguito il commit. È possibile utilizzare l'inoltro locale di scrittura quando le applicazioni richiedono read-after-write coerenza, ovvero la capacità di leggere l'ultima scrittura in una transazione.
Le repliche di lettura ricevono aggiornamenti in modo asincrono dall'istanza di scrittura. Senza inoltro di scrittura, è necessario effettuare transazioni di lettura che richiedono read-after-write coerenza sull'istanza Writer DB. Oppure è necessario sviluppare una logica dell'applicazione personalizzata complessa per sfruttare più repliche di lettura per la scalabilità. Le applicazioni devono suddividere completamente tutto il traffico in lettura e in scrittura, mantenendo due gruppi di connessioni al database per inviare il traffico all'endpoint corretto. Questi costi di sviluppo complicano la progettazione dell'applicazione quando le query fanno parte di una singola sessione logica, o transazione, all'interno dell'applicazione. Inoltre, poiché il ritardo di replica può variare tra le repliche di lettura, è difficile ottenere una coerenza di lettura globale tra tutte le istanze nel database.
L'inoltro di scrittura evita la necessità di suddividere tali transazioni o inviarle esclusivamente all'istanza di scrittura, semplificando lo sviluppo dell'applicazione. Questa nuova funzionalità consente di ottenere facilmente il dimensionamento della lettura per carichi di lavoro che devono leggere l'ultima scrittura in una transazione e non sono sensibili alla latenza di scrittura.
L'inoltro di scrittura locale è diverso dall'inoltro di scrittura globale, che inoltra le scritture da un cluster database secondario al cluster database primario in un database globale Aurora. Puoi utilizzare l'inoltro di scrittura locale in un cluster database che fa parte di un database globale Aurora. Per ulteriori informazioni, consulta Utilizzo dell'inoltro di scrittura in un database globale Amazon Aurora.
L'inoltro di scrittura locale richiede Aurora MySQL versione 3.04 o successive.
Argomenti
Verifica se l'inoltro di scrittura è abilitato un cluster database
Per determinare se è possibile utilizzare l'inoltro di scrittura in un cluster database, verifica che l'attributo LocalWriteForwardingStatus
del cluster sia impostato su enabled
.
Nella AWS Management Console scheda Configurazione della pagina dei dettagli del cluster, viene visualizzato lo stato Enabled for Local read replica write forwarding.
Per visualizzare lo stato dell'impostazione di inoltro della scrittura per tutti i cluster, esegui il comando seguente. AWS CLI
aws rds describe-db-clusters \ --query '*[].{DBClusterIdentifier:DBClusterIdentifier,LocalWriteForwardingStatus:LocalWriteForwardingStatus}' [ { "LocalWriteForwardingStatus": "enabled", "DBClusterIdentifier": "write-forwarding-test-cluster-1" }, { "LocalWriteForwardingStatus": "disabled", "DBClusterIdentifier": "write-forwarding-test-cluster-2" }, { "LocalWriteForwardingStatus": "requested", "DBClusterIdentifier": "test-global-cluster-2" }, { "LocalWriteForwardingStatus": "null", "DBClusterIdentifier": "aurora-mysql-v2-cluster" } ]
Un cluster database può avere i seguenti valori per LocalWriteForwardingStatus
:
-
disabled
: l'inoltro di scrittura è disabilitato. -
disabling
: l'inoltro di scrittura è in fase di disabilitazione. -
enabled
: l'inoltro di scrittura è abilitato. -
enabling
: l'inoltro di scrittura è in fase di abilitazione. -
null
: l'inoltro di scrittura non è disponibile per questo cluster database. -
requested
: l'inoltro di scrittura è stato richiesto, ma non è ancora attivo.
Compatibilità delle applicazioni e di SQL con l'inoltro di scrittura
È possibile utilizzare i seguenti tipi di istruzioni SQL con l'inoltro di scrittura:
-
Istruzioni DML (Data Manipulation Language), ad esempio
INSERT
,DELETE
eUPDATE
. Esistono alcune restrizioni sulle proprietà di queste istruzioni che è possibile utilizzare con l'inoltro di scrittura, come descritto di seguito. -
Istruzioni
SELECT ... LOCK IN SHARE MODE
eSELECT FOR UPDATE
. -
Istruzioni
PREPARE
eEXECUTE
.
Alcune istruzioni non sono consentite o possono produrre risultati non aggiornati quando vengono utilizzate in un cluster database con inoltro di scrittura. Inoltre, le funzioni e le procedure definite dall'utente non sono supportate. Pertanto, l'impostazione EnableLocalWriteForwarding
è disabilitata per impostazione predefinita per i cluster database. Prima di abilitarla, verificare che il codice dell'applicazione non sia interessato da nessuna di queste restrizioni.
Le seguenti restrizioni si applicano alle istruzioni SQL utilizzate con l'inoltro di scrittura. In alcuni casi, è possibile utilizzare le istruzioni su cluster database con inoltro di scrittura abilitato. Questo approccio funziona se l'inoltro di scrittura non è abilitato all'interno della sessione dal parametro di configurazione aurora_replica_read_consistency
. Se si prova a utilizzare un'istruzione quando non è consentita a causa dell'inoltro di scrittura, verrà visualizzato un messaggio di errore simile al seguente:
ERROR 1235 (42000): This version of MySQL doesn't yet support '
operation
with write forwarding'.
- DDL (Data Definition Language)
-
Connettersi all'istanza database di scrittura per eseguire le istruzioni DDL. Non è possibile eseguirle da istanze database di lettura.
- Aggiornamento di una tabella permanente utilizzando i dati di una tabella temporanea
-
È possibile utilizzare tabelle temporanee in cluster database con l'inoltro di scrittura abilitato. Tuttavia, non è possibile utilizzare un'istruzione DML per modificare una tabella permanente se l'istruzione fa riferimento a una tabella temporanea. Ad esempio, non è possibile utilizzare un'istruzione
INSERT ... SELECT
che accetta i dati da una tabella temporanea. - Transazioni XA
-
Non è possibile utilizzare le istruzioni seguenti in un cluster database quando l'inoltro di scrittura è abilitato all'interno della sessione. È possibile utilizzare queste istruzioni su cluster database per i quali non è abilitato l'inoltro di scrittura o all'interno di sessioni in cui l'impostazione
aurora_replica_read_consistency
è vuota. Prima di abilitare l'inoltro di scrittura all'interno di una sessione, occorre verificare se il codice utilizza queste istruzioni.XA {START|BEGIN} xid [JOIN|RESUME] XA END xid [SUSPEND [FOR MIGRATE]] XA PREPARE xid XA COMMIT xid [ONE PHASE] XA ROLLBACK xid XA RECOVER [CONVERT XID]
- Istruzioni LOAD per tabelle permanenti
-
Non è possibile utilizzare le istruzioni seguenti in un cluster database con l'inoltro di scrittura abilitato.
LOAD DATA INFILE 'data.txt' INTO TABLE t1; LOAD XML LOCAL INFILE 'test.xml' INTO TABLE t1;
- Istruzioni plugin
-
Non è possibile utilizzare le istruzioni seguenti in un cluster database con l'inoltro di scrittura abilitato.
INSTALL PLUGIN example SONAME 'ha_example.so'; UNINSTALL PLUGIN example;
- Istruzioni SAVEPOINT
-
Non è possibile utilizzare le istruzioni seguenti in un cluster database quando l'inoltro di scrittura è abilitato all'interno della sessione. È possibile utilizzare queste istruzioni su cluster database in cui l'inoltro di scrittura non è abilitato o all'interno di sessioni in cui l'impostazione
aurora_replica_read_consistency
è vuota. Prima di abilitare l'inoltro di scrittura all'interno di una sessione, occorre verificare se il codice utilizza queste istruzioni.SAVEPOINT t1_save; ROLLBACK TO SAVEPOINT t1_save; RELEASE SAVEPOINT t1_save;
Livelli di isolamento per l'inoltro di scrittura
Nelle sessioni che utilizzano l'inoltro di scrittura, è possibile utilizzare solo il livello di isolamento REPEATABLE READ
. Sebbene sia possibile utilizzare il livello di isolamento READ COMMITTED
anche con repliche di Aurora, questa operazione non funziona con l'inoltro di scrittura. Per informazioni sui livelli di isolamento REPEATABLE READ
e READ COMMITTED
, consulta Livelli di isolamento di Aurora MySQL.
Esecuzione di istruzioni a più parti con inoltro scrittura
Un'istruzione DML può essere costituita da più parti, ad esempio un'istruzione INSERT ... SELECT
o un'istruzione DELETE ...
WHERE
. In questo caso, l'intera istruzione viene inoltrata all'istanza database di scrittura ed eseguita lì.
Transazioni con inoltro di scrittura
Se la modalità di accesso alle transazioni è impostata su sola lettura, l'inoltro di scrittura non viene utilizzato. È possibile specificare la modalità di accesso per la transazione utilizzando l'istruzione SET TRANSACTION
o START TRANSACTION
. È anche possibile specificare la modalità di accesso alle transazioni modificando il valore della variabile di sessione transaction_read_only
Se una transazione di lunga durata non emette alcuna dichiarazione per un periodo di tempo considerevole, potrebbe superare il periodo di timeout inattivo. Questo periodo ha un valore predefinito di un minuto. È possibile impostare il parametro aurora_fwd_writer_idle_timeout
per aumentarlo fino a un giorno. Una transazione che supera il timeout di inattività viene annullata dall'istanza di scrittura. L'istruzione successiva inviata riceve un errore di timeout. Quindi Aurora esegue il rollback della transazione.
Questo tipo di errore può verificarsi in altri casi in cui l'inoltro di scrittura non diventa disponibile. Ad esempio, Aurora annulla le eventuali transazioni che utilizzano l'inoltro di scrittura se si riavvia il cluster database o si disabilita l'inoltro di scrittura.
Quando un'istanza di scrittura in un cluster che utilizza l'inoltro di scrittura locale viene riavviata, le eventuali transazioni e query attive, inoltrate sulle istanze di lettura che utilizzano l'inoltro di scrittura locale vengono chiuse automaticamente. Dopo che l'istanza di scrittura sarà nuovamente disponibile, è possibile riprovare a eseguire queste transazioni.
Parametri di configurazione per l'inoltro di scrittura
I gruppi di parametri database Aurora contengono impostazioni per la funzionalità di inoltro di scrittura. I dettagli su questi parametri sono riepilogati nella tabella seguente, con note di utilizzo dopo la tabella.
Parametro | Ambito | Tipo | Valore predefinito | Valori validi |
---|---|---|---|---|
aurora_fwd_writer_idle_timeout |
Cluster | Intero senza segno | 60 | 1–86.400 |
aurora_fwd_writer_max_connections_pct |
Cluster | Intero lungo senza segno | 10 | 0–90 |
aurora_replica_read_consistency |
Cluster o istanza | Enum | '' (null) | EVENTUAL , SESSION , GLOBAL |
Per controllare le richieste di scrittura in entrata, usare queste impostazioni:
-
aurora_fwd_writer_idle_timeout
: il numero di secondi per cui l'istanza database di scrittura rimane in attesa su una connessione inoltrata da un'istanza di lettura prima di chiuderla. Se la sessione rimane inattiva oltre questo periodo, la sessione viene annullata da Aurora. -
aurora_fwd_writer_max_connections_pct
: il limite superiore delle connessioni al database che può essere utilizzato su un'istanza database di scrittura per gestire le query inoltrate da istanze di lettura. È espresso come una percentuale dell'impostazionemax_connections
per l'istanza di scrittura. Ad esempio, semax_connections
è 800 eaurora_fwd_master_max_connections_pct
oaurora_fwd_writer_max_connections_pct
è 10, allora lo scrittore consente un massimo di 80 sessioni inoltrate simultanee. Queste connessioni provengono dallo stesso pool di connessioni gestito dall'impostazionemax_connections
.Questa impostazione si applica solo all'istanza di scrittura quando l'inoltro di scrittura è abilitato. Se si riduce il valore, le connessioni esistenti non vengono influenzate. Aurora tiene in considerazione il nuovo valore dell'impostazione durante il tentativo di creazione di una nuova connessione da un cluster database. Il valore predefinito è 10, che rappresenta il 10% del valore
max_connections
.
Nota
Poiché aurora_fwd_writer_idle_timeout
e aurora_fwd_writer_max_connections_pct
sono parametri del cluster database, tutte le istanze database in ogni cluster hanno gli stessi valori per questi parametri.
Per ulteriori informazioni su aurora_replica_read_consistency
, consulta Coerenza di lettura per l'inoltro di scrittura.
Per ulteriori informazioni sui gruppi di parametri database, consulta .
Identificazione delle transazioni e delle query inoltrate
È possibile usare la tabella information_schema.aurora_forwarding_processlist
per identificare le transazioni e le query inoltrate. Per ulteriori informazioni su questa tabella, consultare information_schema.aurora_forwarding_processlist.
L'esempio seguente mostra tutte le connessioni inoltrate su un'istanza database di scrittura.
mysql> select * from information_schema.AURORA_FORWARDING_PROCESSLIST where IS_FORWARDED=1 order by REPLICA_SESSION_ID; +-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+----------------------+----------------+ | ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO | IS_FORWARDED | REPLICA_SESSION_ID | REPLICA_INSTANCE_IDENTIFIER | REPLICA_CLUSTER_NAME | REPLICA_REGION | +-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+---------------------------------------+ | 648 | myuser |
IP_address:port1
| sysbench | Query | 0 | async commit | UPDATE sbtest58 SET k=k+1 WHERE id=4802579 | 1 | 637 | my-db-cluster-instance-2 | my-db-cluster | us-west-2 | | 650 | myuser |IP_address:port2
| sysbench | Query | 0 | async commit | UPDATE sbtest54 SET k=k+1 WHERE id=2503953 | 1 | 639 | my-db-cluster-instance-2 | my-db-cluster | us-west-2 | +-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+----------------------+----------------+
Nell'istanza database di lettura di inoltro, è possibile visualizzare i thread associati a queste connessioni database di scrittura eseguendoSHOW PROCESSLIST
. Il valori REPLICA_SESSION_ID
sull'istanza di scrittura, 637 e 639, sono identici ai valoriId
sull'istanza di lettura.
mysql> select @@aurora_server_id; +---------------------------------+ | @@aurora_server_id | +---------------------------------+ | my-db-cluster-instance-2 | +---------------------------------+ 1 row in set (0.00 sec) mysql> show processlist; +-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+ | 637 | myuser |
IP_address:port1
| sysbench | Query | 0 | async commit | UPDATE sbtest12 SET k=k+1 WHERE id=4802579 | | 639 | myuser |IP_address:port2
| sysbench | Query | 0 | async commit | UPDATE sbtest61 SET k=k+1 WHERE id=2503953 | +-----+----------+--------------------+----------+---------+------+--------------+---------------------------------------------+ 12 rows in set (0.00 sec)