Solución de problemas de réplicas de lectura de MySQL
Para las instancias de base de datos MySQL, en algunos casos, las réplicas de lectura tienen errores de replicación o incoherencias de datos (o ambos) entre la réplica de lectura y su instancia de base de datos de origen. Este problema se produce cuando algunos eventos de binglog o registros redo de InnoDB no se vacían durante un error de la réplica de lectura o la instancia de base de datos de origen. En estos casos, elimine y vuelva a crear manualmente las réplicas de lectura. Puede reducir la probabilidad de que esto ocurra al establecer los siguientes valores de parámetro: sync_binlog=1
y innodb_flush_log_at_trx_commit=1
. Estos ajustes pueden reducir el desempeño, así que es aconsejable probar su impacto antes de implementar los cambios en un entorno de producción.
aviso
En el grupo de parámetros asociado con la instancia de base de datos de origen, recomendamos mantener estos valores de parámetros: sync_binlog=1
y innodb_flush_log_at_trx_commit=1
. Estos parámetros son dinámicos. Si no quiere utilizar esta configuración, le recomendamos configurar temporalmente esos valores antes de ejecutar cualquier operación en la instancia de base de datos de origen que pueda provocar que se reinicie. Estas operaciones incluyen, entre otras, el reinicio, el reinicio con conmutación por error, la actualización de la versión de la base de datos y el cambio de la clase de la instancia de base de datos o su almacenamiento. La misma recomendación se aplica a la creación de nuevas réplicas de lectura de la instancia de base de datos de origen.
Si no se siguen estas recomendaciones, se aumenta el riesgo de que las réplicas de lectura tengan errores de replicación o incoherencias de datos (o ambos) entre la réplica de lectura y su instancia de base de datos de origen.
Las tecnologías de replicación para MySQL son asíncronas. Como son asíncronas, cabe esperar aumentos ocasionales de BinLogDiskUsage
en la instancia de base de datos de origen y de ReplicaLag
en la réplica de lectura. Por ejemplo, en paralelo se pueden realizar gran volumen de operaciones de escritura en la instancia de base de datos de origen. En cambio, las operaciones de escritura en la réplica de lectura se serializan con un único subproceso E/S que puede provocar un retraso entre la instancia de origen y la réplica de lectura. Para obtener más información acerca de las réplicas de solo lectura en la documentación de MySQL, consulte Replication Implementation Details
Puede hacer varias cosas para reducir el retraso entre las actualizaciones de una instancia de base de datos de origen y las actualizaciones posteriores de la réplica de lectura. Por ejemplo, puede hacer lo siguiente:
-
Dimensionar una réplica de lectura para que tenga un tamaño de almacenamiento y una clase de instancia de base de datos comparables a los de la instancia de base de datos de origen.
-
Asegurarse de que los valores de los parámetros de los grupos de parámetros de base de datos utilizados en la instancia de base de datos de origen y la réplica de lectura son compatibles. Para obtener más información y un ejemplo, consulte el análisis del parámetro
max_allowed_packet
que se puede encontrar más adelante en esta sección.
Amazon RDS monitorea el estado de la replicación de las réplicas de lectura y actualiza el campo Replication State
de la instancia de la réplica de lectura a Error
si la replicación se detiene por cualquier motivo. Un ejemplo de ello pueden ser las consultas DML que se ejecutan en la réplica de lectura y que entran en conflicto con las actualizaciones realizadas en la instancia de base de datos de origen.
Puede revisar los detalles del error asociado mostrado por el motor de MySQL visualizando el campo Replication Error
. También se generan eventos que indican el estado de la réplica de lectura, entre los que se incluyen RDS-EVENT-0045, RDS-EVENT-0046 y RDS-EVENT-0047. Para obtener más información acerca de los eventos y la suscripción a ellos, consulte Uso de notificaciones de eventos de Amazon RDS. Si aparece un mensaje de error de MySQL, revise el número del error en la documentación sobre los mensajes de error de MySQL
Un problema frecuente que puede causar errores de replicación es que el valor del parámetro max_allowed_packet
de una réplica de lectura sea inferior al parámetro max_allowed_packet
de la instancia de base de datos de origen. El parámetro max_allowed_packet
es un parámetro personalizado que puede establecer en un grupo de parámetros de base de datos. Utilice max_allowed_packet
para especificar el tamaño máximo del código DML que se puede ejecutar en la base de datos. En algunos casos, el valor de max_allowed_packet
en el grupo de parámetros de base de datos asociado a una réplica de lectura es inferior al valor de max_allowed_packet
del grupo de parámetros de base de datos asociado a la instancia de base de datos de origen. En estos casos, el proceso de replicación puede generar el error Packet bigger than
'max_allowed_packet' bytes
y detener la replicación. Para resolver el error, haga que la instancia de base de datos de origen y la réplica de lectura usen grupos de parámetros de base de datos con los mismos valores del parámetro max_allowed_packet
.
Entre las situaciones comunes que pueden causar errores de replicación se incluyen las siguientes:
Escritura en tablas en una réplica de lectura. En algunos casos, puede crear índices en una réplica de lectura que sean diferentes de los índices de la instancia de base de datos de origen. Si lo hace, establezca el parámetro
read_only
en0
para crear los índices. Si escribe en tablas en la réplica de lectura, la replicación puede bloquearse si la réplica de lectura es incompatible con la instancia de base de datos de origen. Una vez que haya realizado las tareas de mantenimiento en la réplica de lectura, le recomendamos que vuelva a establecer el parámetroread_only
en1
.-
Uso de un motor de almacenamiento no transaccional como MyISAM. Las réplicas de lectura requieren un motor de almacenamiento transaccional. La replicación solo se admite para el motor de almacenamiento InnoDB en MySQL.
-
Uso de consultas no deterministas que no sean seguras, como
SYSDATE()
. Para obtener más información, consulte Determinación de instrucciones seguras e inseguras en el registro binario.
Si decide que es seguro hacer caso omiso de un error, puede seguir los pasos que se describen en la sección Omisión del error de replicación actual de RDS para MySQL. De no ser así, primero puede eliminar la réplica de lectura. A continuación, cree una instancia que use el mismo identificador de instancias de bases de datos para que el punto de conexión siga siendo el mismo que en la réplica de lectura antigua. Si se corrige un error de replicación, Replication State
cambia a replicating.