Fundamentos de la Replicación por Streaming
La replicación por streaming física envía registros WAL desde un primario a uno o más standbys en tiempo casi real. Los standbys reproducen el WAL y permanecen de solo lectura hasta que se promueven.
Receta
Lista de verificación de configuración rápida para un único standby asíncrono en PostgreSQL 18.4.
-- Primario: permitir conexiones de replicación
ALTER SYSTEM SET wal_level = 'replica';
ALTER SYSTEM SET max_wal_senders = 10;
ALTER SYSTEM SET max_replication_slots = 10;
SELECT pg_reload_conf();
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'change-me';# Standby: copia de seguridad base desde el primario, luego iniciar en recuperación
pg_basebackup -h primary.db.internal -D /var/lib/postgresql/18/main \
-U replicator -Fp -Xs -P -RCuándo usar esto: Necesitas un standby en caliente para conmutación por error, escalado de lectura o copias de seguridad sin la sobrecarga de la decodificación lógica.
Ejemplo de Trabajo
postgresql.conf y pg_hba.conf del primario, luego creación del standby:
# En el host primario - fragmento de pg_hba.conf
# host replication replicator 10.0.0.0/8 scram-sha-256
# En el host standby
sudo -u postgres pg_basebackup \
-h primary.db.internal \
-p 5432 \
-U replicator \
-D /var/lib/postgresql/18/main \
-Fp -Xs -P -R \
-C -S standby1_slot-- En el primario: confirmar que el standby está conectado
SELECT application_name, client_addr, state, sync_state
FROM pg_stat_replication;Lo que esto demuestra:
wal_level = replicahabilita la replicación física sin el costo de la decodificación lógica completa.pg_basebackup -Rescribeprimary_conninfoystandby.signalpara la recuperación por streaming.-C -S standby1_slotcrea una ranura de replicación física para que el WAL se retenga para el nuevo standby.
Análisis Profundo
Cómo Funciona
- El primario escribe transacciones en WAL en disco.
- Los procesos de emisor WAL (
WAL sender) en el primario leen el WAL y lo transmiten a los procesos receptores WAL (WAL receiver) en los standbys. - Los standbys aplican el WAL a través del proceso de inicio (recuperación); sirven consultas de lectura cuando
hot_standby = on. - La promoción finaliza la recuperación: elimina
standby.signal, ejecutapg_ctl promote, o deja que Patroni 3.x elija un nuevo líder.
Configuraciones del Primario
| Parámetro | Valor Típico | Propósito |
|---|---|---|
wal_level | replica | Mínimo para replicación física |
max_wal_senders | 10+ | Conexiones de replicación concurrentes |
wal_keep_size | 1GB+ | Respaldo si faltan ranuras |
hot_standby | on | Permitir lecturas en el standby |
Archivos del Standby
| Archivo | Rol |
|---|---|
standby.signal | Indica a PostgreSQL que permanezca en recuperación |
postgresql.auto.conf | Contiene primary_conninfo de -R |
recovery.signal | Usado durante PITR (no streaming normal) |
Errores Comunes
- Ranura de replicación faltante - Standby desconectado demasiado tiempo; el primario recicla el WAL y el standby no puede ponerse al día. Solución: Siempre usa una ranura física por standby.
wal_leveldemasiado bajo -minimalo una configuración insuficiente bloquean la replicación. Solución: Establecereplicaological, reinicia si es necesario.- Usuario de replicación bloqueado por pg_hba - Conexión rechazada o fallos de autenticación. Solución: Agrega una entrada de
replicationconscram-sha-256. - Promoción sin actualización del proxy - Las aplicaciones todavía apuntan a la IP del primario anterior. Solución: Enruta a través de HAProxy o el endpoint REST de Patroni antes de los simulacros de conmutación por error.
- Retraso grande en primarios ocupados - Red o reproducción lenta en el standby. Solución: Monitorea
pg_stat_replication.replay_lagy dimensiona la E/S del standby para que coincida con el primario.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Replicación Lógica | Actualización de versión mayor, subconjunto de tablas, base de datos cruzada | Necesitas un clon byte a byte y la menor sobrecarga de reproducción |
| pgBackRest / copia de seguridad base solamente | DR sin réplica en vivo | Necesitas RPO a nivel de segundos |
| Réplica de lectura administrada (RDS, Cloud SQL) | El equipo de operaciones es pequeño | Necesitas una topología personalizada de Patroni/etcd |
Preguntas Frecuentes
¿La replicación por streaming replica DDL?
Sí. La replicación física reproduce todo el WAL, incluyendo DDL, índices y extensiones en la misma versión mayor.
¿Pueden los standbys aceptar escrituras?
No, hasta que se promuevan. Usa replicación lógica o bases de datos separadas para patrones bidireccionales.
¿Cuántos standbys por primario?
PostgreSQL soporta muchos; los límites prácticos son el ancho de banda de la red, max_wal_senders y la CPU del primario para los emisores WAL.
¿La replicación está encriptada?
Usa sslmode=verify-full en primary_conninfo y TLS en el primario. Consulta Configuración SSL/TLS.
¿Qué versiones de PostgreSQL deben coincidir?
La replicación por streaming física requiere la misma versión mayor en el primario y el standby.
Relacionado
- Síncrono vs. Asíncrono - Compensaciones de RPO
- Ranuras de Replicación - Retención de WAL
- Monitoreo de Replicación - Alertas de retraso
- Fundamentos de HA - Objetivos de tiempo de actividad
Versiones de Stack: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, y PostGIS 3.5+.