Concepto clave
La replicación en PostgreSQL es como tener copias de seguridad en tiempo real de tu base de datos. Imagina que eres el director de una cadena de restaurantes: tienes una cocina principal (el servidor maestro) donde se preparan todos los platos, y varias cocinas satélite (servidores réplica) que reciben las recetas actualizadas constantemente. Si la cocina principal tiene un problema, cualquiera de las satélites puede tomar el control inmediatamente sin que los clientes noten interrupciones.
En PostgreSQL, esto se logra mediante el envío de registros Write-Ahead Log (WAL). Cada transacción que se escribe en el servidor maestro genera registros WAL que se envían a los servidores réplica. Estos servidores aplican los mismos cambios, manteniendo una copia idéntica. Para aplicaciones de alta concurrencia, esto no solo proporciona alta disponibilidad, sino también balanceo de carga: puedes dirigir consultas de lectura a las réplicas, liberando al maestro para operaciones de escritura.
Cómo funciona en la práctica
Implementar replicación en PostgreSQL sigue un flujo claro. Primero, configuras el servidor maestro para permitir conexiones de réplicas y habilitar la replicación. Luego, preparas un servidor réplica tomando una copia base del maestro y configurándolo para seguir los cambios. Finalmente, verificas que la replicación esté activa y monitoreas su estado.
Paso a paso: 1) En el maestro, modificas postgresql.conf para habilitar la replicación y ajustas pg_hba.conf para permitir conexiones desde las réplicas. 2) Creas un usuario específico para replicación. 3) En la réplica, usas pg_basebackup para obtener una copia inicial del maestro. 4) Configuras la réplica con un archivo recovery.conf (en versiones anteriores) o parámetros en postgresql.conf (en PostgreSQL 12+). 5) Inicias la réplica y verificas con consultas como SELECT * FROM pg_stat_replication;.
Codigo en accion
Configuración básica en el servidor maestro (postgresql.conf):
# Habilitar replicación
wal_level = replica
max_wal_senders = 3
wal_keep_segments = 32
# En pg_hba.conf, agregar línea para réplica
host replication replicauser 192.168.1.0/24 md5Crear usuario de replicación en el maestro:
CREATE USER replicauser WITH REPLICATION ENCRYPTED PASSWORD 'SecurePass123';
GRANT CONNECT ON DATABASE mydb TO replicauser;En el servidor réplica, comando para copia base:
pg_basebackup -h master_ip -D /var/lib/postgresql/data -U replicauser -P -v -RConfiguración en réplica (postgresql.conf en PostgreSQL 13+):
primary_conninfo = 'host=master_ip port=5432 user=replicauser password=SecurePass123'
primary_slot_name = 'replica_slot1'
Errores comunes
- No configurar wal_level correctamente: Si wal_level está en 'minimal', la replicación no funcionará. Siempon usa 'replica' o 'logical'.
- Olvidar ajustar max_wal_senders: Este parámetro limita cuántas réplicas pueden conectarse. Si tienes 3 réplicas, configura al menos 4 para margen.
- Problemas de red o firewall: Las réplicas no pueden conectarse al maestro si los puertos (por defecto 5432) están bloqueados. Verifica conectividad con herramientas como telnet o netcat.
- No monitorear el lag de replicación: Si la réplica se retrasa, puede causar inconsistencias. Usa
SELECT pg_current_wal_lsn() - pg_last_wal_replay_lsn() AS replication_lag;para verificar. - Copias base sin espacio suficiente: pg_basebackup requiere espacio libre en disco. Asegúrate de tener al menos el tamaño de la base de datos más un margen.
Checklist de dominio
- Configurar wal_level y max_wal_senders en el maestro correctamente.
- Crear un usuario dedicado para replicación con privilegios adecuados.
- Usar pg_basebackup para inicializar una réplica desde un maestro.
- Verificar el estado de replicación con pg_stat_replication y monitorear lag.
- Probar la conmutación por error promoviendo una réplica a maestro.
- Configurar replicación streaming versus replicación por archivo según necesidades de latencia.
- Implementar slots de replicación para evitar pérdida de datos si una réplica se desconecta.
Implementar un entorno de replicación con un maestro y dos réplicas
En este ejercicio, configurarás un entorno de replicación en PostgreSQL con un servidor maestro y dos réplicas. Sigue estos pasos:
- Prepara tres instancias de PostgreSQL (pueden ser contenedores Docker, máquinas virtuales o servidores reales). Nómbralas: master, replica1, replica2.
- En el servidor master:
- Edita postgresql.conf para establecer wal_level = replica, max_wal_senders = 5, wal_keep_segments = 64.
- Edita pg_hba.conf para permitir conexiones de replicación desde las IPs de replica1 y replica2.
- Crea un usuario llamado 'repl_user' con contraseña 'RepPass2024' y privilegios de replicación.
- Reinicia PostgreSQL para aplicar cambios.
- En replica1 y replica2:
- Detén el servicio PostgreSQL si está corriendo.
- Usa pg_basebackup para copiar los datos del master. Ejemplo:
pg_basebackup -h master_ip -D /var/lib/postgresql/data -U repl_user -P -v -R. - Inicia PostgreSQL en cada réplica.
- Verifica la replicación:
- En el master, ejecuta
SELECT * FROM pg_stat_replication;para ver las réplicas conectadas. - Crea una tabla en el master e inserta datos; verifica que aparezcan en las réplicas.
- En el master, ejecuta
- Prueba la alta disponibilidad: detén el master y promueve replica1 a nuevo master usando
pg_ctl promote.
- Asegúrate de que las réplicas tengan espacio suficiente en disco antes de usar pg_basebackup.
- Si las réplicas no se conectan, revisa los logs de PostgreSQL en el master para errores de autenticación.
- Usa SELECT application_name, state, sync_state FROM pg_stat_replication; para detalles del estado de cada réplica.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.