Administrar réplicas de lectura

En esta página, se describe cómo administrar réplicas de lectura. Estas operaciones incluyen inhabilitar y habilitar la replicación, promover una réplica, configurar la replicación paralela y verificar el estado de la replicación.

Para obtener más información sobre cómo funciona la replicación, consulta Replicación en Cloud SQL.

Inhabilitar replicación

Según la configuración predeterminada, una réplica se inicia con su habilitación. Sin embargo, puedes inhabilitar la replicación, por ejemplo, para depurar o analizar el estado de una instancia. Cuando estés listo, habilita de nuevo la replicación de forma explícita. Inhabilitar o volver a habilitar la replicación no reinicia la instancia de réplica.

Cuando se inhabilita la replicación, no se detiene la instancia de réplica, sino que se convierte en una instancia de solo lectura que ya no se replica a partir de su instancia principal. Se te seguirá cobrando por la instancia. En la réplica inhabilitada, puedes volver a habilitar la replicación, borrar la réplica o ascenderla a una instancia independiente.

Para inhabilitar la replicación:

Console

  1. En la consola de Google Cloud, ve a la página Instancias de Cloud SQL.

    Ir a Instancias de Cloud SQL

  2. Haz clic en el nombre de una instancia de réplica para seleccionarla.
  3. Haz clic en Inhabilitar replicación en la barra de botones.
  4. Haz clic en Aceptar.

gcloud

gcloud sql instances patch REPLICA_NAME \
--no-enable-database-replication

REST v1

Para ejecutar este comando cURL en una ventana de línea de comandos, debes adquirir un token de acceso con el comando gcloud auth print-access-token. También puedes usar el Explorador de API en la página de parches de instancias para enviar la solicitud a la API de REST.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • project-id: El ID del proyecto
  • replica-name: El nombre de la instancia de réplica

Método HTTP y URL:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/replica-name

Cuerpo JSON de la solicitud:

{
  "settings":
  {
    "databaseReplicationEnabled": "False"
  }
}

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

REST v1beta4

Para ejecutar este comando cURL en una ventana de línea de comandos, debes adquirir un token de acceso con el comando gcloud auth print-access-token. También puedes usar el Explorador de API en la página de parches de instancias para enviar la solicitud a la API de REST.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • project-id: El ID del proyecto
  • replica-name: El nombre de la instancia de réplica

Método HTTP y URL:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/replica-name

Cuerpo JSON de la solicitud:

{
  "settings":
  {
    "databaseReplicationEnabled": "False"
  }
}

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

Habilitar replicación

Si una réplica no se repitió durante mucho tiempo, tardará más en alcanzar a la instancia principal. En este caso, borra la réplica y crea una nueva.

Para habilitar la replicación:

Console

  1. En la consola de Google Cloud, ve a la página Instancias de Cloud SQL.

    Ir a Instancias de Cloud SQL

  2. Haz clic en el nombre de una instancia de réplica para seleccionarla.
  3. Haz clic en Habilitar replicación.
  4. Haz clic en Aceptar.

gcloud

gcloud sql instances patch REPLICA_NAME \
--enable-database-replication

REST v1

Para ejecutar este comando cURL en una ventana de línea de comandos, debes adquirir un token de acceso con el comando gcloud auth print-access-token. También puedes usar el Explorador de API en la página de parches de instancias para enviar la solicitud a la API de REST.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • project-id: El ID del proyecto
  • replica-name: El nombre de la instancia de réplica

Método HTTP y URL:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/replica-name

Cuerpo JSON de la solicitud:

{
  "settings":
  {
    "databaseReplicationEnabled": "True"
  }
}

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

REST v1beta4

Para ejecutar este comando cURL en una ventana de línea de comandos, debes adquirir un token de acceso con el comando gcloud auth print-access-token. También puedes usar el Explorador de API en la página de parches de instancias para enviar la solicitud a la API de REST.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • project-id: El ID del proyecto
  • replica-name: El nombre de la instancia de réplica

Método HTTP y URL:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/replica-name

Cuerpo JSON de la solicitud:

{
  "settings":
  {
    "databaseReplicationEnabled": "True"
  }
}

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

