Gestionar y monitorizar la replicación lógica

Esta página describe cómo monitorizar la replicación lógica en Lakebase, cómo la replicación interactúa con la escala a cero y las ramas, y cómo resolver problemas comunes. Para la configuración, consulta Replicar datos en Lakebase y Replicar datos desde Lakebase.

Monitorizar la replicación

Cualquier rol de Postgres puede consultar los catálogos de replicación en esta página, con dos excepciones. La columna subconninfo de pg_subscription puede contener la contraseña de conexión y está restringida, así que selecciona columnas específicas en lugar de usar SELECT *. En pg_stat_replication, la mayoría de las columnas están ocultas a menos que tu rol tenga pg_read_all_stats, que los miembros de databricks_superuser tienen.

En un suscriptor, confirma que la suscripción existe y está habilitada:

SELECT subname, subenabled FROM pg_catalog.pg_subscription;

En un publicador, confirma que la publicación existe:

SELECT pubname FROM pg_catalog.pg_publication;

Comprueba el estado de sincronización por tabla del suscriptor. Cuando cada tabla muestra Ready (fully live), la copia inicial está lista y la suscripción está en streaming:

SELECT
    srrelid::regclass AS table_name,
    CASE srsubstate
        WHEN 'i' THEN 'Initializing'
        WHEN 'd' THEN 'Data copying (in progress)'
        WHEN 's' THEN 'Synchronized (catching up)'
        WHEN 'r' THEN 'Ready (fully live)'
    END AS sync_status
FROM pg_catalog.pg_subscription_rel;

Comprobar el estado de la suscripción y la latencia:

SELECT subname, received_lsn, latest_end_lsn, last_msg_receipt_time
FROM pg_catalog.pg_stat_subscription;

Compara el número de filas del publicador y del suscriptor para confirmar que una tabla está sincronizada:

SELECT COUNT(*) FROM public.playing_with_lakebase;

En un publicador, lista las ranuras de replicación y hasta qué punto ha avanzado cada una:

SELECT slot_name, slot_type, active, restart_lsn
FROM pg_catalog.pg_replication_slots;

En Lakebase, los resultados también incluyen las ranuras físicas internas wal_proposer_slot y wal_retention_slot. Lakebase gestiona estas ranuras, y no forman parte de la replicación lógica.

Replicación lógica y escala a cero

Un cálculo Lakebase con un suscriptor activo no escala a cero, lo que puede aumentar el uso del cómputo.

Comprueba si hay suscriptores activos:

SELECT *
FROM pg_catalog.pg_stat_replication
WHERE application_name <> 'walproposer';

Ranuras de replicación y almacenamiento

Una ranura de replicación hace que el publicador conserve el registro de escritura anticipada (WAL) hasta que el suscriptor confirme que ha recibido los cambios. Si el suscriptor deja de consumir cambios, por ejemplo porque está desactivado, desconectado, fallando o quedándose atrás, WAL se acumula en el publicador. Esta es la causa más común de problemas graves con la replicación lógica:

  • La editorial puede quedarse sin almacenamiento. El WAL retenido crece hasta que el almacenamiento del publicador se llena, lo que puede impedir que la base de datos acepte escrituras y causar una interrupción.
  • Eliminar la ranura no libera almacenamiento inmediatamente. Postgres elimina el WAL retenido solo cuando recicla segmentos WAL en un punto de control posterior. Si el publicador ya se ha quedado sin almacenamiento, ese reciclado podría no completarse.
  • El riesgo también se aplica a editores externos. Cuando Lakebase se suscribe a una base de datos externa, WAL se acumula en esa fuente externa si la suscripción deja de consumir cambios.

Supervisar WAL retenido

En el publicador, comprueba cuánto WAL retiene cada ranura lógica y si está activa:

SELECT slot_name, active, wal_status,
       pg_catalog.pg_size_pretty(pg_catalog.pg_wal_lsn_diff(pg_catalog.pg_current_wal_lsn(), restart_lsn)) AS retained_wal
FROM pg_catalog.pg_replication_slots
WHERE slot_type = 'logical';

Ejecuta esta consulta regularmente mientras la replicación está activa. Investiga cuando retained_wal sigue creciendo o active está false. Un wal_status de extended significa que la ranura retiene más WAL de lo que normalmente conserva el publicador. Un valor de unreserved o lost significa que la ranura ha superado wal_status y está perdiendo, o ha perdido, el WAL que necesita max_slot_wal_keep_size, por lo que la suscripción debe recrearse.

