En un entorno de replicación semisincrónica de MySQL, confirmar una transacción grande suele provocar un tiempo de espera semisincrónico debido a que la transmisión del Binlog se prolonga. Esto degrada la replicación semisincrónica a replicación asincrónica y reduce la confiabilidad de los datos. Además, bloquea las transacciones posteriores y causa fluctuaciones en el rendimiento. Para resolver este problema, RDS for MySQL introduce la función de transmisión de binlog en tiempo real. Esta función envía por streaming el Binlog de una transacción grande a la instancia réplica mientras la transacción sigue en ejecución. Así, el tiempo de sincronización al momento de confirmar se reduce a milisegundos, lo que garantiza una alta confiabilidad de los datos y un rendimiento estable del servicio.
Descripción general de la función
Contexto
MySQL nativo utiliza un solo canal para transmitir el Binlog entre la instancia principal y la instancia réplica. Cuando el Binlog de una transacción grande ocupa este canal, bloquea la transmisión del Binlog de todas las transacciones posteriores. Esto genera una acumulación de transacciones que esperan confirmarse en la instancia principal y deja la instancia temporalmente sin capacidad de escritura. Para evitar tiempos de inactividad prolongados del servicio, MySQL introduce el parámetro rpl_semi_sync_master_timeout. Si la instancia réplica no confirma la recepción del Binlog dentro del tiempo especificado, la replicación semisincrónica se degrada a replicación asincrónica. Por lo tanto, las transacciones grandes pueden causar dos problemas principales:
Fluctuaciones de rendimiento: la instancia queda sin capacidad de escritura durante varios segundos y muchas solicitudes de confirmación se registran como consultas SQL lentas.
Menor confiabilidad: el modo de replicación se degrada, lo que puede provocar pérdida de datos en casos extremos.

Transmisión de binlog en tiempo real
En el modelo tradicional, el Binlog de una transacción se almacena en búfer dentro de la caché de Binlog de la instancia principal durante su ejecución. Solo cuando la transacción se confirma, se escribe en un archivo de Binlog y se envía a la instancia réplica. La función de transmisión de binlog en tiempo real de RDS for MySQL optimiza este proceso. Para cualquier transacción grande que supere un umbral definido, la función transmite continuamente los Binlog Events generados desde la caché de Binlog hacia la instancia réplica. Los eventos se almacenan temporalmente en una caché de Relay Log dedicada. Cuando la transacción se confirma en la instancia principal, solo se envía un comando de confirmación final. Entonces, la instancia réplica puede escribir de inmediato los datos almacenados en caché en su archivo de Relay Log y devolver una confirmación. Este diseño de streaming reduce el tiempo de transmisión del Binlog al confirmar de segundos a milisegundos, lo que elimina de manera efectiva los cuellos de botella de transmisión.

Principio técnico: el diseño de la caché de Relay Log
Para almacenar temporalmente los Binlog Events transmitidos por streaming en la instancia réplica, RDS for MySQL crea una caché de Relay Log dedicada para cada transacción grande. Antes de escribir los datos, el sistema reserva espacio al inicio de la caché para llenar después el encabezado del Relay Log Event. Esto permite convertir rápidamente la caché en un archivo de Relay Log. El sistema gestiona de forma inteligente los casos en los que el espacio reservado es insuficiente o excesivo: vuelve a la lógica original o rellena con un Empty Event, según corresponda. De esta manera, el mecanismo se mantiene robusto.
Aplicabilidad
Esta función requiere una de las siguientes versiones de base de datos:
MySQL 8.4
MySQL 8.0 con versión secundaria del motor 20250531 o posterior
Instrucciones
Habilite esta función mediante setting the following global parameters tanto en la instancia principal como en la instancia réplica. Los cambios en los parámetros surten efecto de inmediato, sin necesidad de reiniciar la instancia.
-
Para habilitar la función:
En la instancia principal:
loose_binlog_realtime_transmit_source_enabled=ONEn la instancia réplica:
loose_binlog_realtime_transmit_replica_enabled=ON
-
Parámetro principal:
loose_binlog_realtime_transmit_long_transaction_limit_sizePropósito: especifica el umbral de tamaño de una transacción que activa la transmisión en tiempo real. Cuando el Binlog generado por una transacción supera este tamaño, la función se activa automáticamente.
Valor predeterminado: 128 MB.
Beneficios
Simulamos un escenario de alta carga al ejecutar una transacción grande de 2 GB en una instancia con replicación semisincrónica. A continuación se muestran los resultados de la prueba:
Antes de la optimización (MySQL nativo): tras confirmar la transacción grande, las consultas por segundo (QPS) de la instancia caen a cero, lo que indica fluctuaciones graves de rendimiento. Después, el sistema se degrada al modo asincrónico debido a un tiempo de espera semisincrónico. Aunque el rendimiento se recupera, la confiabilidad de los datos queda comprometida.
Después de la optimización (RDS for MySQL): con la transmisión de binlog en tiempo real habilitada, las QPS de la instancia se mantienen estables incluso durante la confirmación de la transacción grande. Esto evita de manera efectiva las fluctuaciones de rendimiento y las degradaciones del modo de replicación.
