Gestionar réplicas de lectura

En esta página se describe cómo gestionar las réplicas de lectura. Entre estas operaciones se incluyen la habilitación e inhabilitación de la réplica, la promoción de una réplica, la configuración de la réplica paralela y la comprobación del estado de la réplica.

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

Inhabilitar replicación

De forma predeterminada, las réplicas se inician con la replicación habilitada. Sin embargo, puedes inhabilitar la replicación en determinadas situaciones; por ejemplo, para depurar o analizar el estado de una instancia. Cuando lo tengas todo listo, vuelve a habilitar la replicación de forma explícita. Si inhabilitas o vuelves a habilitar la replicación, no se reiniciará la instancia de réplica.

Si inhabilitas la replicación, la instancia de réplica no se detendrá, sino que se convertirá en una instancia de solo lectura que ya no replicará datos de su instancia principal. Se te seguirá cobrando por la instancia. En la réplica inhabilitada, puedes volver a habilitar la replicación, eliminar la réplica o convertirla en una instancia independiente.

Si inhabilitas la replicación durante un periodo prolongado, es posible que aumenten los requisitos de almacenamiento en disco. Por ejemplo, tu instancia puede acumular registros de transacciones para permitirte reanudar la replicación cuando la vuelvas a habilitar. Para evitar que aumenten los requisitos de almacenamiento en disco, en lugar de inhabilitar la réplica durante un periodo prolongado, te recomendamos que promociones la réplica o crees un clon de la instancia principal.

Para inhabilitar la replicación, efectúa los pasos siguientes:

Consola

  1. En la Google Cloud consola, 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 un símbolo del sistema, debes obtener un token de acceso con el comando gcloud auth print-access-token. También puede usar el Explorador de APIs en la página Instances:patch para enviar la solicitud de la API REST.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • project-id: el ID del proyecto
  • replica-name: 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, despliega una de estas opciones:

Deberías recibir una respuesta JSON similar a la siguiente:

REST v1beta4

Para ejecutar este comando cURL en un símbolo del sistema, debes obtener un token de acceso con el comando gcloud auth print-access-token. También puede usar el Explorador de APIs en la página Instances:patch para enviar la solicitud de la API REST.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • project-id: el ID del proyecto
  • replica-name: 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, despliega una de estas opciones:

Deberías recibir una respuesta JSON similar a la siguiente:

Habilitar replicación

Si una réplica no se ha replicado durante mucho tiempo, tardará más en ponerse al día con la instancia principal. En ese caso, elimina la réplica y crea otra.

Para habilitar la replicación, efectúa los pasos siguientes:

Consola

  1. En la Google Cloud consola, 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 un símbolo del sistema, debes obtener un token de acceso con el comando gcloud auth print-access-token. También puede usar el Explorador de APIs en la página Instances:patch para enviar la solicitud de la API REST.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • project-id: el ID del proyecto
  • replica-name: 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, despliega una de estas opciones:

Deberías recibir una respuesta JSON similar a la siguiente:

REST v1beta4

Para ejecutar este comando cURL en un símbolo del sistema, debes obtener un token de acceso con el comando gcloud auth print-access-token. También puede usar el Explorador de APIs en la página Instances:patch para enviar la solicitud de la API REST.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • project-id: el ID del proyecto
  • replica-name: 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, despliega una de estas opciones:

Deberías recibir una respuesta JSON similar a la siguiente:

Promocionar una réplica

Si promueves una réplica de lectura, se detendrá la replicación y la instancia se convertirá en una instancia principal de Cloud SQL independiente con permisos de lectura y escritura.

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

Antes de promover una réplica de lectura, si la principal sigue estando disponible y atendiendo a los clientes, debes hacer lo siguiente:

  1. Detener todas las escrituras en la instancia principal.
  2. Comprueba el estado de la réplica (sigue las instrucciones de la pestaña Cliente psql).
  3. Verifica que la réplica se esté replicando y, a continuación, espera hasta que la latencia de replicación que indica la métrica replay_lag sea 0.

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

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