Ascender una réplica

Si asciendes una réplica de lectura, se detendrá la replicación y la instancia pasará a ser una instancia principal de Cloud SQL independiente con funciones de lectura y escritura.

Cuando se ascienden, las réplicas de lectura se configuran de forma automática con copias de seguridad, pero no se configuran automáticamente como instancias con alta disponibilidad (HA). Puedes habilitar la alta disponibilidad después de ascender la réplica como lo harías con cualquier instancia que no sea de réplica. La configuración de una réplica de lectura para alta disponibilidad se realiza de la misma manera que para una instancia principal. Obtén más información sobre cómo configurar la instancia para alta disponibilidad.

Antes de ascender una réplica de lectura, si la instancia principal sigue disponible y entrega contenido a los clientes, debes hacer lo siguiente:

  1. Detén todas las operaciones de escritura en la instancia principal.
  2. Verifica el estado de replicación de la réplica (sigue las instrucciones que se indican en la pestaña psql Client (Cliente psql)).
  3. Verifica que la réplica se replique y, luego, espera hasta que el retraso de replicación que informa la métrica replay_lag sea 0.

De lo contrario, es posible que a una instancia recién ascendida le falten algunas transacciones confirmadas en la instancia principal.

Para ascender una réplica a una instancia independiente, sigue estos pasos:

Console

  1. En la consola de Google Cloud, ve a la página Instancias de Cloud SQL.

    Ir a Instancias de Cloud SQL

  2. Haz clic en el nombre de una instancia de réplica para seleccionarla.
  3. Haz clic en Promover réplica.
  4. Haz clic en Aceptar.

gcloud

gcloud sql instances promote-replica REPLICA_NAME
  

REST v1

Para ejecutar este comando cURL en una ventana de línea de comandos, debes adquirir un token de acceso con el comando gcloud auth print-access-token. También puedes usar el Explorador de API en la página de ascenso de réplicas de instancias para enviar la solicitud a la API de REST.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • project-id: El ID del proyecto
  • replica-name: El nombre de la instancia de réplica

Método HTTP y URL:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/replica-name/promoteReplica

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

REST v1beta4

Para ejecutar este comando cURL en una ventana de línea de comandos, debes adquirir un token de acceso con el comando gcloud auth print-access-token. También puedes usar el Explorador de API en la página de ascenso de réplicas de instancias para enviar la solicitud a la API de REST.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • project-id: El ID del proyecto
  • replica-name: El nombre de la instancia de réplica

Método HTTP y URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/replica-name/promoteReplica

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

Confirma que la instancia ascendida esté configurada de forma correcta. En particular, considera configurar la instancia para alta disponibilidad si es necesario.

Comprobar el estado de la replicación

Cuando visualizas una instancia de réplica con la consola de Google Cloud o accedes a la instancia con un cliente de administración, obtienes los detalles de la replicación, incluidos el estado y las métricas. Cuando usas gcloud, obtienes un breve resumen de la configuración de la replicación.

Antes de verificar el estado de replicación de una instancia de réplica de Cloud SQL, usa el comando
gcloud sql instances describe para mostrar el estado de la instancia. Como resultado, puedes ver si la replicación está habilitada para la instancia de réplica.

Las siguientes métricas están disponibles para instancias de réplica. (Obtén más información sobre las métricas adicionales disponibles para todas las instancias, incluidas las que no son de réplica).

MétricaDescripción
Estado de replicació
(cloudsql.googleapis.com/database/replication/state)

Indica si la replicación transmite de forma activa los registros desde la instancia principal hacia la réplica. Los valores posibles son los siguientes:

  • Running
  • Stopped
  • Error

Esta métrica muestra Running si:

  1. pg_catalog.pg_stat_wal_receiver muestra un status de “transmisión” y
  2. si pg_catalog.pg_is_wal_replay_paused() muestra “f” (falso).

Para obtener más información, consulta El recopilador de estadísticas y las Funciones de administración del sistema en el manual de referencia de PostgreSQL.

Retraso de replicación
(cloudsql.googleapis.com/database/replication/replica_lag)

