Command Palette

Search for a command to run...

ES·EN

Nivel 3 · 25 min

Replicación

PostgreSQL soporta replicación streaming (física, byte a byte del WAL) y replicación lógica (decodificación del WAL a cambios lógicos de fila). La replicación streaming es la base de HA; la lógica habilita casos como réplicas de lectura selectivas y migraciones sin downtime.

Replicación Streaming

El primario escribe cambios al WAL (Write-Ahead Log). Las réplicas se conectan y reciben el WAL stream en tiempo real. La replicación puede ser asíncrona (default, posible pérdida de datos en failover) o síncrona (SYNCHRONOUS_COMMIT = on, el primario espera confirmación de al menos una réplica antes de confirmar el commit al cliente).

Replication Slots

Los slots de replicación retienen segmentos WAL hasta que el consumidor los confirme. Garantizan que la réplica no pierda datos aunque se desconecte temporalmente. PELIGRO: un slot inactivo acumula WAL indefinidamente y puede llenar el disco. Monitoreá pg_replication_slots y tené alertas en pg_wal_lsn_diff para detectar réplicas que se están quedando atrás.

Replicación Lógica y Failover

La replicación lógica decodifica el WAL a operaciones INSERT/UPDATE/DELETE y las aplica en el destino. Permite réplicas selectivas (solo algunas tablas), cross-version, cross-OS y bidireccional. Para failover: pg_promote() en la réplica elegida, actualizar connection strings. pg_rewind re-sincroniza el primario viejo sin full base backup.

Puntos clave

  • La replicación síncrona garantiza cero pérdida de datos pero aumenta la latencia de escritura —el primario espera al menos una réplica.
  • Los replication slots sin consumidor activo son una causa común de llenado de disco en producción —monitoreá siempre.
  • pg_rewind permite re-incorporar el primario viejo como réplica tras failover, evitando un full base backup.

Code example

-- Ver estado de replicación
SELECT
  client_addr, state, sent_lsn, write_lsn,
  flush_lsn, replay_lsn,
  (sent_lsn - replay_lsn) AS replication_lag_bytes
FROM pg_stat_replication;

-- Ver replication slots y WAL retenido
SELECT slot_name, active, restart_lsn,
       pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) AS lag_bytes
FROM pg_replication_slots;

-- Promover réplica a primario
SELECT pg_promote();