Consola

  1. En la Google Cloud consola, 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 Promocionar réplica.
  4. Haz clic en Aceptar.

gcloud

gcloud sql instances promote-replica REPLICA_NAME
  

REST v1

Para ejecutar este comando cURL en un símbolo del sistema, debes obtener un token de acceso con el comando gcloud auth print-access-token. También puede usar el Explorador de APIs en la página Instances:promoteReplica para enviar la solicitud de la API REST.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • project-id: el ID del proyecto
  • replica-name: 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, despliega una de estas opciones:

Deberías recibir una respuesta JSON similar a la siguiente:

REST v1beta4

Para ejecutar este comando cURL en un símbolo del sistema, debes obtener un token de acceso con el comando gcloud auth print-access-token. También puede usar el Explorador de APIs en la página Instances:promoteReplica para enviar la solicitud de la API REST.

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • project-id: el ID del proyecto
  • replica-name: 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, despliega una de estas opciones:

Deberías recibir una respuesta JSON similar a la siguiente:

Confirma que la instancia promocionada esté configurada correctamente. En concreto, plantéate configurar la instancia para alta disponibilidad si es necesario.

Comprobar el estado de la replicación

Cuando ves una instancia de réplica mediante la Google Cloud consola o inicias sesión en la instancia con un cliente de administración, obtienes detalles sobre la replicación, como el estado y las métricas. Cuando usas gcloud CLI, obtienes un breve resumen de la configuración de la réplica.

Antes de comprobar el estado de la 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, puede ver si la replicación está habilitada en la instancia de réplica.

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

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

Indica si la réplica está transmitiendo registros de forma activa desde la principal. Los valores posibles son:

  • Running
  • Stopped
  • Error

Esta métrica informa de Running si:

  1. pg_catalog.pg_stat_wal_receiver informa de una status de "streaming", y
  2. pg_catalog.pg_is_wal_replay_paused() devuelve "f" (false).

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

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

Tiempo que tarda en replicarse el estado de la réplica con respecto al estado de la instancia principal. Es la diferencia entre (1) la hora actual y (2) la marca de tiempo original en la que la réplica 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 la réplica aún no ha aplicado la escritura a la base de datos.

En el caso de las réplicas en cascada, cada par principal-réplica se monitoriza por separado y no hay una métrica única que proporcione la latencia de extremo a extremo (de principal a réplica).

Para obtener más información, consulta el artículo sobre el retraso de la replicación.

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

Informa del número de bytes por el que la réplica de lectura se retrasa con respecto a la principal. Se generan cuatro series temporales por cada réplica, que muestran el número de bytes del registro de escritura anticipada de la réplica principal que aún no se han…

  • sent_location: …se ha enviado a la réplica
  • write_location: …escrito en el disco por la réplica
  • flush_location: …la réplica lo ha escrito en el disco
  • replay_location: …reproducido por la réplica

Estas métricas tienen finalidades diferentes. Por ejemplo: replay_location indica el retraso de la réplica (el número de transacciones confirmadas en la principal que aún no se han aplicado a la réplica), mientras que flush_location indica el número de transacciones que no se han registrado de forma duradera en la instancia de réplica.

Estas métricas se calculan comparando 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 la sección El recolector de estadísticas del manual de referencia de PostgreSQL.

Max Lag Bytes
(cloudsql.googleapis.com/database/postgresql/external_sync/max_replica_byte_lag)

En el caso de una réplica de una principal externa, informa de la latencia de replicación máxima (en bytes) de todas las bases de datos que se están replicando en esta instancia. En cada base de datos, se define como el número de bytes del registro de escritura anticipada de la principal que no se ha confirmado que haya recibido la réplica.

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

Para comprobar el estado de la replicación, efectúa los pasos siguientes:

Consola

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

