Lorsque la répartition lecture/écriture est activée, les requêtes de lecture sont distribuées vers des instances en lecture seule qui répliquent les données de manière asynchrone depuis l'instance principale. Une lecture effectuée immédiatement après une écriture risque alors de renvoyer des données obsolètes. Les niveaux de cohérence permettent au proxy de base de données d'équilibrer la fraîcheur des données lues et les performances.
ApsaraDB RDS for MySQL prend en charge trois niveaux de cohérence pour les endpoints de proxy de base de données en mode de répartition lecture/écriture : la cohérence à terme, la cohérence de session et la cohérence globale.
Le niveau de cohérence par défaut est la cohérence à terme. Si votre application nécessite des garanties de lecture après écriture, définissez explicitement un niveau de cohérence supérieur.
Fonctionnement
Le proxy de base de données utilise la réplication des journaux binaires (binlog) pour synchroniser les instances en lecture seule avec l'instance principale. Chaque transaction validée génère un événement binlog que les instances en lecture seule appliquent. La position des données sur chaque instance en lecture seule est suivie à l'aide d'un identifiant global de transaction (GTID), plus précisément la variable Executed_Gtid_Set, qui enregistre l'ensemble des transactions appliquées sur cette instance.
Pour la cohérence de session et la cohérence globale, le proxy utilise le suivi GTID pour acheminer les lectures uniquement vers les instances en lecture seule ayant déjà appliqué les transactions requises. Si aucune instance en lecture seule ne satisfait l'exigence GTID dans le délai d'expiration de la cohérence en lecture (par défaut : 10 ms), la requête revient à l'instance principale.
Niveaux de cohérence
Cohérence à terme (par défaut)
Les requêtes de lecture sont directement envoyées aux instances en lecture seule si la réplication des journaux binaires n'est pas interrompue. Étant donné que la réplication binlog est asynchrone, une instance en lecture seule peut ne pas encore refléter les dernières écritures de l'instance principale.
Exemple : Prenons les instructions suivantes dans une session :
SET AUTOCOMMIT = 1;
INSERT INTO t1(id, price) VALUES (111, 96);
UPDATE t1 SET price = 100 WHERE id = 111;
SELECT price FROM t1;
L'instruction SELECT peut renvoyer 96 au lieu de 100 si le décalage de réplication fait que la mise à jour n'est pas encore visible sur l'instance en lecture seule. La requête n'attend pas.
Quand l'utiliser : Votre charge de travail n'est pas sensible à la cohérence lecture après écriture et la maximisation de l'efficacité de la répartition lecture/écriture est prioritaire.
Cohérence de session
Le proxy de base de données enregistre le GTID de la transaction la plus récemment validée dans la session actuelle. Avant d'acheminer une lecture, il vérifie que l'instance en lecture seule cible a appliqué les transactions jusqu'à ce GTID. Cela garantit que, au sein d'une session, les lectures reflètent toujours les écritures de cette même session.
Exemple : Avec les mêmes instructions que ci-dessus, l'instruction SELECT attend que l'instance en lecture seule applique l'instruction UPDATE, puis renvoie 100.
Quand l'utiliser : Des dépendances de cohérence existent au sein d'une session. Ce niveau a un impact modéré sur les performances et convient à la plupart des charges de travail en production.
Cohérence globale
Le proxy de base de données enregistre le GTID de la transaction la plus récemment validée dans l'ensemble du cluster avant chaque lecture. Les lectures sont uniquement acheminées vers des instances en lecture seule qui ont appliqué toutes les transactions jusqu'à ce point, garantissant ainsi que chaque session voit une vue cohérente de la base de données.
Exemple : Chaque instruction SELECT attend que les modifications de données requises soient visibles sur l'instance en lecture seule avant de s'exécuter. Le temps d'attente varie selon le décalage de réplication.
Si la réplication accuse un retard, davantage de lectures sont redirigées vers l'instance principale, ce qui augmente la charge et la latence de celle-ci.
Quand l'utiliser : Des dépendances de cohérence existent entre les sessions et votre charge de travail comporte significativement plus de lectures que d'écritures.
Choisir un niveau de cohérence
Pour la plupart des charges de travail, utilisez la cohérence de session. Elle offre une cohérence lecture après écriture au sein de la session avec une surcharge minimale.
| Niveau de cohérence | Impact sur les performances de la répartition lecture/écriture | Force de la cohérence | Portée de la cohérence |
|---|---|---|---|
| Cohérence à terme | Aucun | Faible | Cohérence du résultat final |
| Cohérence de session | Moyen | Moyenne | Au sein d'une session |
| Cohérence globale | Élevé | Élevée | Entre toutes les sessions |
Utilisez la cohérence globale uniquement si votre application nécessite des garanties de lecture après écriture entre les sessions et si elle effectue significativement plus de lectures que d'écritures. La cohérence globale ajoute de la latence à chaque opération de lecture.
Prérequis
Avant de commencer, assurez-vous que :
Le proxy de base de données est activé et exécute la version 2.25.1 ou ultérieure. Consultez Activer la fonctionnalité de proxy de base de données et Notes de version du proxy de base de données.
L'attribut de l'endpoint du proxy de base de données est défini sur Read/Write (Read/Write Splitting). Consultez Configurer les attributs de lecture et d'écriture et le poids de lecture.
L'instance RDS exécute MySQL 5.7 (version mineure du moteur 20210630 ou ultérieure) ou MySQL 8.0 (version mineure du moteur 20210930 ou ultérieure).
Notes d'utilisation
Pour la cohérence de session et la cohérence globale, le proxy attend que les instances en lecture seule rattrapent la position GTID requise avant d'acheminer une lecture. Cela augmente la latence de lecture. Le temps d'attente maximal correspond au délai d'expiration de la cohérence en lecture (par défaut : 10 ms).
Lorsque la cohérence globale est utilisée et qu'un décalage de réplication se produit, le proxy redirige davantage de lectures vers l'instance principale, augmentant encore sa charge et sa latence.
Configurer le niveau de cohérence
Accédez à la page Instances. Dans la barre de navigation supérieure, sélectionnez la région où réside votre instance RDS, puis cliquez sur l'ID de l'instance.
Dans le volet de navigation de gauche, cliquez sur Database Proxy.
Dans la section Connection Information, repérez l'endpoint du proxy de base de données et cliquez sur Modify Configuration dans la colonne Actions.
Sélectionnez un niveau de cohérence.
Pour la cohérence à terme et la cohérence de session, vous pouvez définir un seuil de latence. La valeur par défaut est de 30 secondes. Si une instance en lecture seule dépasse ce seuil, le proxy cesse de lui acheminer des lectures.
Pour la cohérence de session et la cohérence globale, vous pouvez définir un read consistency timeout period . La valeur par défaut est de 10 ms.
Annexe : Implémentation de la cohérence de session et de la cohérence globale
Pour mettre en œuvre la cohérence de session et la cohérence globale, le proxy de base de données surveille la valeur Executed_Gtid_Set sur chaque instance en lecture seule, c'est-à-dire l'ensemble des transactions que cette instance a appliquées.
Avant d'acheminer chaque lecture, le proxy détermine le GTID requis et sélectionne une instance en lecture seule qui a déjà atteint cette position. Si aucune instance n'a rattrapé son retard dans le délai d'expiration de la cohérence en lecture, la requête revient à l'instance principale.
Le GTID requis diffère selon le niveau de cohérence :
Cohérence de session : Le GTID de la transaction la plus récemment validée dans la session actuelle.
Cohérence globale : Le GTID de la transaction la plus récemment validée dans l'ensemble du cluster.
Référence API
| Opération | Description |
|---|---|
| DescribeDBProxy | Interroge les paramètres détaillés du proxy de base de données pour une instance RDS. |
| DescribeDBProxyEndpoint | Interroge les informations relatives à un endpoint de proxy de base de données. |
| ModifyDBProxyEndpoint | Modifie les paramètres de connexion d'un endpoint de proxy de base de données. |