Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Hat die mySQL-Replikation eine sofortige Datenkonsistenz?

Konsistenz im Sinne von ACID bedeutet, dass alle Einschränkungen vor und nach jeder Änderung erfüllt sind. Wenn ein System versichert, dass Sie keine Daten lesen können, die inkonsistent sind, sagen sie beispielsweise, dass Sie niemals Daten lesen werden, bei denen eine untergeordnete Zeile auf eine nicht vorhandene übergeordnete Zeile verweist oder bei denen die Hälfte einer Transaktion angewendet wurde, aber die die andere Hälfte wurde noch nicht angewendet (das Lehrbuchbeispiel ist die Belastung eines Bankkontos, aber noch keine Gutschrift auf dem Bankkonto des Empfängers).

Die Replikation in MySQL ist standardmäßig asynchron oder bestenfalls "halbsynchron". Sicherlich verzögert es sich in beiden Fällen. Tatsächlich hinkt das Replikat immer mindestens einen Bruchteil einer Sekunde hinterher, weil der Master keine Änderungen in sein Binärlog schreibt, bis die Transaktion festgeschrieben ist, dann muss das Replikat das Binärlog herunterladen und das Ereignis weiterleiten.

Aber die Änderungen sind immer noch atomar. Teilweise geänderte Daten können nicht gelesen werden. Sie lesen entweder festgeschriebene Änderungen, in diesem Fall sind alle Einschränkungen erfüllt, oder die Änderungen wurden noch nicht festgeschrieben, in diesem Fall sehen Sie den Status der Daten vor Beginn der Transaktion.

Sie könnten also vorübergehend alt lesen Daten in einem Replikationssystem, das verzögert, aber Sie werden inkonsistent nicht lesen Daten.

Wohingegen Sie in einem "eventuell konsistenten" System teilweise aktualisierte Daten lesen könnten, bei denen das eine Konto belastet, aber das zweite Konto noch nicht gutgeschrieben wurde. Also können Sie siehe widersprüchliche Daten.

Sie haben Recht, dass Sie beim Lesen von Replikaten vorsichtig sein müssen, wenn Ihre Anwendung absolut aktuelle Daten erfordert. Jede Anwendung hat eine andere Toleranz für Replikationsverzögerungen, und tatsächlich haben verschiedene Abfragen innerhalb einer Anwendung unterschiedliche Toleranzen für Verzögerungen. Ich habe dazu eine Präsentation gehalten:Lese-/Schreib-Aufteilung für MySQL und PHP (Percona-Webinar 2013)