La cantidad de tiempo que el estado de la réplica se encuentra detrás del estado de la instancia principal. Esta es la diferencia entre (1) la hora actual y (2) la marca de tiempo original en la que la confirmación principal confirmó la transacción que se está aplicando en la réplica. En particular, las operaciones de escritura se pueden contar como atrasadas incluso si la réplica las recibió, si la réplica aún no aplica la operación de escritura en la base de datos.

Para las réplicas en cascada, cada par de réplica principal se supervisa por separado y no hay una sola métrica que genere el retraso de extremo a extremo (principal para réplica).

Para obtener más información, consulta Retraso de replicación.

Bytes de retraso
(cloudsql.googleapis.com/database/postgresql/replication/replica_byte_lag)

Informa la cantidad de bytes por los que la réplica de lectura retrasa la instancia principal. Se producen cuatro series temporales para cada réplica y muestra la cantidad de bytes en el registro de escritura por adelantado de la instancia principal que aún no han sido…

  • sent_location: …enviados a la réplica
  • write_location: escritos en el disco mediante la réplica
  • flush_location: limpiados en el disco por la réplica
  • replay_location: …reproducidos en la réplica

Estas métricas tienen diferentes propósitos, por ejemplo: replay_location muestra indicación del retraso de replicación (la cantidad de transacciones confirmadas en la instancia principal que aún no se aplicaron a la réplica), mientras que flush_location indica la cantidad de transacciones que no se registraron de forma duradera en la instancia de réplica.

Estas métricas se calculan mediante la comparación de pg_catalog.pg_current_wal_lsn() con uno de los siguientes campos de pg_stat_replication: sent_lsn, write_lsn, flush_lsn o replay_lsn. Para obtener más información, consulta El recopilador de estadísticas en el manual de referencia de PostgreSQL.

Bytes máximos de retraso
(cloudsql.googleapis.com/database/postgresql/external_sync/max_replica_byte_lag)

Para una réplica de una instancia principal externa, se informa el retraso de replicación máximo (en bytes) de todas las bases de datos que se replican en esta instancia. Para cada base de datos, esto se define como la cantidad de bytes en el registro de escritura anticipada que no fueron confirmados como recibidos por la réplica.

Esta métrica se calcula mediante el envío de una consulta a la instancia principal para comparar pg_catalog.pg_current_wal_lsn() con el valor de confirmed_flush_lsn de cada base de datos que se replica en esta instancia de réplica. Para obtener más información, consulta El recopilador de estadísticas en el manual de referencia de PostgreSQL.

Para verificar el estado de la replicación:

Console

Cloud SQL informa la métrica Replication State en el panel de supervisión predeterminado de Cloud SQL.

Si deseas ver otras métricas de réplicas en región y entre regiones, y las réplicas de los servidores externos, crea un panel personalizado y agrega las métricas que deseas supervisar en él:

  1. En la consola de Google Cloud, ve a la página Supervisión.

    Ir a Monitoring

  2. Selecciona la pestaña Paneles.
  3. Haz clic en Crear panel de control.
  4. Asigna un nombre al panel y haz clic en Aceptar.
  5. Haz clic en Agregar gráfico.
  6. En Tipo de recurso, selecciona Cloud SQL Database.
  7. Sigue uno de estos pasos:
    1. Para supervisar la métrica del estado de replicación: En el campo Seleccionar una métrica, escribe Replication state. Luego, agrega un filtro para state = "Running". En el gráfico, se muestra 1 si la replicación está en ejecución y 0 en caso contrario.
    2. Para supervisar el retraso de replicación, en bytes, para una réplica de lectura: En el campo Seleccionar una métrica, escribe Lag Bytes. Luego, agrega un filtro en replica_lag_type = "replay_location". En el gráfico, se muestra la cantidad de bytes asociados a transacciones que se confirmaron en la réplica principal, pero que todavía no se han vuelto a reproducir en la réplica.
    3. Para supervisar el retraso de replicación, en bytes, para una réplica de una instancia principal externa: En el campo Seleccionar una métrica, escribe Max Lag Bytes. En el gráfico, se muestra la cantidad de bytes asociados a transacciones que se confirmaron en la principal, pero que la réplica aún no confirma.