Recuperarse de la acumulación de WAL

  1. Encuentra la ranura que retiene WAL con la consulta en Monitor retained WAL.

  2. Si el abonado puede recuperarse, soluciona la causa, como un problema en la red, una suscripción desactivada o un apply fallido, para que el abonado se ponga al día y el slot avance.

  3. Si ya no necesitas la suscripción, suéltala sobre el suscriptor. Si el suscriptor no es localizable, deja el slot directamente en el publicador. Un slot debe estar inactivo antes de poder soltarlo:

    SELECT pg_catalog.pg_drop_replication_slot('<slot_name>');
    
  4. Espera a que el publicador recicle el WAL conservado. En un publicador autogestionado que está a punto de quedarse sin almacenamiento, añade primero almacenamiento para que la depuración pueda completarse.

Eliminación automática de ranuras inactivas en Lakebase

Cuando Lakebase es el publicador, elimina automáticamente una ranura de replicación que ha estado inactiva aproximadamente 40 horas, para evitar que la ranura conserve WAL indefinidamente. Un slot se vuelve inactivo cuando su suscriptor deja de consumir cambios y el slot deja de avanzar. Esto puede ocurrir cuando un suscriptor es desactivado o deja de estar disponible, o cuando un abonado está configurado con un largo retraso de replicación.

Para evitar que se elimine un slot, asegúrate de que su suscriptor permanezca conectado y siga consumiendo cambios. Si el abonado utiliza un retraso o frecuencia de replicación configurable, mantenlo por debajo de 40 horas para que el slot siga avanzando. Si se elimina una ranura y aún la necesitas, vuelve a crear la suscripción en el suscriptor.

Los editores externos no eliminan automáticamente los espacios inactivos. En un publicador autogestionado, establezca max_slot_wal_keep_size para limitar la cantidad de WAL que una ranura puede retener. Si un slot supera el límite, Postgres lo invalida y debes recrear la suscripción.

La restauración de la rama elimina ranuras de replicación

Restaurar una rama elimina todas las ranuras de replicación en esa rama. Recrea publicaciones y suscripciones tras una restauración de rama.

Las ramas hijas no heredan suscripciones

Las suscripciones definidas en una rama principal no se duplican en sus ramas hijas. Lakebase los elimina de una rama hija antes de que comience el compute de esa rama, por lo que dos computes no replican la misma suscripción. Esto se aplica cuando creas, reinicias o restauras una rama secundaria. Recrea la suscripción en la rama secundaria si necesitas replicación allí.

Eliminar una base de datos de suscriptores deja el espacio en el publicador

Cuando eliminas una base de datos que tiene suscripciones usando la app de Lakebase, la CLI de Databricks o la API REST, Lakebase elimina esas suscripciones primero, pero no elimina sus ranuras de replicación en el publicador. Cada slot permanece en el publicador y sigue reteniendo WAL, lo que puede llenar el almacenamiento del publicador. En una migración, el publicador suele ser tu base de datos de producción.

Un comando SQL DROP DATABASE se comporta como en Postgres estándar: falla con database "<name>" is being used by logical replication subscription cuando la base de datos tiene suscripciones.

Para evitar dejar un cupo ocupado, elimina cada suscripción antes de borrar la base de datos. Cuando el editor es accesible, DROP SUBSCRIPTION también elimina la ranura en el editor. Ver Eliminar suscripción o publicación.

Si ya borraste la base de datos, elimina la ranura que sobró en el publicador. Por defecto, el slot de una suscripción tiene el mismo nombre que la suscripción. Si asignaste slot_name cuando creaste la suscripción, usa ese nombre en su lugar. Para registrar los nombres de las ranuras antes de eliminar una base de datos, ejecuta SELECT subname, subslotname FROM pg_catalog.pg_subscription; en esa base de datos. Confirma que la ranura existe y está inactiva:

SELECT slot_name, database, plugin, active
FROM pg_catalog.pg_replication_slots
WHERE slot_type = 'logical' AND slot_name = '<slot_name>';

Elimina solo la ranura que pertenecía a la suscripción eliminada. Otras ranuras inactivas pueden pertenecer a suscriptores o a herramientas de captura de datos modificados que están temporalmente desconectadas, y eliminarlas rompe su replicación. Suelte en el espacio:

SELECT pg_catalog.pg_drop_replication_slot('<slot_name>');