Para ver otras métricas de las réplicas de la misma región y de otras regiones, así como de las réplicas de servidores externos, cree un panel de control personalizado y añada las métricas que quiera monitorizar:

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

    Ir a Monitoring

  2. Seleccione la pestaña Paneles.
  3. Haz clic en Crear panel de control.
  4. Asigna un nombre al panel de control y haz clic en Aceptar.
  5. Haz clic en Añadir gráfico.
  6. En Tipo de recurso, selecciona Base de datos de Cloud SQL.
  7. Sigue uno de estos métodos:
    1. Para monitorizar la métrica de estado de la réplica: en el campo Selecciona una métrica, escribe Replication state. A continuación, añade un filtro para state = "Running". El gráfico muestra 1 si la replicación está en curso y 0 en caso contrario.
    2. Para monitorizar el retraso de la replicación, en bytes, de una réplica de lectura: en el campo Seleccionar una métrica, escribe Lag Bytes. A continuación, añade un filtro en replica_lag_type = "replay_location". El gráfico muestra el número de bytes asociados a las transacciones que se han confirmado en el servidor principal, pero que aún no se han reproducido en la réplica.
    3. Para monitorizar el desfase de replicación, en bytes, de una réplica de un primario externo: en el campo Seleccionar una métrica, escribe Max Lag Bytes. El gráfico muestra el número de bytes asociados a las transacciones que se han confirmado en la principal, pero que la réplica aún no ha confirmado que ha recibido.

gcloud

Para una instancia de réplica, comprueba el estado de la replicación con:

gcloud sql instances describe REPLICA_NAME

En el resultado, busca las propiedades databaseReplicationEnabled y masterInstanceName.

En el caso de una instancia principal, comprueba si hay réplicas con lo siguiente:

gcloud sql instances describe PRIMARY_INSTANCE_NAME

En el resultado, busca la propiedad replicaNames.

Cliente psql

La instancia principal genera algunas métricas de estado de la replicación y la réplica genera otras. Para seguir los pasos que se indican a continuación, conéctate a la réplica o a la instancia principal (según se indique más abajo) con un cliente de PostgreSQL.

