Uso de réplicas de lectura de MySQL - Amazon Relational Database Service

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Uso de réplicas de lectura de MySQL

Esta sección contiene información específica acerca de cómo utilizar las réplicas de lectura en Amazon RDS MySQL. Para obtener información general sobre las réplicas de lectura e instrucciones sobre cómo usarlas, consulte Trabajo con réplicas de lectura.

Configuración de réplicas de lectura con MySQL

Para que una instancia de base de datos de MySQL pueda servir como origen de replicación, asegúrese de habilitar las copias de seguridad automáticas en la instancia de base de datos de origen. Para ello, debe establecer el periodo de retención de copia de seguridad en un valor distinto de 0. Este requisito también es válido para una réplica de lectura que sea la instancia de base de datos de origen de otra réplica de lectura. Las copias de seguridad automáticas solo se admiten para las réplicas de lectura en las que se ejecuta cualquier versión de MySQL 5.6 y posteriores. Puede configurar la replicación en función de las coordenadas de los registros binarios para las instancias de base de datos MySQL.

En la versión 5.7.23 y versiones posteriores de MySQL 5.7 en Amazon RDS, puede configurar la replicación usando identificadores de transacciones globales (GTID). Para obtener más información, consulte Uso de replicación basada en GTID para Amazon RDS MySQL.

Puede crear hasta cinco réplicas de lectura a partir de una instancia de base de datos. Para que la replicación sea eficaz, cada réplica de lectura debe tener la misma cantidad de recursos de computación y de almacenamiento que la instancia de base de datos de origen. Si modifica la escala de la instancia de base de datos de origen, debe ajustar también la escala de las réplicas de lectura.

Si en una réplica de lectura se ejecuta cualquier versión de MySQL 5.6 y posteriores, puede especificarla como instancia de base de datos de origen para otra réplica de lectura. Por ejemplo, puede crear RéplicaLectura1 a partir de MiInstanciaBD y crear a continuación RéplicaLectura2 a partir de RéplicaLectura1. Las actualizaciones realizadas en MiInstanciaBD se replican en RéplicaLectura1 y a continuación se replican desde RéplicaLectura1 en RéplicaLectura2. En una cadena de replicación no pueden participar más de cuatro instancias. Por ejemplo, puede crear RéplicaLectura1 desde MiInstanciaBDorigen, crear a continuación RéplicaLectura2 desde RéplicaLectura1 y crear después RéplicaLectura3 desde RéplicaLectura2, pero no puede crear RéplicaLectura4 desde RéplicaLectura3.

Si promociona una réplica de lectura de MySQL que a su vez se replica en otras réplicas de lectura, esas réplicas de lectura permanecen activas. Considere un ejemplo en el que MiInstanciaBD1 se replica en MiInstanciaBD2 y MiInstanciaBD2 se replica en MiInstanciaBD3. Si se promueve MiInstanciaBD2, la replicación de MiInstanciaBD1 a MiInstanciaBD2 deja de producirse, pero MiInstanciaBD2 se sigue replicando en MyDBInstance3.

Para habilitar las copias de seguridad automáticas en una réplica de lectura para la version 5.6 y posteriores de MySQL en Amazon RDS, primero cree la réplica de lectura. A continuación, modifique la réplica de lectura para habilitar copias de seguridad automáticas.

Puede ejecutar varias acciones de creación o eliminación de réplicas de lectura al mismo tiempo que hagan referencia a la misma instancia de base de datos origen. Para ello, permanezca dentro del límite de cinco réplicas de lectura para cada instancia de origen.

Una réplica de lectura de una instancia de base de datos MySQL no puede usar una versión de motor de base de datos inferior que su instancia de base de datos de origen.

Preparación de instancias de base de datos de MySQL que usan MyISAM

Si una instancia de base de datos MySQL usa un motor no transaccional como MyISAM, debe llevar a cabo los siguientes pasos para configurar la réplica de lectura. Estos pasos son necesarios para garantizar que la réplica de lectura tiene una copia coherente de los datos. Los pasos no son necesarios si todas las tablas usan un motor transaccional como InnoDB.

  1. Detenga todas las operaciones de lenguaje de manipulación de datos (DML) y lenguaje de definición de datos (DDL) que se lleven a cabo en las tablas no transaccionales de la instancia de base de datos de origen y espere a que se completen. Las declaraciones SELECT pueden seguir ejecutándose.

  2. Vacíe y bloquee las tablas de la instancia de base de datos de origen.

  3. Cree la réplica de lectura usando uno de los métodos que se describen en las siguientes secciones.

  4. Compruebe el progreso de la creación de la réplica de lectura usando, por ejemplo, la operación de la API DescribeDBInstances. Una vez que la réplica de lectura esté disponible, desbloquee las tablas de la instancia de base de datos de origen y reanude las operaciones normales de la base de datos.

Configuración de la replicación retrasada con MySQL

