PolarDB propose quatre niveaux de cohérence pour la séparation lecture/écriture : cohérence à terme, cohérence de session, cohérence globale et cohérence globale (mode haute performance). Chaque niveau arbitre entre latence de lecture et fraîcheur des données : plus la cohérence est élevée, plus les lectures peuvent attendre la fin de la réplication.
Applicabilité
Le cluster doit comporter au moins un nœud en lecture seule (RO) pour permettre la configuration des niveaux de cohérence. En l'absence de nœuds en lecture seule, les paramètres de niveau de cohérence ne s'affichent pas dans la console PolarDB.
Choisir un niveau de cohérence
| Niveau | Attente en lecture ? | Charge du nœud principal | Scénario recommandé |
|---|---|---|---|
| Cohérence à terme | Jamais | La plus faible | Lectures de données anciennes acceptables ; maximisation de l'utilisation des nœuds en lecture seule |
| Cohérence de session | Uniquement si nécessaire au sein d'une session | Faible | Convient à la plupart des applications — garantit la visibilité des écritures au sein d'une même session |
| Cohérence globale | Oui, par requête | Plus élevée | Dépendances entre sessions, comme les scénarios de pool de connexions |
| Cohérence globale (mode haute performance) | Non (niveau noyau) | Surcharge minimale | PolarDB for MySQL 5.7, 8.0.1 ou 8.0.2 nécessitant une cohérence forte stricte |
Privilégiez la cohérence de session pour la majorité des charges de travail. Elle minimise l'impact sur les performances du cluster tout en répondant à la plupart des exigences de cohérence. Pour PolarDB for MySQL 5.6, optez plutôt pour la cohérence globale, car cette version ne prend pas en charge le mode haute performance.
Mécanisme de réplication des données dans PolarDB
PolarDB utilise une réplication physique asynchrone pour synchroniser les nœuds en lecture seule avec le nœud principal. Une fois une écriture terminée sur le nœud principal, les modifications se propagent aux nœuds en lecture seule, généralement en quelques millisecondes. Ce délai de réplication constitue la cause principale des incohérences de lecture dans une architecture avec séparation lecture/écriture.
Cohérence à terme
La cohérence à terme achemine toutes les lectures vers les nœuds en lecture seule sans aucune attente. Une instruction SELECT exécutée immédiatement après une écriture risque de retourner des données obsolètes si le délai de réplication n'est pas encore écoulé.
INSERT INTO t1(id, price) VALUES(111, 96);
UPDATE t1 SET price = 100 WHERE id=111;
SELECT price FROM t1; -- May return 96 instead of 100 if replication has not caught up
Ce niveau convient lorsque vous souhaitez maximiser l'utilisation des nœuds en lecture seule et que votre application tolère la lecture de données légèrement anciennes.
Cohérence de session
La cohérence de session, également appelée cohérence causale, garantit la visibilité des écritures au sein d'une même session. Après toute opération d'écriture, les lectures suivantes dans cette session reflètent systématiquement les résultats de cette écriture, même si elles sont routées vers un nœud en lecture seule.
Fonctionnement
PolarProxy suit le numéro de séquence de journal (LSN) appliqué sur chaque nœud. Chaque écriture enregistre son LSN comme LSN de session. Lorsqu'une lecture survient, PolarProxy la dirige uniquement vers les nœuds dont le LSN appliqué est supérieur ou égal au LSN de session. Si le LSN d'un nœud en lecture seule est inférieur au LSN de session, PolarProxy transmet la requête à ce nœud seulement s'il met à jour ses données avant l'expiration du délai spécifié.
Grâce à la réplication physique de PolarDB, le rattrapage est rapide. Pendant qu'un nœud en lecture seule retourne les résultats au client, la réplication vers les autres nœuds se poursuit en parallèle. Ainsi, les données sont mises à jour sur les nœuds en lecture seule avant l'arrivée des requêtes de lecture suivantes.

