Je souhaite savoir pourquoi je reçois un message d'erreur en lecture seule lorsque mon cluster de bases de données Amazon Aurora édition compatible avec MySQL tombe en panne.
Brève description
Lorsqu'un cluster de bases de données Aurora compatible avec MySQL fait l’objet d’un basculement multi-AZ, les points de terminaison du cluster sont automatiquement mis à jour. L'ancien enregistreur redémarre et passe en mode lecture seule, puis Aurora promeut un réplica existant au statut d’enregistreur. Les résultats reflètent ce changement et indiquent les nouveaux rôles d'enregistreur et de lecteur.
Vous pouvez recevoir un message d'erreur en lecture seule lorsque vous utilisez le rôle de lecteur pour effectuer l'une des opérations suivantes via un nœud existant :
- Opération de langage de définition des données (DDL)
- Opération de langage de manipulation des données (DML)
- Opération de langage de contrôle des données (DCL)
Résolution
Déterminer si le rôle est en lecture seule
Pour vérifier si le rôle est en lecture seule, utilisez la variable innodb_read_only.
Exemple de sortie :
mysql> show variables where variable_name='innodb_read_only';+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_read_only | ON |
+------------------+-------+
1 row in set (0.01 sec)
Utiliser le point de terminaison d’enregistreur du cluster
Le rôle d'une instance de base de données dans un cluster Aurora MySQL peut changer. Il est recommandé d'utiliser le point de terminaison d’enregistreur du cluster pour vous assurer de toujours pointer vers le dernier enregistreur. Si vous utilisez un point de terminaison d'instance de base de données ou une adresse IP directe, vous ne saurez peut-être pas qu'un basculement se produit. Lorsque vous vous reconnectez au même hôte, une erreur en lecture seule s'affiche et vous ne pouvez pas effectuer de modifications DDL ou DML.
Ne pas mettre excessivement en cache le DNS
Si vous n'utilisez pas de pilote intelligent, vous dépendez des mises à jour et de la propagation des enregistrements DNS après un événement de basculement. Les zones DNS Aurora MySQL utilisent une durée de vie (TTL) brève de 5 secondes. Les configurations de votre réseau et de vos clients ne doivent pas augmenter la TTL. La mise en cache DNS s'effectue au niveau de plusieurs couches d'une architecture, telles que le système d'exploitation, la couche réseau ou le conteneur d'application. Si la mise en cache DNS est involontaire au-delà de 5 secondes, vous pouvez vous reconnecter à l'ancien enregistreur après un basculement.
Les machines virtuelles Java (JVM) peuvent mettre excessivement en cache le DNS. Lorsque la JVM transforme un nom d'hôte en adresse IP, elle met l'adresse IP en cache pendant une période spécifiée. Dans certaines configurations, la TTL par défaut de la JVM actualise les entrées DNS uniquement au redémarrage de la JVM et peut provoquer des erreurs de lecture seule après le basculement. Pour résoudre ce problème, définissez manuellement une brève TTL afin que les entrées DNS soient régulièrement actualisées.
Utiliser le pilote JDBC AWS Advanced
Les points de terminaison du cluster de bases de données Aurora MySQL propagent automatiquement les mises à jour des enregistrements DNS. Lorsqu'un événement se produit sur la base de données, la mise à jour des enregistrements DNS peut être retardée. Dans ce cas, l'application gère l'événement.
Le pilote AWS Advanced JDBC (Java Database Connectivity) Wrapper Driver utilise la topographie du cluster de bases de données via la table de métadonnées INFORMATION_SCHEMA.REPLICA_HOST_STATUS. Le tableau étant affiché en temps quasi réel, le pilote AWS Advanced JDBC Wrapper Driver achemine les connexions vers le rôle approprié. Il équilibre également la charge entre les réplicas existants. Utilisez le modèle de proxy en Java pour implémenter l'AWS Advanced JDBC Wrapper. Vous devez ajouter les pilotes Aurora MySQL natifs en tant que dépendances. Pour plus d'informations, consultez la page Modèle de proxy en Java sur le site Web de Baeldung. Vous pouvez télécharger l'AWS Advanced JDBC Wrapper sur le site Web de GitHub.
Pour plus d'informations, consultez la section Limiter la durée d’indisponibilité à une seconde maximum avec le pilote Advanced JDBC Wrapper Driver lors de la mise à niveau de clusters de bases de données Amazon RDS Multi-AZ.
Remarque : Une mise en cache DNS excessive peut affecter le pilote AWS Advanced JDBC Wrapper Driver. Pour plus d'informations, consultez la section Améliorer la disponibilité des applications sur Amazon Aurora.
Tester l'instance à laquelle vous êtes connecté
Si vous n'utilisez pas de pilote intelligent, testez l'instance après avoir établi une nouvelle connexion. Pour vérifier si vous êtes connecté à l'instance d’enregistreur, utilisez la variable @@innodb_read_only. Si vous recevez la valeur 0, cela signifie que vous êtes connecté à l’enregistreur.
Exemple de sortie :
mysql> select @@innodb_read_only;+--------------------+
| @@innodb_read_only |
+--------------------+
| 0 |
+--------------------+
1 row in set (0.00 sec)
Informations connexes
Manuel de l'administrateur de base de données Amazon Aurora MySQL
Connexions aux points de terminaison Amazon Aurora