Mysql
 sql >> Base de données >  >> RDS >> Mysql

La réplication mySQL a-t-elle une cohérence immédiate des données ?

La cohérence au sens où elle est utilisée dans ACID signifie que toutes les contraintes sont satisfaites avant et après tout changement. Lorsqu'un système assure que vous ne pouvez pas lire des données incohérentes, il dit par exemple que vous ne lirez jamais des données où une ligne enfant fait référence à une ligne parent inexistante, ou où la moitié d'une transaction a été appliquée mais la l'autre moitié n'a pas encore été appliquée (l'exemple classique débite un compte bancaire mais n'a pas encore crédité le compte bancaire du destinataire).

La réplication dans MySQL est asynchrone par défaut, ou "semi-synchrone" au mieux. Certes, il est en retard dans les deux cas. En fait, le réplica de réplication est toujours en retard d'au moins une fraction de seconde, car le maître n'écrit pas les modifications dans son journal binaire tant que la transaction n'est pas validée, puis le réplica doit télécharger le journal binaire et relayer l'événement.

Mais les changements sont encore atomiques. Vous ne pouvez pas lire des données partiellement modifiées. Soit vous lisez les modifications validées, auquel cas toutes les contraintes sont satisfaites, soit les modifications n'ont pas encore été validées, auquel cas vous voyez l'état des données avant le début de la transaction.

Donc, vous pourriez temporairement lire ancien données dans un système de réplication qui est en retard, mais vous ne lirez pas incohérent données.

Alors que dans un système "à terme cohérent", vous pouvez lire des données partiellement mises à jour, où le premier compte a été débité mais le deuxième compte n'a pas encore été crédité. Ainsi, vous pouvez voir des données incohérentes.

Vous avez raison de dire que vous devrez peut-être faire attention à la lecture des répliques si votre application nécessite des données absolument à jour. Chaque application a une tolérance différente pour le décalage de réplication et, en fait, dans une application, différentes requêtes ont une tolérance différente pour le décalage. J'ai fait une présentation à ce sujet :Séparation lecture/écriture pour MySQL et PHP (Webinaire Percona 2013)