Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Utilisation du transfert d'écriture local dans un cluster Amazon Aurora My SQL DB
Le transfert d'écriture local (intracluster) permet à vos applications d'émettre des transactions de lecture/écriture directement sur un réplica Aurora. Ces transactions sont ensuite transférées à l'instance de base de données d'enregistreur pour être validées. Vous pouvez utiliser le transfert d'écriture local lorsque vos applications ont besoin de read-after-write cohérence, c'est-à-dire de la capacité de lire la dernière écriture d'une transaction.
Les réplicas en lecture reçoivent des mises à jour de manière asynchrone de la part de l'enregistreur. Sans transfert d'écriture, vous devez effectuer toutes les lectures nécessitant de la read-after-write cohérence sur l'instance de base de données du rédacteur. Ou vous devez développer une logique d'application personnalisée complexe pour tirer parti de plusieurs réplicas en lecture pour assurer la capacité de mise à l'échelle. Vos applications doivent diviser entièrement l'ensemble du trafic de lecture et d'écriture, en conservant deux ensembles de connexions à la base de données pour envoyer le trafic au point de terminaison correct. Cette surcharge de développement complique la conception de l'application lorsque les requêtes font partie d'une seule session logique, ou transaction, au sein de l'application. De plus, comme le retard de réplication peut différer entre les réplicas en lecture, il est difficile d'obtenir une cohérence de lecture globale entre toutes les instances dans la base de données.
Le transfert d'écriture évite d'avoir à diviser ces transactions ou à les envoyer exclusivement à l'enregistreur, ce qui simplifie le développement des applications. Cette nouvelle fonctionnalité permet d'effectuer facilement la mise à l'échelle en lecture des charges de travail qui doivent lire la dernière écriture dans une transaction et qui ne sont pas sensibles à la latence d'écriture.
Le transfert d'écriture local est différent du transfert d'écriture global, qui transfère les écritures d'un cluster de bases de données secondaire vers le cluster de bases de données principal dans une base de données globale Aurora. Vous pouvez utiliser le transfert d'écriture local dans un cluster de bases de données faisant partie d'une base de données globale Aurora. Pour de plus amples informations, veuillez consulter Utilisation du transfert d'écriture dans une base de données globale Amazon Aurora.
Le transfert d'écriture local nécessite Aurora My SQL version 3.04 ou supérieure.
Rubriques
- Activation du transfert d'écriture local
- Vérification de l'activation du transfert d'écriture dans un cluster de bases de données
- Application et SQL compatibilité avec le transfert d'écriture
- Niveaux d'isolation pour le transfert d'écriture
- Cohérence de lecture pour le transfert d'écriture
- Exécution d'instructions en plusieurs parties avec le transfert d'écriture
- Transactions avec transfert d'écriture
- Paramètres de configuration pour le transfert d'écriture
- Amazon CloudWatch Metrics et variables de SQL statut Aurora My pour le transfert d'écriture
- Identification des transactions et des requêtes transférées
Vérification de l'activation du transfert d'écriture dans un cluster de bases de données
Pour déterminer si vous pouvez utiliser le transfert d'écriture dans un cluster de bases de données, vérifiez que le cluster possède l'attribut LocalWriteForwardingStatus
réglé sur enabled
.
Dans le volet AWS Management Console, dans l'onglet Configuration de la page de détails du cluster, le statut Activé pour le transfert d'écriture de répliques de lecture locales s'affiche.
Pour connaître l'état du paramètre de transfert d'écriture pour tous vos clusters, exécutez ce qui suit AWS CLI commande.
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 de bases de données peut avoir les valeurs suivantes pour LocalWriteForwardingStatus
:
-
disabled
: le transfert d'écriture est désactivé. -
disabling
: le transfert d'écriture est en cours de désactivation. -
enabled
: le transfert d'écriture est activé. -
enabling
: le transfert d'écriture est en cours d'activation. -
null
: le transfert d'écriture n'est pas disponible pour ce cluster de bases de données. -
requested
: le transfert d'écriture a été demandé, mais n'est pas encore actif.
Application et SQL compatibilité avec le transfert d'écriture
Vous pouvez utiliser les types d'SQLinstructions suivants avec le transfert d'écriture :
-
Instructions du langage de manipulation des données (DML)
INSERT
, telles queDELETE
, etUPDATE
. Il existe certaines restrictions concernant les propriétés de ces instructions que vous pouvez utiliser avec le transfert d'écriture, comme décrit ci-dessous. -
Instructions
SELECT ... LOCK IN SHARE MODE
etSELECT FOR UPDATE
. -
Instructions
PREPARE
etEXECUTE
.
Certaines instructions ne sont pas autorisées ou peuvent produire des résultats obsolètes lorsque vous les utilisez dans un cluster de bases de données avec transfert d'écriture. Ainsi, le paramètre EnableLocalWriteForwarding
est désactivé par défaut pour les clusters de bases de données. Avant de l'activer, vérifiez que votre code d'application n'est affecté par aucune de ces restrictions.
Les restrictions suivantes s'appliquent aux SQL instructions que vous utilisez pour le transfert d'écriture. Dans certains cas, vous pouvez utiliser les instructions sur des clusters de bases de données avec le transfert d'écriture activé. Cette approche fonctionne si le transfert d'écriture n'est pas activé dans la session par le paramètre de configuration aurora_replica_read_consistency
. Si vous essayez d'utiliser une instruction alors qu'elle n'est pas autorisée en raison du transfert d'écriture, vous verrez un message d'erreur semblable au suivant :
ERROR 1235 (42000): This version of MySQL doesn't yet support '
operation
with write forwarding'.
- Langage de définition des données (DDL)
-
Connectez-vous à l'instance de base de données Writer pour exécuter DDL des instructions. Vous ne pouvez pas les exécuter à partir des instances de base de données de lecteur.
- Mise à jour d'une table permanente à l'aide des données d'une table temporaire
-
Vous pouvez utiliser des tables temporaires sur des clusters de bases de données avec le transfert d'écriture activé. Toutefois, vous ne pouvez pas utiliser une DML instruction pour modifier une table permanente si l'instruction fait référence à une table temporaire. Par exemple, vous ne pouvez pas utiliser une instruction
INSERT ... SELECT
qui prend les données d'une table temporaire. - Transactions XA
-
Vous ne pouvez pas utiliser les instructions suivantes sur un cluster de bases de données lorsque le transfert d'écriture est activé dans la session. Vous pouvez utiliser ces instructions sur des clusters de bases de données pour lesquels le transfert d'écriture n'est pas activé, ou dans des sessions où le paramètre
aurora_replica_read_consistency
est vide. Avant d'activer le transfert d'écriture dans une session, vérifiez si votre code utilise ces instructions.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]
- LOADdéclarations pour les tables permanentes
-
Vous ne pouvez pas utiliser les instructions suivantes sur un cluster de bases de données avec le transfert d'écriture activé.
LOAD DATA INFILE 'data.txt' INTO TABLE t1; LOAD XML LOCAL INFILE 'test.xml' INTO TABLE t1;
- Instructions de plugin
-
Vous ne pouvez pas utiliser les instructions suivantes sur un cluster de bases de données avec le transfert d'écriture activé.
INSTALL PLUGIN example SONAME 'ha_example.so'; UNINSTALL PLUGIN example;
- SAVEPOINTdéclarations
-
Vous ne pouvez pas utiliser les instructions suivantes sur un cluster de bases de données lorsque le transfert d'écriture est activé dans la session. Vous pouvez utiliser ces instructions sur des clusters de bases de données pour lesquels le transfert d'écriture n'est pas activé, ou dans des sessions où le paramètre
aurora_replica_read_consistency
est vide. Vérifiez si votre code utilise ces instructions avant d'activer le transfert d'écriture dans une session.SAVEPOINT t1_save; ROLLBACK TO SAVEPOINT t1_save; RELEASE SAVEPOINT t1_save;
Niveaux d'isolation pour le transfert d'écriture
Dans les sessions qui utilisent le transfert d'écriture, vous ne pouvez utiliser uniquement le niveau d'isolement REPEATABLE READ
. Bien que vous puissiez également utiliser le niveau d'isolement READ COMMITTED
avec des réplicas Aurora, ce niveau d'isolement ne fonctionne pas avec le transfert d'écriture. Pour de plus amples informations sur les niveaux d'isolement REPEATABLE READ
et READ COMMITTED
, veuillez consulter Niveaux d'SQLisolation d'Aurora My.
Exécution d'instructions en plusieurs parties avec le transfert d'écriture
Une DML déclaration peut être composée de plusieurs parties, telles qu'une INSERT ... SELECT
déclaration ou une DELETE ...
WHERE
déclaration. Dans ce cas, l'instruction entière est transférée vers l'instance de base de données d'enregistreur pour y être exécutée.
Transactions avec transfert d'écriture
Si le mode d'accès aux transactions est réglé sur lecture seule, le transfert d'écriture n'est pas utilisé. Vous pouvez spécifier le mode d'accès de la transaction à l'aide de l'instruction SET TRANSACTION
ou de l'instruction START TRANSACTION
. Vous pouvez également spécifier le mode d'accès aux transactions en modifiant la valeur de la variable de session transaction_read_only
Si une transaction de longue durée n'émet aucune instruction pendant une longue période, elle peut dépasser le délai d'inactivité. La valeur par défaut de cette période est d'une minute. Vous pouvez définir le paramètre aurora_fwd_writer_idle_timeout
pour l'augmenter jusqu'à un jour. Une transaction qui dépasse le délai d'inactivité est annulée par l'instance d'enregistreur. L'instruction suivante que vous soumettez reçoit une erreur de délai d'attente. Puis Aurora restaure la transaction.
Ce type d'erreur peut se produire dans d'autres cas, lorsque le transfert d'écriture devient indisponible. Par exemple, Aurora annule toutes les transactions qui utilisent le transfert d'écriture si vous redémarrez le cluster de bases de données ou si vous désactivez le transfert d'écriture.
Lorsqu'une instance d'enregistreur dans un cluster utilisant le transfert d'écriture local est redémarrée, toutes les transactions et requêtes actives et transférées sur les instances de lecteur utilisant le transfert d'écriture local sont automatiquement fermées. Une fois que l'instance d'enregistreur est à nouveau disponible, vous pouvez réessayer ces transactions.
Paramètres de configuration pour le transfert d'écriture
Les groupes de paramètres de base de données Aurora incluent des paramètres pour la fonctionnalité de transfert d'écriture. Les détails sur ces paramètres sont résumés dans le tableau suivant, avec des notes d'utilisation après le tableau.
Paramètre | Portée | Type | Valeur par défaut | Valeurs valides |
---|---|---|---|---|
aurora_fwd_writer_idle_timeout |
Cluster | Entier non signé | 60 | 1–86 400 |
aurora_fwd_writer_max_connections_pct |
Cluster | Entier long non signé | 10 | 0–90 |
aurora_replica_read_consistency |
Cluster ou instance | Enum | '' (null) | EVENTUAL , SESSION , GLOBAL |
Pour contrôler les demandes d'écriture entrantes, utilisez les paramètres suivants :
-
aurora_fwd_writer_idle_timeout
: nombre de secondes pendant lesquelles l'instance de base de données d'enregistreur attend une activité sur une connexion transférée depuis une instance de lecteur avant de la fermer. Si la session reste inactive au-delà de cette période, Aurora l'annule. -
aurora_fwd_writer_max_connections_pct
: limite supérieure des connexions de base de données qui peuvent être utilisées sur une instance de base de données d'enregistreur pour gérer les requêtes transférées à partir des instances de lecteur. Il est exprimé sous la forme d'un pourcentage du paramètremax_connections
pour l'enregistreur. Par exemple, si la valeurmax_connections
est 800 etaurora_fwd_master_max_connections_pct
ouaurora_fwd_writer_max_connections_pct
10, le rédacteur autorise un maximum de 80 sessions transférées simultanées. Ces connexions proviennent du même groupe de connexions géré par le paramètremax_connections
.Ce paramètre s'applique uniquement à l'enregistreur quand le transfert d'écriture est activé. Si vous diminuez la valeur, les connexions existantes ne sont pas affectées. Aurora prend en compte la nouvelle valeur du paramètre lors de la tentative de création d'une nouvelle connexion à partir d'un cluster de bases de données. La valeur par défaut est 10, ce qui représente 10 % de la valeur
max_connections
.
Note
Comme aurora_fwd_writer_idle_timeout
et aurora_fwd_writer_max_connections_pct
sont des paramètres de cluster de bases de données, toutes les instances de base de données de chaque cluster ont les mêmes valeurs pour ces paramètres.
Pour plus d'informations sur aurora_replica_read_consistency
, consultez Cohérence de lecture pour le transfert d'écriture.
Pour plus d'informations sur les groupes de paramètres de base de données, consultez Groupes de paramètres pour Amazon Aurora.
Identification des transactions et des requêtes transférées
Vous pouvez utiliser la table information_schema.aurora_forwarding_processlist
pour identifier les transactions et les requêtes transférées. Pour plus d'informations sur cette table, consultez information_schema.aurora_forwarding_processlist.
L'exemple suivant montre toutes les connexions transférées sur une instance de base de données d'enregistreur.
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 | +-----+----------+--------------------+----------+---------+------+--------------+--------------------------------------------+--------------+--------------------+---------------------------------+----------------------+----------------+
Sur l'instance de base de données du lecteur de transfert, vous pouvez voir les threads associés à ces connexions de base de données d'écriture en exécutant SHOW PROCESSLIST
. Les valeurs de REPLICA_SESSION_ID
sur l'enregistreur, 637 et 639, sont les mêmes que les valeurs de Id
sur le lecteur.
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)