Puede utilizar la replicación retrasada como estrategia de recuperación de desastres. Con la replicación retardada, se especifica el tiempo mínimo, en segundos, que se retardará la replicación desde la instancia de origen a la réplica de lectura. En caso de desastre, por ejemplo, si se elimina una tabla involuntariamente, el procedimiento siguiente permite recuperarse rápidamente del desastre:

nota
  • En MySQL 5.7 en Amazon RDS, la replicación retrasada se admite para MySQL 5.7.22 y versiones posteriores. En MySQL 5.6 en Amazon RDS, la replicación retrasada se admite para MySQL 5.6.40 y versiones posteriores. La replicación retrasada no es compatible en MySQL 8.0 en Amazon RDS.

  • Use procedimientos almacenados para configurar la replicación retardada. La replicación retrasada no se puede configurar con la Consola de administración de AWS, la AWS CLI o la API de Amazon RDS.

  • En la versión 5.7.23 y versiones posteriores de MySQL 5.7 en Amazon RDS, puede usar la replicación basada en GTID en una configuración de replicación retrasada. Si usa una replicación basada en GTID, use el procedimiento almacenado mysql.rds_start_replication_until_gtid en lugar del procedimiento almacenado mysql.rds_start_replication_until. Para obtener más información sobre la replicación basada en GTID, consulte Uso de replicación basada en GTID para Amazon RDS MySQL.

Configuración de la replicación retrasada durante la creación de réplicas de lectura

Para configurar la replicación retardada para cualquier réplica de lectura futura creada a partir de una instancia de base de datos, ejecute el procedimiento almacenado mysql.rds_set_configuration con el parámetro target delay.

Para configurar la replicación retardada durante la creación de réplicas de lectura

  1. Utilice un cliente de MySQL para conectarse como usuario maestro a la instancia de base de datos MySQL que vaya a ser el origen de las réplicas de lectura.

  2. Ejecute el procedimiento almacenado mysql.rds_set_configuration con el parámetro target delay.

    Por ejemplo, ejecute el siguiente procedimiento almacenado para especificar que la replicación se retardará al menos una hora (3600 segundos) para todas las réplicas de lectura creadas desde la instancia de base de datos actual.

    call mysql.rds_set_configuration('target delay', 3600);
    nota

    Después de ejecutar este procedimiento almacenado, todas las réplicas de lectura que cree mediante la AWS CLI o la API de Amazon RDS se configurarán con la replicación retardada el número de segundos especificado.

Modificación de la replicación retrasada para una réplica de lectura existente

Para modificar la replicación retardada para una réplica de lectura existente, ejecute el procedimiento almacenado mysql.rds_set_source_delay.

Para modificar la replicación retardada de una réplica de lectura existente

  1. Use un cliente de MySQL para conectarse como usuario maestro a la réplica de lectura.

  2. Utilice el procedimiento almacenado mysql.rds_stop_replication para detener la replicación.

  3. Ejecute el procedimiento almacenado mysql.rds_set_source_delay.

    Por ejemplo, ejecute el siguiente procedimiento almacenado para especificar que la replicación en la réplica de lectura se retardará al menos una hora (3600 segundos).

    call mysql.rds_set_source_delay(3600);
  4. Utilice el procedimiento almacenado mysql.rds_start_replication para iniciar la replicación.

Establecimiento de una ubicación para detener la replicación en una réplica de lectura

Después de detener la replicación en la réplica de lectura, puede utilizar el procedimiento almacenado mysql.rds_start_replication_until para iniciar la replicación y volver a detenerla en una ubicación concreta del registro binario.

Para iniciar la replicación en una réplica de lectura y detenerla en una ubicación concreta

  1. Use un cliente de MySQL para conectarse como usuario maestro a la instancia de base de datos MySQL de origen.

  2. Ejecute el procedimiento almacenado mysql.rds_start_replication_until.

    En el ejemplo siguiente se inicia la replicación y se replican los cambios hasta que alcanza la ubicación 120 del archivo registro binario mysql-bin-changelog.000777. En una situación de recuperación de desastres, supongamos que la ubicación 120 es justo anterior al desastre.

    call mysql.rds_start_replication_until( 'mysql-bin-changelog.000777', 120);

La replicación se detiene automáticamente cuando se alcanza el punto de detención. Se genera el siguiente evento de RDS: Replication has been stopped since the replica reached the stop point specified by the rds_start_replication_until stored procedure.

Después de que se detenga la replicación, en una situación de recuperación de desastres, puede usar Promoción de una réplica de lectura para convertirla en una instancia de base de datos independiente para promocionar la réplica de lectura para que sea la nueva instancia de base de datos de origen. Para obtener información acerca de la promoción de la réplica de lectura, consulte Promoción de una réplica de lectura para convertirla en una instancia de base de datos independiente.

Actualizaciones de réplicas de lectura con MySQL

