DBAtlas · Atlas de operaciones de bases de datos

Logical replication de PostgreSQL (publication / subscription)

PostgreSQLNivel: AvanzadoDuración: 45–90 min (+ tiempo de la copia inicial)

Logical replication a nivel de tabla entre dos clusters PostgreSQL: wal_level=logical, comprobación de replica identity, publication y subscription, sincronización inicial, monitorización, gestión de conflictos y sincronización manual de las sequences. Incluye también los pasos de cutover final que limitan la interrupción a segundos en migraciones entre versiones (major upgrade, cambio de servidor).

Logical replication no es un método de HA ni de backup: para una copia exacta de todo el cluster y failover se usa streaming replication o Patroni, y para el backup pgBackRest. El upgrade de versión principal in situ en el mismo servidor (pg_upgrade) está en pg-major-upgrade.

Topología: 2 servidores: publicador (publisher) + suscriptor (subscriber); el publicador puede ser un solo servidor, streaming replication o un cluster Patroni

Escenarios

  • Replicación continua (informes, integración, copia parcial) — Las tablas seleccionadas fluyen de forma continua a otro cluster (servidor de informes, alimentación de un data warehouse, integración entre servicios). El suscriptor sigue admitiendo escrituras.
  • Migración: nuevo servidor / nueva versión principal + cutover — Paso a un nuevo servidor o a una nueva versión principal con segundos de interrupción: copia inicial y sincronización continua, después una breve parada de escrituras y el cutover.

Antes de empezar

  • En el publicador se ejecuta PostgreSQL … y existe la base de datos ….
  • El cluster Patroni … está sano y … es ahora el Leader; hot_standby_feedback = on en las réplicas (valor por defecto de pg-patroni).
  • El standby … está conectado al primary mediante un physical replication slot (primary_slot_name = …, la opción de slot de pg-streaming). La sincronización de slots no funciona sin este slot.
  • En el suscriptor se ha instalado PostgreSQL … con pg-install y está en funcionamiento; están instaladas las versiones … de las extensiones usadas en el publicador (PostGIS, etc.).
  • El suscriptor puede acceder …a la dirección HAProxy/VIP del publicador (…:…)…al puerto … del publicador… (firewall / grupo de seguridad).
  • ¿Qué valor tiene ahora wal_level en el publicador? Si no es logical, cambiarlo requiere un reinicio: planifique una ventana de mantenimiento.
  • Las tablas que se publicarán tienen primary key o un índice único adecuado. Si no, UPDATE/DELETE fallan en el publicador: añada una PK a las tablas indicadas o defina una replica identity (paso siguiente).
  • Logical replication no replica DDL (CREATE/ALTER TABLE), ni los valores de las sequences ni los large objects. Mientras dure la replicación, los cambios de esquema se aplicarán manualmente, primero en el suscriptor y después en el publicador; el equipo está informado.
  • El publicador tiene margen de disco adicional para el WAL: si el suscriptor se detiene, el slot acumula WAL (límite: … GB).

Fases de la guía

  • Preparación del publicador — Verificar que el publicador es el …Leader…primary… · Escribir los parámetros de logical replication · Escribir los parámetros de logical replication en Patroni · Reiniciar el publicador · Reiniciar los miembros de Patroni · Crear el usuario de replicación …
  • Replica identity — Listar las tablas sin PK · Definir la replica identity de las tablas sin PK
  • Publication — Crear la publication
  • Preparación del suscriptor — Escribir los parámetros de workers del suscriptor · Reiniciar el suscriptor · Escribir la contraseña del publicador en .pgpass · Crear la base de datos y el esquema · Transferir roles y permisos
  • Subscription y sincronización inicial — Crear la subscription · Esperar a que termine la sincronización inicial · Comparar el número de filas · Prueba de cambio en vivo
  • Conservar el slot en un failover — Definir el slot como permanente en Patroni · Verificar que el slot es visible en las réplicas · Primary: definir los slots de standby sincronizados · Standby: activar la sincronización de slots · Redirigir la suscripción al nuevo primary tras un failover · Reconstruir la suscripción tras un failover
  • Monitorización — Estado de la suscripción (suscriptor) · Retardo del slot (publicador)
  • Gestión de conflictos — Localizar el error · Corregir la fila en conflicto en el suscriptor · Omitir la transacción en conflicto
  • Sincronización de las sequences — Transferir los valores de las sequences del publicador al suscriptor
  • Cutover — Detener las escrituras en el publicador · Verificar que se han transferido los últimos cambios · Sincronizar las sequences por última vez · Eliminar la suscripción · Recoger estadísticas · Redirigir las aplicaciones al suscriptor …
  • Operaciones de mantenimiento — Añadir una tabla nueva · Cambio de esquema (ALTER TABLE) · Eliminar una suscripción (sin acceso al publicador)
Abrir el plan paso a paso para su entorno →