Retraso de replicación

En esta página se describe cómo solucionar problemas de latencia de replicación en réplicas de lectura de Cloud SQL.

Información general

Las réplicas de lectura de Cloud SQL usan la replicación basada en filas de MySQL con identificadores de transacción global (GTID). Los cambios se escriben en el registro binario de la instancia principal y se envían a la réplica, donde se reciben y se aplican a la base de datos.

La latencia de replicación puede producirse en varios casos, como los siguientes:

  • La instancia principal no puede enviar los cambios a la réplica con la suficiente rapidez.
  • La réplica no puede recibir los cambios con la suficiente rapidez.
  • La réplica no puede aplicar los cambios con la suficiente rapidez.
Utilice la métrica network_lag para monitorizar los dos primeros casos en los que la instancia principal no puede enviar los cambios con la suficiente rapidez o la réplica no puede recibirlos con la suficiente rapidez.

El retraso total se observa con la métrica replica_lag. La diferencia entre replica_lag y network_lag puede indicar el tercer motivo por el que la réplica no puede aplicar los cambios de replicación con la suficiente rapidez. Estas métricas se describen en la sección Monitorizar el retraso de la réplica de abajo.

Configuración de réplicas más rápida

Hay dos formas de hacer que una réplica de MySQL aplique los cambios más rápido. Los usuarios pueden configurar sus réplicas con las siguientes opciones:

  • Replicación paralela
  • Descarga de alto rendimiento

Replicación paralela

La replicación en paralelo puede ayudar a reducir el retraso de la replicación configurando la réplica para que use varios subprocesos que actúen en paralelo para aplicar los cambios en la réplica. Para obtener información sobre cómo usar la replicación en paralelo, consulta Configurar la replicación en paralelo.

Vaciado de alto rendimiento

De forma predeterminada, Cloud SQL para MySQL vacía los registros de rehacer en el disco después de cada transacción. El vaciado de alto rendimiento reduce la frecuencia con la que los registros de rehacer se vacían en el disco a una vez por segundo, lo que mejora el rendimiento de escritura.

Define la marca innodb_flush_log_at_trx_commit en la réplica de lectura como 2. También debe asignar un valor más alto a la marca sync_binlog para que la marca innodb_flush_log_at_trx_commit sea efectiva.

Consulta Consejos para trabajar con marcas para obtener más información sobre esta marca.

Si la marca innodb_flush_log_at_trx_commit está definida en la réplica de lectura y Cloud SQL detecta que puede haberse producido un fallo, Cloud SQL recrea automáticamente la réplica.

Optimizar consultas y esquemas

En esta sección se sugieren algunas optimizaciones habituales de consultas y esquemas que puedes hacer para mejorar el rendimiento de la replicación.

Nivel de aislamiento de consultas en la réplica de lectura

Los niveles de aislamiento de transacciones REPEATABLE READ y SERIALIZABLE adquieren bloqueos que pueden bloquear los cambios de replicación. Puedes reducir el nivel de aislamiento de las consultas en la réplica. El nivel de aislamiento de transacciones READ COMMITTED puede ofrecer un mejor rendimiento.

Transacciones de larga duración en la base de datos principal

Si se actualiza un gran número de filas en una sola transacción, puede producirse un aumento repentino en el número de cambios que deben aplicarse a la instancia principal y, a continuación, enviarse a la réplica. Esto se aplica a las actualizaciones o eliminaciones de una sola instrucción que afectan a muchas filas a la vez. Los cambios se envían a la réplica después de confirmarse. Si se aplica un aumento repentino de los cambios en la réplica, puede aumentar la posibilidad de que se produzca una contención de bloqueos en la réplica si la carga de consultas en la réplica también es alta, lo que provoca un retraso en la replicación.

Considera la posibilidad de dividir las transacciones grandes en varias más pequeñas.

Faltan claves principales

Las réplicas de lectura de Cloud SQL utilizan la replicación basada en filas, que no funciona bien si las tablas de MySQL que se replican no tienen claves principales. Recomendamos que todas las tablas replicadas tengan claves principales.

En MySQL 8 o versiones posteriores, le recomendamos que defina la marca sql_require_primary_key como ON para que las tablas de su base de datos tengan claves principales.

Bloqueos exclusivos debido a DDL

Los comandos del lenguaje de definición de datos (DDL), como ALTER TABLE y CREATE INDEX, pueden provocar un retraso en la réplica debido a los bloqueos exclusivos. Para evitar conflictos de bloqueo, programa la ejecución de DDL en momentos en los que la carga de consultas en las réplicas sea menor.

Réplica sobrecargada