Para obtener información, consulta las opciones de conexión para aplicaciones externas.

  1. Para comprobar el estado de la réplica desde la instancia principal, sigue estos pasos:
    select * from pg_stat_replication;
    Busca las siguientes métricas en el resultado del comando:
    • client_addr: la dirección IP de la instancia de réplica.
    • state: indica si el subproceso 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: número de bytes que el subproceso SQL de la réplica está por detrás de la instancia principal. El valor es O o un número pequeño de bytes.
  2. Para comprobar el estado de la réplica desde la instancia de réplica, sigue estos pasos:
    select * from pg_stat_wal_receiver;

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

    • sender_host: la dirección IP de la instancia principal.
    • status: indica si el subproceso 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 latencia.

    Para comprobar si la replicación se ha pausado, sigue estos pasos:

    select pg_is_wal_replay_paused();

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

    Para comprobar si hay transacciones que se han recibido de la cuenta principal, pero aún no se han aplicado, 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, significa que la réplica ha procesado todas las transacciones que ha recibido de la principal.

  • Para obtener más información sobre la salida de estos comandos, consulta la documentación de PostgreSQL sobre The Statistics Collector (El recolector de estadísticas).
  • Solucionar problemas

    Problema Solución de problemas
    La réplica de lectura no ha empezado a replicarse al crearse. Probablemente 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 hayas proporcionado explícitamente o una que se haya definido con un valor predeterminado.

    En primer lugar, comprueba que el valor de la marca max_connections sea mayor o igual que el del elemento principal.

    Si la marca max_connections está configurada correctamente, inspecciona los registros en Cloud Logging para encontrar el error real.

    No se ha podido crear la réplica de lectura debido a un error desconocido. Probablemente 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 Service Networking API. Esta acción crea la cuenta de servicio necesaria para continuar con el proceso.

    El disco está lleno. El disco de la instancia principal puede llenarse durante la creación de la réplica. Edita la instancia principal para actualizarla a un tamaño de disco mayor.
    El espacio en disco aumenta considerablemente. Si una ranura no se usa de forma activa para monitorizar datos, PostgreSQL conservará los segmentos WAL indefinidamente, lo que provocará que el espacio en disco aumente indefinidamente. Si usas las funciones de replicación lógica y decodificación en Cloud SQL, las ranuras de replicación se crean y se eliminan automáticamente. Puedes detectar las ranuras de replicación no utilizadas consultando la vista del sistema pg_replication_slots y filtrando por la columna active. Los espacios sin usar se pueden eliminar para quitar segmentos WAL con el comando pg_drop_replication_slot.
    La instancia de réplica está usando demasiada memoria. La réplica usa memoria temporal para almacenar en caché las operaciones de lectura solicitadas con frecuencia, lo que puede hacer que use más memoria que la instancia principal.

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

    Replicación detenida. Se ha alcanzado el límite máximo de almacenamiento y el aumento automático del almacenamiento no está habilitado.

    Edita la instancia para habilitar automatic storage increase.

    La latencia de replicación es constantemente alta. La carga de escritura es demasiado alta para que la réplica pueda gestionarla. El retraso de la réplica se produce cuando el subproceso SQL de una réplica no puede seguir el ritmo del subproceso de E/S. Algunos tipos de consultas o cargas de trabajo pueden provocar una latencia de replicación alta temporal o permanente en un esquema determinado. Estas son algunas de las causas habituales del retraso de la réplica:
    • Consultas lentas en la réplica. Identifícalos y corrígelos.
    • Todas las tablas deben tener una clave principal o única. Cada actualización de una tabla de este tipo sin una clave única o principal provoca análisis completos de la tabla en la réplica.
    • Las consultas como DELETE ... WHERE field < 50000000 provocan un retraso en la replicación basada en filas, ya que se acumula un gran número de actualizaciones en la réplica.

    Estas son algunas posibles soluciones:

    • Edita la instancia para aumentar el tamaño de la réplica.
    • Reducir la carga de la base de datos.
    • Envía el tráfico de lectura a la réplica de lectura.
    • Indexa las tablas.
    • Identifica y corrige las consultas de escritura lentas.
    • Vuelve a crear la réplica.
    Errores al reconstruir índices en PostgreSQL 9.6. PostgreSQL te informa de que debes volver a generar un índice concreto. Esto solo se puede hacer en la instancia principal. Si creas una nueva instancia de réplica, pronto volverá a aparecer el mismo error. Los índices hash no se propagan a las réplicas en las versiones de PostgreSQL anteriores a la 10.

    Si debes usar índices hash, actualiza a PostgreSQL 10 o una versión posterior. De lo contrario, si también quieres usar réplicas, no uses índices hash en PostgreSQL 9.6.

    La consulta en la instancia principal siempre está en ejecución. 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 continuamente en tu instancia principal.
    La creación de réplicas falla por tiempo de espera agotado. Las transacciones sin confirmar de larga duración en la instancia principal pueden provocar que falle la creación de réplicas 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 tamaños de vCPU diferentes, puede haber problemas de rendimiento de las consultas porque el optimizador de consultas tiene en cuenta los tamaños de las vCPU.

    Para solucionar este problema, siga estos pasos:

    1. Activa la marca log_duration y asigna el valor ddl al parámetro log_statement. De esta forma, obtendrás tanto las consultas como el tiempo de ejecución en la base de datos. Sin embargo, en función de tu carga de trabajo, esto podría provocar problemas de rendimiento.
    2. Ejecuta explain analyze en la instancia principal y en la réplica de lectura para las consultas.
    3. Compara el plan de consulta y comprueba si hay diferencias.

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

    Siguientes pasos