Las réplicas de lectura se han diseñado para permitir las consultas de lectura, pero puede necesitar actualizaciones ocasionales. Por ejemplo, puede necesitar añadir un índice para optimizar los tipos concretos de consultas que obtienen acceso a la réplica. Puede habilitar las actualizaciones estableciendo el parámetro read_only en 0 en el grupo de parámetros de base de datos para la réplica de lectura. Tenga cuidado cuando deshabilite la opción de solo lectura en una réplica de lectura, ya que puede provocar problemas si la réplica de lectura es incompatible con la instancia de base de datos de origen. Cambie el valor del parámetro read_only a 1 lo antes posible.

Implementaciones de réplicas de lectura Multi-AZ con MySQL

Puede crear una réplica de lectura a partir de implementaciones de instancia de base de datos Single-AZ o Multi-AZ. Puede usar implementaciones Multi-AZ para mejorar la durabilidad y la disponibilidad de los datos críticos, pero no puede usar la implementación Multi-AZ secundaria para responder a consultas de solo lectura. En lugar de ello, puede crear réplicas de lectura a partir de una instancia de base de datos Multi-AZ con un tráfico elevado para descargar las consultas de solo lectura. Si la instancia de origen de una implementación Multi-AZ conmuta a la secundaria, las réplicas de lectura asociadas cambian automáticamente para usar la secundaria (ahora principal) como origen de replicación. Para obtener más información, consulte Alta disponibilidad (Multi-AZ) para Amazon RDS.

Puede crear réplicas de lectura como una instancia de base de datos Multi-AZ. Amazon RDS crea una réplica en espera en otra zona de disponibilidad para permitir la conmutación por error de la réplica. La creación de su réplica de lectura como instancia de base de datos Multi-AZ es independiente de si la base de datos de origen es una instancia de base de datos Multi-AZ.

nota

Para crear una réplica de lectura como una instancia de base de datos de Multi-AZ, dicha instancia debe ser MySQL 5.6 o una versión posterior.

Monitoreo de réplicas de lectura de MySQL

Para las réplicas de lectura de MySQL, puede monitorear el retraso de replicación en Amazon CloudWatch mediante la visualización de la métrica ReplicaLag de Amazon RDS. La métrica ReplicaLag indica el valor del campo Seconds_Behind_Master del comando SHOW SLAVE STATUS.

Los motivos comunes de retardo de la replicación para MySQL son los siguientes:

  • Una interrupción de la red.

  • Escritura en tablas con índices diferentes en una réplica de lectura. Si el parámetro read_only se establece en 0 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ámetro read_only en 1.

  • Uso de un motor de almacenamiento no transaccional como MyISAM. La replicación solo se admite para el motor de almacenamiento InnoDB en MySQL.

Cuando la métrica ReplicaLag llegue a 0, la réplica estará funcionando al mismo ritmo que la instancia de base de datos de origen. Si la métrica ReplicaLag devuelve -1, la replicación no está activa. ReplicaLag = -1 es equivalente a Seconds_Behind_Master = NULL.

Inicio y detención de replicaciones con réplicas de lectura de MySQL

Puede detener y reiniciar el proceso de replicación en una instancia de base de datos de Amazon RDS llamando a los procedimientos mysql.rds_stop_replication y mysql.rds_start_replication almacenados en el sistema. Puede hacerlo cuando replique entre dos instancias de Amazon RDS para las operaciones de larga duración, como la creación de índices grandes. También debe detener y comenzar la replicación cuando importe o exporte bases de datos. Para obtener más información, consulte Importación de datos a una instancia de base de datos MySQL o MariaDB en Amazon RDS con tiempo de inactividad reducido y Exportación de datos desde una instancia de base de datos MySQL mediante replicación.

Si la replicación se detiene durante más de 30 días consecutivos, ya sea manualmente o a causa de un error de replicación, Amazon RDS termina la replicación entre la instancia de base de datos de origen y todas las réplicas de lectura Realiza ese procedimiento para impedir que aumenten los requisitos de almacenamiento en la instancia de base de datos de origen y que se incrementen los tiempos de conmutación por error. La instancia de base de datos de la réplica de lectura seguirá estando disponible. Sin embargo, la replicación no se podrá reanudar porque los registros binarios requeridos por la réplica de lectura se eliminan de la instancia de base de datos de origen cuando termina la replicación. Puede crear una nueva réplica de lectura para la instancia de base de datos de origen si desea restablecer la replicación.

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 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 el riesgo de que esto ocurra definiendo los siguientes valores de variables dinámicas: sync_binlog=1, innodb_flush_log_at_trx_commit=1 e innodb_support_xa=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. Para MySQL 5.5, sync_binlog toma de forma predeterminada el valor 0, pero en MySQL 5.6 y versiones posteriores, es menos probable que se produzcan problemas porque todos estos parámetros están establecidos en los valores recomendados de forma predeterminada.

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 las 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 en 0 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ámetro read_only en 1.

  • 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 Determination of Safe and Unsafe Statements in Binary Logging.

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 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 enlace 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.