Si una réplica de lectura recibe demasiadas consultas, la replicación podría bloquearse. Te recomendamos que dividas las lecturas entre varias réplicas para reducir la carga de cada una.

Para evitar picos en las consultas, considera la posibilidad de limitar las consultas de lectura de réplicas en la lógica de tu aplicación o en una capa de proxy, si utilizas una.

Si hay picos de actividad en la instancia principal, considera la posibilidad de espaciar las actualizaciones.

Base de datos principal monolítica

Considera la posibilidad de fragmentar la base de datos principal verticalmente (u horizontalmente) para evitar que una o varias tablas con retraso impidan el funcionamiento del resto de las tablas.

Monitorizar el retraso de la replicación

Puedes usar las métricas replica_lag y network_lag para monitorizar la latencia de replicación e identificar si la causa de la latencia está en la base de datos principal, en la red o en la réplica.

MétricaDescripción
Retraso de la replicación
(cloudsql.googleapis.com/database/replication/replica_lag)

Número de segundos que el estado de la réplica está por detrás del estado de la instancia principal. Es la diferencia entre la hora actual y la marca de tiempo original en la que la base de datos principal confirmó la transacción que se está aplicando en la réplica. En concreto, las escrituras pueden considerarse retrasadas aunque la réplica las haya recibido, si aún no las ha aplicado a la base de datos.

Esta métrica indica el valor de Seconds_Behind_Master cuando SHOW SLAVE STATUS se ejecuta en la réplica. Para obtener más información, consulta Checking Replication Status (Comprobar el estado de la replicación) en el manual de referencia de MySQL.

Número del último error de E/S del hilo
(cloudsql.googleapis.com/database/mysql/replication/last_io_errno)

Indica el último error que ha provocado que falle el hilo de E/S. Si es distinto de cero, la replicación no funciona. Aunque es poco habitual, puede ocurrir. Consulta la documentación de MySQL para saber qué indica el código de error. Por ejemplo, es posible que se hayan eliminado archivos de registro binario de la instancia principal antes de que la réplica los recibiera. Cloud SQL suele volver a crear la réplica automáticamente si la replicación se interrumpe. Esta métrica last_io_errno puede indicarte el motivo.

Último número de error del subproceso SQL
(cloudsql.googleapis.com/database/mysql/replication/last_sql_errno)

Indica el último error que ha provocado que falle el subproceso SQL. Si es distinto de cero, la replicación no funciona. Aunque es poco habitual, puede ocurrir. Consulta la documentación de MySQL para saber qué indica el código de error. Cloud SQL suele recrear automáticamente la réplica si la replicación se interrumpe. Esta métrica last_sql_errno puede indicarte el motivo.

Retraso de la red
(cloudsql.googleapis.com/database/replication/network_lag)

Tiempo (en segundos) que transcurre desde que se escribe el archivo de registro binario en la base de datos principal hasta que llega al subproceso de E/S en la réplica.

Si el valor de network_lag es cero o insignificante, pero el de replica_lag es alto, significa que el subproceso SQL no puede aplicar los cambios de replicación con la suficiente rapidez.

Verificar la replicación

Para verificar que la replicación funciona, ejecuta la siguiente instrucción en la réplica:

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Queueing master event to the relay log
                  Master_Host: xx.xxx.xxx.xxx
                  Master_User: cloudsqlreplica
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.199927
          Read_Master_Log_Pos: 83711956
               Relay_Log_File: relay-log.000025
                Relay_Log_Pos: 24214376
        Relay_Master_Log_File: mysql-bin.199898
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 24214163
              Relay_Log_Space: 3128686571
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: Yes
           Master_SSL_CA_File: master_server_ca.pem
           Master_SSL_CA_Path: /mysql/datadir
              Master_SSL_Cert: replica_cert.pem
            Master_SSL_Cipher:
               Master_SSL_Key: replica_pkey.pem
        Seconds_Behind_Master: 2627
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 321071839
                  Master_UUID: 437d04e9-8456-11e8-b13d-42010a80027b
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: System lock
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: 437d04e9-8456-11e8-b13d-42010a80027b:52111095710-52120776390
            Executed_Gtid_Set: 437d04e9-8456-11e8-b13d-42010a80027b:1-52113039508
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)

Si se está produciendo la replicación, en la primera columna, Slave_IO_State, se muestra Waiting for master to send event o un mensaje similar. Además, el campo Last_IO_Error está vacío.

Si no se está produciendo la replicación, en la columna Slave_IO_State se muestra el estado Connecting to master y en la columna Last_IO_Error se muestra el estado error connecting to master cloudsqlreplica@x.x.x.x:3306.