gcloud

Para una instancia de réplica, verifica el estado de la replicación de la siguiente forma:

gcloud sql instances describe REPLICA_NAME

En el resultado, busca las propiedades databaseReplicationEnabled y masterInstanceName.

En el caso de una instancia principal, puedes verificar si hay réplicas de la siguiente forma:

gcloud sql instances describe PRIMARY_INSTANCE_NAME

Busca la propiedad replicaNames en el resultado.

Cliente psql

La réplica principal genera algunas métricas del estado de replicación, y otras las produce la réplica. Para los siguientes pasos, conéctate a la réplica o a la instancia principal (como se indica a continuación) con un cliente PostgreSQL.

Si deseas obtener más información, consulta Opciones de conexión para aplicaciones externas.

  1. Para verificar el estado de la réplica desde la instancia principal, haz lo siguiente:
    select * from pg_stat_replication;
    Busca las siguientes métricas en el resultado del comando:
    • client_addr: Es la dirección IP de la instancia de réplica.
    • state: Indica si el subproceso de SQL para ejecutar eventos en el registro de retransmisión está en ejecución. El valor es streaming cuando se inicia la replicación.
    • replay_lag: Es la cantidad de bytes que tiene el subproceso de SQL de réplica detrás de la instancia principal. El valor es O o una pequeña cantidad de bytes.
  2. Para verificar el estado de la réplica desde la instancia de réplica, haz lo siguiente:
    select * from pg_stat_wal_receiver;

    Busca las siguientes métricas en el resultado del comando:

    • sender_host: Es la dirección IP de la instancia principal.
    • status: Indica si el subproceso de SQL para ejecutar eventos en el registro de retransmisión está en ejecución. El valor es streaming cuando se inicia la replicación.
    • last_msg_send_time y last_msg_receipt_time: La diferencia entre estas dos marcas de tiempo es el tiempo de retraso.

    Para verificar si la replicación se detuvo, haz lo siguiente:

    select pg_is_wal_replay_paused();

    El valor es t si la replicación está pausada y f en caso contrario.

    Para verificar si hay transacciones recibidas que se recibieron de la instancia principal, pero que aún no se aplicaron, sigue estos pasos:

    # for PostgreSQL 9.6
    select pg_catalog.pg_last_xlog_receive_location(), pg_catalog.pg_last_xlog_replay_location();
    # for PostgreSQL 10 and above
    select pg_catalog.pg_last_wal_receive_lsn(), pg_catalog.pg_last_wal_replay_lsn();

    Si los dos valores son iguales, la réplica procesa todas las transacciones que recibió de la instancia principal.

  • Para obtener más detalles sobre los resultados de estos comandos, consulta la documentación de PostgreSQL en El recopilador de estadísticas.
  • Solucionar problemas

    Problema Soluciona problemas
    La réplica de lectura no comenzó a replicarse cuando se creó. Es probable que haya un error más específico en los archivos de registro. Inspecciona los registros en Cloud Logging para encontrar el error real.
    No se puede crear una réplica de lectura: error invalidFlagValue. Una de las marcas de la solicitud no es válida. Puede ser una marca que proporcionaste explícitamente o una que se configuró como un valor predeterminado.

    Primero, comprueba que el valor de la marca max_connections sea mayor o igual que el valor en el principal.

    Si la marca max_connections se configuró de forma correcta, inspecciona los registros en Cloud Logging para encontrar el error real.

    No se puede crear una réplica de lectura: error desconocido. Es probable que haya un error más específico en los archivos de registro. Inspecciona los registros en Cloud Logging para encontrar el error real.

    Si el error es set Service Networking service account as servicenetworking.serviceAgent role on consumer project, inhabilita y vuelve a habilitar la Service Networking API. Esta acción crea la cuenta de servicio que se necesita para continuar con el proceso.

    El disco está lleno. El tamaño del disco de la instancia principal puede llenarse durante la creación de una réplica. Edita la instancia principal para actualizarla a un tamaño de disco más grande.
    El espacio en el disco aumenta significativamente. Una ranura que no se usa de forma activa para realizar un seguimiento de los datos hace que PostgreSQL se conserve en los segmentos WAL de forma indefinida, lo que hace que el espacio en disco crezca de forma indefinida. Si usas las funciones de replicación y decodificación lógicas en Cloud SQL, las ranuras de replicación se crean y descartan de forma automática. Las ranuras de replicación sin usar se pueden detectar si consultas la vista del sistema pg_replication_slots y filtras en la columna active. Las ranuras sin usar se pueden descartar para quitar los segmentos de WAL mediante el comando pg_drop_replication_slot.
    La instancia de réplica usa demasiada memoria. La réplica usa memoria temporal para almacenar en caché las operaciones de lectura solicitadas con frecuencia, lo que puede ocasionar que use más memoria que la instancia principal.

    Reinicia la instancia de réplica para recuperar el espacio de memoria temporal.

    Se detuvo la replicación. Se alcanzó el límite de almacenamiento máximo y el aumento de almacenamiento automático no está habilitado.

    Edita la instancia para habilitar automatic storage increase.

    El retraso de replicación se mantiene alto. La carga de escritura es demasiado alta para que la réplica la maneje. El retraso de la replicación se produce cuando el subproceso de SQL en una réplica no puede mantener el ritmo del subproceso de E/S. Algunos tipos de consultas o cargas de trabajo pueden causar un gran retraso de la replicación de forma temporal o permanente en un esquema determinado. Algunas de las causas típicas del retraso de la replicación son las siguientes:
    • Consultas lentas en la réplica. Encuéntralas y corrígelas.
    • Todas las tablas deben tener una clave primaria o única. Cada actualización en una tabla sin una clave única o primaria genera análisis completos de la tabla en la réplica.
    • Las consultas como DELETE ... WHERE field < 50000000 provocan un retraso de la replicación basado en filas, ya que se acumula una gran cantidad de actualizaciones en la réplica.

    Estas son algunas de las soluciones posibles:

    • Edita la instancia para aumentar el tamaño de la réplica.
    • Reduce la carga en la base de datos.
    • Envía tráfico de lectura a la réplica de lectura.
    • Indexa las tablas.
    • Identifica y corrige consultas de escritura lentas.
    • Vuelve a crear la réplica.
    Errores cuando se vuelven a compilar índices en PostgreSQL 9.6 Recibirás un error de PostgreSQL que te informará que debes volver a compilar un índice en particular. Esto se puede hacer solo en la instancia principal. Si creas una instancia de réplica nueva, pronto recibirás el mismo error. Los índices hash no se propagan a las réplicas en las versiones de PostgreSQL inferiores a 10.

    Si debes usar índices de hash, actualiza a PostgreSQL 10 o versiones posteriores. De lo contrario, si también quieres usar réplicas, no uses índices de hash en PostgreSQL 9.6.

    La consulta en la instancia principal siempre se ejecuta. Después de crear una réplica, se espera que la consulta SELECT * from pg_stat_activity where state = 'active' and pid = XXXX and username = 'cloudsqlreplica' se ejecute de forma continua en tu instancia principal.
    La creación de la réplica falla con el tiempo de espera. Las transacciones no confirmadas de larga duración en la instancia principal pueden generar una falla en la creación de la réplica de lectura.

    Vuelve a crear la réplica después de detener todas las consultas en ejecución.

    Si la instancia principal y la réplica tienen diferentes tamaños de CPU virtuales, puede haber problemas de rendimiento de las consultas porque el optimizador de consultas tiene en cuenta los tamaños de las CPU virtuales.

    Para resolver este problema, realiza los siguientes pasos:

    1. Activa la marca log_duration y establece el parámetro log_statement en ddl. Esto te proporciona las consultas y el tiempo de ejecución en la base de datos. Sin embargo, según tu carga de trabajo, esto podría causar problemas de rendimiento.
    2. En la instancia principal y en la réplica de lectura, ejecuta explain analyze para las consultas.
    3. Compara el plan de consultas y verifica si hay diferencias.

    Si se trata de una consulta específica, modifícala. Por ejemplo, puedes cambiar el orden de las uniones para ver si obtienes un mejor rendimiento.

    ¿Qué sigue?