La cohérence de session convient à la plupart des applications. Elle préserve les avantages de la séparation lecture/écriture et de l'équilibrage de charge, tout en assurant des résultats cohérents au sein de chaque session.
Cohérence globale
La cohérence de session couvre les dépendances au sein d'une session unique. Elle ne gère pas les dépendances entre sessions, par exemple lorsqu'un pool de connexions attribue le même thread logique à différentes connexions base de données selon les requêtes. Dans ce cas, une écriture effectuée dans une session peut rester invisible pour une lecture issue d'une autre session.
La cohérence globale résout ce problème en vérifiant le dernier LSN du nœud principal avant chaque requête de lecture. PolarProxy regroupe plusieurs requêtes de lecture simultanées afin de récupérer le LSN principal en lot, ce qui réduit la surcharge. Dès que le LSN d'au moins un nœud en lecture seule atteint le LSN principal (LSN0), PolarProxy y achemine la lecture. Cela garantit que chaque lecture reflète toutes les écritures validées jusqu'au moment où la requête a été initiée.

Paramètres de configuration
| Paramètre | Nom affiché | Description | Valeurs valides | Valeur par défaut |
|---|---|---|---|---|
ConsistTimeout |
Global Consistency Timeout | Durée maximale pendant laquelle PolarProxy attend qu'un nœud en lecture seule atteigne le LSN principal après réception d'une requête de lecture. | 0–60000 | 20 (millisecondes) |
ConsistTimeoutAction |
Global Consistency Timeout Policy | Action déclenchée lorsque ConsistTimeout expire. 0 : router la lecture vers le nœud principal. 1 : retourner l'erreur wait replication complete timeout, please retry. |
0, 1 | 0 |
Pour modifier ces paramètres, consultez Configurer PolarProxy.
La cohérence globale est recommandée pour les scénarios traitant un grand volume de requêtes de lecture et peu d'écritures, tels que les pools de connexions avec des dépendances de lecture après écriture entre sessions. Si le délai de réplication est élevé, certaines lectures peuvent être redirigées vers le nœud principal, augmentant ainsi sa charge.
Cohérence globale (mode haute performance)
La cohérence globale (mode haute performance) offre une cohérence forte, soit une garantie supérieure à celle de la cohérence globale standard. Implémentée au niveau du noyau par PolarTrans, elle exploite le Commit Timestamp Store (CTS) et le Remote Direct Memory Access (RDMA). Cela assure que toutes les lectures provenant de n'importe quel nœud en lecture seule du cluster retournent des résultats fortement cohérents, sans la surcharge d'attente par requête propre à la cohérence globale classique.
Pour connaître les limites, le fonctionnement, la procédure d'activation et les benchmarks de performance, reportez-vous à Cohérence globale (mode haute performance).
Forcer une requête vers le nœud principal
Utilisez le hint /*FORCE_MASTER*/ pour envoyer une requête spécifique directement au nœud principal, quel que soit le niveau de cohérence configuré :
/*FORCE_MASTER*/ SELECT * FROM user;
Les hints bénéficient de la priorité de routage la plus élevée : ils priment sur les niveaux de cohérence et la séparation des transactions.
Remarques d'utilisation :
Lors de l'exécution de cette instruction depuis le client en ligne de commande MySQL, ajoutez l'option
-c, faute de quoi le client supprime le commentaire du hint. Pour plus de détails, consultez Options du client mysql.Les hints ne doivent pas contenir d'instructions SQL modifiant les variables d'environnement. Par exemple, l'utilisation de
/*FORCE_SLAVE*/ SET NAMES utf8;peut provoquer des erreurs.Évaluez l'impact sur votre charge de travail avant d'utiliser des hints en production, car ils contournent toute la logique d'équilibrage de charge.
Définir le niveau de cohérence
Cohérence à terme, cohérence de session ou cohérence globale : Configurez le niveau dans les paramètres de PolarProxy. Consultez Configurer PolarProxy.
Cohérence globale (mode haute performance) : Reportez-vous à Activer la cohérence globale (mode haute performance).
FAQ
Pourquoi les paramètres de cohérence ne s'affichent-ils pas dans la console ?
Les paramètres de niveau de cohérence ne s'affichent que si le cluster comporte au moins un nœud en lecture seule (RO). Si votre cluster ne possède aucun nœud en lecture seule, la section dédiée à la cohérence reste masquée dans la console PolarDB. Pour résoudre ce problème, ajoutez au moins un nœud en lecture seule au cluster. Pour plus d'informations, consultez Ajouter ou supprimer des nœuds.