Según la documentación de MySQL, hay otros campos interesantes relacionados con la latencia de replicación, como los siguientes:

CampoDescripción
Master_Log_File
El nombre del archivo de registro binario de origen del que está leyendo el subproceso de E/S.
Read_Master_Log_Pos
Posición en el archivo de registro binario de origen actual hasta la que ha leído el subproceso de E/S.
Relay_Log_File
Nombre del archivo de registro de retransmisión del que el subproceso SQL está leyendo y ejecutando.
Relay_Log_Pos
Posición en el archivo de registro de réplica actual hasta la que el subproceso SQL ha leído y ejecutado.
Relay_Master_Log_File
Nombre del archivo de registro binario de origen que contiene el evento más reciente ejecutado por el subproceso SQL.

En el ejemplo anterior, Relay_Master_Log_File tiene el valor mysql-bin.199898. Master_Log_File tiene el valor mysql-bin.199927. El sufijo numérico 199898 es inferior a 199927. Esto significa que, aunque la réplica haya recibido un archivo de registro mysql-bin.199927 más reciente, sigue aplicando el mysql-bin.199898 anterior.

En este caso, el subproceso SQL está retrasado en la réplica.

También puedes conectarte a la base de datos principal y ejecutar lo siguiente:

  SHOW MASTER STATUS;

Este comando muestra en qué archivo binlog se está escribiendo en la base de datos principal.

Si el archivo de registro binario de la base de datos principal es más reciente que el Master_Log_File de la réplica, significa que el subproceso de E/S está retrasado. La réplica sigue leyendo un archivo de registro binario antiguo de la base de datos principal.

Cuando el subproceso de E/S se retrasa, la métrica network_lag también es alta. Cuando el subproceso SQL se retrasa, pero el subproceso de E/S no, la métrica network_lag no es tan alta, pero la métrica replica_lag sí lo es.

Los comandos anteriores te permiten observar los detalles del retraso mientras se produce, pero las métricas network_lag y replica_lag te ofrecen una forma de consultar las incidencias anteriores del retraso.

Recrear réplica con retraso

Recrea una réplica con retraso cuando la replicación se retrase un periodo de tiempo aceptable.

Con Cloud SQL, puedes configurar tu réplica de lectura para que se vuelva a crear si la replicación se retrasa más de un periodo de tiempo aceptable y ese retraso persiste durante al menos cinco minutos.

Si defines un retraso de replicación aceptable de menos de 360 segundos (seis minutos) y se produce un retraso de replicación de al menos 361 segundos durante más de cinco minutos, al cabo de cinco minutos, la instancia principal crea una nueva instantánea de sí misma y la réplica de lectura se vuelve a crear con esta instantánea.

Recrear una réplica de lectura con retraso ofrece las siguientes ventajas:

  • Tú controlas lo que se considera un intervalo aceptable para la latencia de replicación.
  • Puedes reducir el tiempo dedicado a solucionar problemas de retraso de la replicación en horas o incluso días.

Se aplican detalles adicionales sobre las funciones:

  • Compatible con las siguientes versiones:
    • MySQL 5.7
    • MySQL 8.0
    • MySQL 8.4
  • Se debe definir un intervalo aceptable para el retraso de la replicación en segundos.
  • El valor mínimo aceptable es de 300 segundos o cinco minutos.
  • El valor máximo aceptable es de 31.536.000 segundos o un año.
    • Si habilita la opción para recrear réplicas con retraso en una instancia, pero no define el retraso de replicación máximo aceptable, Cloud SQL usará el valor predeterminado de un año.
  • Tipos de instancias admitidos:
    • Réplica de lectura
    • Réplica de lectura entre regiones
    • Réplica en cascada
  • El valor asignado al campo replicationLagMaxSeconds es específico de cada instancia de réplica. Si una instancia principal tiene varias instancias de réplica, puede asignar un valor diferente a cada réplica.
  • Cuando se recrea una réplica, los usuarios pueden experimentar un tiempo de inactividad mientras se completan las siguientes operaciones:
    • La replicación se ha detenido.
    • La réplica se elimina.
    • Se crea una captura de la instancia principal.
    • La réplica se vuelve a crear a partir de esta última instantánea. La nueva réplica usa el mismo nombre y la misma dirección IP que la réplica anterior. Como resultado, MySQL debe detenerse y reiniciarse.
    • La nueva réplica empieza a replicar datos.
  • El campo replicationLagMaxSeconds es un campo a nivel de instancia. Cada instancia tiene su propio valor.
  • Si tienes varias réplicas de lectura para la misma instancia principal, puedes definir un valor único para el campo replicationLagMaxSeconds de cada réplica.

    Definir umbrales de tiempo diferentes para distintas réplicas puede ayudarte a evitar que todas las réplicas fallen al mismo tiempo.

