sql >> Base de Datos >  >> RDS >> Mysql

¿La replicación mySQL tiene consistencia de datos inmediata?

La consistencia en el sentido en que se usa en ACID significa que todas las restricciones se cumplen antes y después de cualquier cambio. Cuando un sistema asegura que no puede leer datos que son inconsistentes, están diciendo, por ejemplo, que nunca leerá datos donde una fila secundaria hace referencia a una fila principal inexistente, o donde se ha aplicado la mitad de una transacción pero el la otra mitad aún no se ha aplicado (el ejemplo del libro de texto es debitar una cuenta bancaria pero aún no haber acreditado la cuenta bancaria del destinatario).

La replicación en MySQL es asíncrona por defecto, o "semi-síncrona" en el mejor de los casos. Ciertamente se retrasa en cualquier caso. De hecho, la réplica de replicación siempre se retrasa al menos una fracción de segundo, porque el maestro no escribe cambios en su registro binario hasta que se confirma la transacción, luego la réplica tiene que descargar el registro binario y transmitir el evento.

Pero los cambios siguen siendo atómicos. No puede leer datos que han cambiado parcialmente. O lee los cambios confirmados, en cuyo caso se cumplen todas las restricciones, o los cambios aún no se han confirmado, en cuyo caso ve el estado de los datos antes de que comenzara la transacción.

Por lo tanto, es posible que lea temporalmente antiguo datos en un sistema de replicación que se retrasa, pero no leerá inconsistente datos.

Mientras que en un sistema "eventualmente coherente", es posible que lea datos que están parcialmente actualizados, donde se ha debitado una cuenta pero aún no se ha acreditado la segunda cuenta. Así que puedes ver datos inconsistentes.

Tiene razón en que es posible que deba tener cuidado al leer réplicas si su aplicación requiere datos absolutamente actuales. Cada aplicación tiene una tolerancia diferente para el retraso de la replicación y, de hecho, dentro de una aplicación, las diferentes consultas tienen una tolerancia diferente para el retraso. Hice una presentación sobre esto:División de lectura/escritura para MySQL y PHP (Seminario web de Percona 2013)