Roles de replicación

Un rol dedicado a la replicación debe tener ese REPLICATION atributo. Los roles creados en la aplicación Lakebase, la CLI de Azure Databricks o la API REST tienen este atributo, sean o no miembros de databricks_superuser. Los roles creados con SQL no reciben el REPLICATION atributo automáticamente. Para crear uno con SQL, incluye el atributo, por ejemplo CREATE ROLE replication_user WITH LOGIN REPLICATION PASSWORD '<password>';. Para añadirlo a un rol existente, ejecuta ALTER ROLE <role_name> REPLICATION;. Ambas afirmaciones requieren un rol que tenga los atributos CREATEROLE y REPLICATION, como el rol del propietario del proyecto.

Comprueba los privilegios de un puesto:

SELECT rolname, rolreplication
FROM pg_catalog.pg_roles
WHERE rolname = '<role_name>';

Plugins de decodificación

Lakebase soporta dos plugins de salida de decodificación lógica:

  • pgoutput: el plugin integrado de replicación lógica de Postgres y el predeterminado. Úsalo para la replicación estándar de Postgres a Postgres.
  • wal2json: exporta los cambios WAL como JSON, para sistemas que consumen datos de cambios en JSON.

Ajustes de publicación

En Lakebase, max_wal_senders y max_replication_slots ambos se configuran en 10:

max_wal_senders = 10
max_replication_slots = 10

max_wal_senders limita los procesos walsender concurrentes que transmiten los cambios a los suscriptores, y max_replication_slots limita las ranuras de replicación que rastrean el progreso de los suscriptores. Planifica uno de cada por suscriptor. Para solicitar diferentes valores, contacta con Databricks.

Crea una ranura dedicada a la replicación

Algunos servicios de datos requieren una ranura de replicación que debe crear previamente. Crea uno con la función estándar de Postgres, nombrando el plugin decodificador:

SELECT pg_catalog.pg_create_logical_replication_slot('my_replication_slot', 'pgoutput');

Eliminar una suscripción o publicación

Elimina la suscripción del suscriptor cuando ya no la necesites. Cuando el editor es accesible, al eliminar la suscripción, se desconecta del editor y elimina la ranura de replicación en el editor. Los datos replicados permanecen en la base de datos del suscriptor.

DROP SUBSCRIPTION my_subscription;

Si el publicador no es localizable, DROP SUBSCRIPTION no se completa porque no puede conectarse para eliminar la ranura remota. Desvincula primero el slot y luego elimina la suscripción:

ALTER SUBSCRIPTION my_subscription DISABLE;
ALTER SUBSCRIPTION my_subscription SET (slot_name = NONE);
DROP SUBSCRIPTION my_subscription;

En este caso, la ranura de replicación permanece en manos del publicador y continúa manteniendo WAL. Elimínelo en el publicador para liberar el WAL:

SELECT pg_catalog.pg_drop_replication_slot('<slot_name>');

Suelta una publicación en la editorial:

DROP PUBLICATION my_publication;

Troubleshooting

Síntoma Causa y resolución
La suscripción no funciona. Confirma que el publicador es accesible y que la cadena de conexión, el rol y la contraseña son correctos. Cuando Lakebase sea el suscriptor, confirma que el endpoint del publicador está en la lista de permitidos de la política de red de cuentas. Consulta Replicar datos en Lakebase.
Una suscripción a otra base de datos de Lakebase se queda colgada y no se conecta. No se soporta la replicación entre bases de datos Lakebase en la misma región. El origen y el destino deben estar en regiones diferentes. Consulte Limitaciones.
CREATE SUBSCRIPTION falla con restricted by Account Network Policies. Tu cuenta aplica una política de red y el host del editor no está en los destinos de internet permitidos. Añadir el host a la política de red de la cuenta. Consulta Replicar datos en Lakebase.
El almacenamiento aumenta y no se libera. Una ranura de replicación mantiene WAL porque su suscriptor no consume cambios. Si no se resuelve, el publicador puede quedarse sin almacenamiento. Comprueba el WAL retenido, luego vuelve a conectar el suscriptor o elimina la ranura. El almacenamiento solo se libera después de que el publicador recicle WAL. Consulta Slots de replicación y almacenamiento.
Los registros no llegan al suscriptor. Confirma que existen las tablas objetivo con nombres y columnas coincidentes, y que la publicación incluye las tablas que esperas.

Pasos siguientes