Habilitar la recreación de la réplica con retraso

La función de recreación de réplicas con retraso está inhabilitada de forma predeterminada. Para habilitarlo al crear una instancia, utiliza uno de los siguientes métodos:

gcloud

Usa el comando gcloud sql instances create para crear una instancia de réplica de lectura con la marca
--replication-lag-max-seconds-for-recreate:

gcloud beta sql instances create REPLICA_INSTANCE_NAME \
  --master-instance-name=PRIMARY_INSTANCE_NAME \
  --database-version=DATABASE_VERSION \
  --tier=TIER \
  --edition=EDITION \
  --region=REGION \
  --root-password=PASSWORD \
  --replication-lag-max-seconds-for-recreate=REPLICATION_LAG_MAX_SECONDS

Donde:

  • REPLICA_INSTANCE_NAME es el nombre de la instancia de réplica.
  • PRIMARY_INSTANCE_NAME es el nombre de la instancia principal.
  • DATABASE_VERSION es la versión de la base de datos de la instancia. Por ejemplo, MYSQL_8_0_31.
  • TIER es el tipo de máquina que quieres usar para la instancia réplica. Por ejemplo, db-perf-optimized-N-4. Para obtener más información, consulta Configuraciones de instancias personalizadas.
  • EDITION es la edición que quieres usar para la instancia de réplica. Por ejemplo, ENTERPRISE_PLUS. Para obtener más información, consulta Crear una instancia.
  • REGION es la región que quieres usar para la instancia réplica. Por ejemplo, us-central1.
  • PASSWORD es la contraseña raíz de la instancia.
  • REPLICATION_LAG_MAX_SECONDS es el retraso de replicación máximo aceptable en segundos. Por ejemplo, 600. El valor mínimo aceptable es de 300 segundos o cinco minutos. El valor máximo aceptable es de 31.536.000 segundos (un año).

API REST

El campo replicationLagMaxSeconds se encuentra en el recurso DatabaseInstance. Añade este campo al cuerpo de la solicitud:

{
  "settings": {
  "replicationLagMaxSeconds" :REPLICATION_LAG_MAX_SECONDS,
  }
  ...
}

Donde:

  • REPLICATION_LAG_MAX_SECONDS es el retraso de replicación máximo aceptable en segundos. Por ejemplo, 600.

Actualizar el periodo de recreación de la latencia de replicación

Para ver los ajustes de una instancia, usa cualquiera de los métodos descritos en Ver información de resumen de una instancia.

Con esta información, puedes elegir si quieres actualizar el periodo de desfase de la réplica que has especificado como aceptable antes de que se vuelva a crear la réplica.

gcloud

Usa el comando gcloud sql instances patch para actualizar el periodo en el que se recreará la instancia en función del retraso de la replicación:

gcloud beta sql instances patch INSTANCE_NAME \
  --replication-lag-max-seconds-for-recreate=REPLICATION_LAG_MAX_SECONDS

Donde:

  • INSTANCE_NAME es el nombre de la instancia.
  • REPLICATION_LAG_MAX_SECONDS es el retraso de replicación máximo aceptable en segundos. Por ejemplo, 700. Si quieres volver al valor predeterminado de un año, introduce 31536000. El valor mínimo aceptable es de 300 segundos o cinco minutos. El valor máximo aceptable es de 31.536.000 segundos (un año).

API REST

La política se puede actualizar con instances.patch y instance.insert.

Para ver un ejemplo de cómo actualizar el ajuste con la API REST, consulta Editar una instancia.

Limitaciones

Se aplican las siguientes limitaciones a la recreación de réplicas con retraso:

  • Los valores de replicationLagMaxSeconds solo se pueden definir en segundos.
  • Los índices creados en la réplica de lectura antes de una operación de recreación no se conservarán. Si existe un índice, crea un índice secundario después de recrear la réplica.
  • Para evitar tiempos de inactividad frecuentes en las réplicas de lectura, las recreaciones se limitan a una por día y por instancia.
  • Esta función no admite réplicas de servidores externos.
  • Si habilitas la recreación de réplicas con retraso en una réplica en cascada, Cloud SQL recreará primero las réplicas hoja para mantener la coherencia de la replicación.
  • Volver a crear una réplica entre regiones conlleva un coste adicional.
  • No puedes habilitar la recreación de réplicas con retraso en la consola de Google Cloud .

Siguientes pasos