PostgreSQL 16 (septiembre 2023) marca un hito para replicación lógica: features largamente esperados la hacen productiva para escenarios que antes requerían herramientas externas. Parallel apply, subscribers desde standbys, mejor gestión de schemas — suficiente para migrations zero-downtime, CDC eficiente, y multi-tenant dissemination.
Qué cambia en PG16
Features clave de logical replication en 16:
Parallel apply
Antes de PG16, apply en el subscriber era single-threaded. Ahora:
-- En el subscriber
ALTER SUBSCRIPTION mysub SET (
streaming = parallel,
parallel_apply = 4 -- workers paralelos
);
Para transacciones grandes, el apply se paraleliza. Mejora típica: 2-5x throughput.
Subscribers desde standbys
Antes: logical replication solo desde primary. PG16: puedes leer WAL desde un standby físico.
- Ventaja: reduce carga del primary.
- Caso uso: multi-tenant con muchos subscribers.
Logical decoding en standbys
Relacionado: standbys ahora pueden exponer slots lógicos directamente.
Bi-directional replication support
Schemas que permiten aplicar y publicar en la misma BD (con disciplina) hacen multi-master lógico posible. Still complicated pero factible sin extensiones.
ALTER SUBSCRIPTION improvements
ENABLE/DISABLEsin drop+recreate.SKIPtransacciones problemáticas (p.ej. conflictos de PK).- Management más flexible.
Casos de uso desbloqueados
Zero-downtime migration
Migrar de PG14 a PG16 (o entre hostings):
- Setup logical replication PG14 → PG16.
- Sincronizar datos (DDL manual, datos via pub/sub).
- Dual-write breve vs primary cutover.
- Apps apuntan al nuevo.
- Viejo se decomisiona.
Tiempo de downtime: minutos vs horas con pg_dump.
CDC para data warehouse
Publicar cambios desde OLTP a Kafka vía Debezium (que usa logical replication):
CREATE PUBLICATION dw_pub FOR ALL TABLES;
Debezium consume y empuja a Kafka. Downstream: Snowflake, BigQuery, ClickHouse.
Read replicas geo-distribuidas
Subscribers en regiones distintas consumiendo de publication central. Lecturas locales, writes al primary central.
Multi-tenant con BD por cliente
Dissemination de cambios desde una BD central a muchas BD por tenant.
Ejemplo práctico
Publisher (origen):
CREATE PUBLICATION mypub FOR TABLE users, orders;
-- O todas las tablas
CREATE PUBLICATION allpub FOR ALL TABLES;
Subscriber (destino):
CREATE SUBSCRIPTION mysub
CONNECTION 'host=primary port=5432 dbname=mydb user=replicator password=secret'
PUBLICATION mypub
WITH (streaming = parallel, parallel_apply = 4);
Monitorización:
SELECT * FROM pg_stat_subscription;
SELECT * FROM pg_replication_slots;
Limitaciones que persisten
Aunque mejorada, todavía:
- No replica DDL: CREATE TABLE, ALTER deben aplicarse manualmente en ambos lados.
- Sequences: no se replican automáticamente el valor.
- Conflictos: sin resolución automática built-in; aplica primero-gana con warnings.
- Large objects: no replicados.
- TRUNCATE: ahora sí replicado en PG11+, pero con caveats.
Herramientas como pglogical siguen siendo útiles para casos avanzados.
Performance
Orientation numbers con PG16 parallel apply:
- Single worker: ~5-10k rows/s inserts.
- 4 parallel workers: ~30-50k rows/s.
- Network: WAL shipping, limitado por bandwidth.
- CPU: tanto primary (decoding) como subscriber (apply) consume.
Para cargas write-heavy, logical replication tiene overhead visible pero manejable.
Operación
Checklist:
- Monitor slot lag:
pg_replication_slots.confirmed_flush_lsnvspg_current_wal_lsn(). - Cleanup slots huérfanos: slots sin subscriber activo bloquean WAL cleanup. Peligroso.
- WAL retention: planificar según max lag esperado.
- Credenciales: usuario replicator con permisos mínimos.
Alertar si lag crece inesperadamente o slots se quedan atrás.
Comparativa con alternativas
| Solución | Uso | Complejidad | Coste |
|---|---|---|---|
| PG16 logical replication | DB-to-DB | Media | $0 (incluido) |
| Debezium + Kafka | CDC a muchos | Alta | Kafka infra |
| pglogical | Multi-master avanzado | Alta | $0 (OSS) |
| BDR (EDB) | Multi-master enterprise | Muy alta | Licencia cara |
| Fivetran / Airbyte | ELT a DW | Baja (SaaS) | Por volumen |
Para casos simples (DB-to-DB), PG16 built-in es suficiente. Para complex (multi-master, CDC masivo), alternativas specialized.
Migración a PG16
Upgrade desde PG14/15:
- pg_upgrade: in-place upgrade, típicamente rápido.
- Logical replication entre old y new.
- Dump/restore: último recurso, downtime largo.
Para producción seria, logical replication es la vía más segura.
Conclusión
PostgreSQL 16 convirtió la replicación lógica en herramienta de primera línea. Features como parallel apply, subscribers desde standbys y mejor management cierran brechas que antes requerían extensiones o herramientas externas. Para migraciones zero-downtime, CDC simple, y arquitecturas multi-region, PG16 built-in cubre la mayoría de casos. Para ultra-complejos (multi-master con conflict resolution), todavía hacen falta specialty tools. Pero el ecosistema PostgreSQL está más autónomo que nunca en este área.
Síguenos en jacar.es para más sobre PostgreSQL, replicación y arquitecturas de datos.