Configuración de Replicación en Streaming

Lectura
20 min~5 min lectura

Concepto clave

La replicación en streaming de PostgreSQL es un mecanismo que permite mantener una o más copias exactas de una base de datos principal (llamada primary) en servidores secundarios (llamados standbys o réplicas). A diferencia de métodos más antiguos basados en archivos de registro (WAL), la replicación en streaming envía los cambios de datos en tiempo real a través de conexiones de red, reduciendo significativamente el retraso de replicación (replication lag).

Imagina una cadena de producción en una fábrica: el servidor primary es la línea principal donde se fabrican los productos (datos), y los servidores standby son líneas paralelas que reciben las instrucciones de ensamblaje (cambios en WAL) en el momento exacto en que se generan. Esto permite que, si la línea principal falla, una línea paralela pueda tomar el control inmediatamente sin perder productos en proceso. En aplicaciones de alta concurrencia, esto es crucial para mantener la disponibilidad durante picos de tráfico o fallos de hardware.

Cómo funciona en la práctica

La replicación en streaming opera mediante el envío continuo de registros de transacciones (WAL) desde el primary a los standbys. Cuando una transacción se confirma en el primary, sus cambios se escriben en el WAL y se transmiten a los standbys antes de que el cliente reciba la confirmación, asegurando consistencia. Los standbys aplican estos cambios en el mismo orden, manteniendo una réplica idéntica.

Paso a paso:

  1. Configura el servidor primary para generar WAL y permitir conexiones de replicación.
  2. Prepara un servidor standby con una copia inicial de la base de datos (usando herramientas como pg_basebackup).
  3. Establece la conexión de streaming desde el standby al primary.
  4. El primary envía segmentos de WAL a medida que se generan.
  5. El standby recibe y aplica los cambios, pudiendo funcionar en modo de solo lectura para balancear cargas.

En un escenario real, esto permite que una aplicación de comercio electrónico con miles de usuarios simultáneos mantenga réplicas para consultas de reportes sin afectar el rendimiento de las transacciones principales.

Código en acción

Configuración básica en el servidor primary (postgresql.conf):

# Habilitar replicación
wal_level = replica
max_wal_senders = 10  # Número máximo de conexiones de replicación
wal_keep_size = 1GB   # Mantener WAL para replicación

# Configuración de red
listen_addresses = '*'  # Permitir conexiones externas

Configuración en pg_hba.conf para permitir conexiones del standby:

# Permitir replicación desde la IP del standby
host    replication     replicacion_user    192.168.1.100/32    md5

En el standby, crear la réplica inicial y configurar recovery.conf (o postgresql.conf en versiones recientes):

# Usar pg_basebackup para copia inicial
pg_basebackup -h primary_host -D /var/lib/postgresql/data -U replicacion_user -P -v -R

# Configurar streaming en postgresql.conf
primary_conninfo = 'host=primary_host port=5432 user=replicacion_user password=secret'

Errores comunes

  • No monitorear el retraso de replicación: Ignorar métricas como pg_stat_replication puede llevar a réplicas desactualizadas. Usa consultas como SELECT * FROM pg_stat_replication; para verificar.
  • Configurar wal_level insuficiente: Usar 'minimal' en lugar de 'replica' o 'logical' impide la replicación. Siempre verifica este parámetro tras cambios.
  • Olvidar ajustar max_wal_senders: Si es demasiado bajo, nuevas réplicas no podrán conectarse. Calcula basado en el número de standbys más margen.
  • No gestionar el espacio en WAL: Sin wal_keep_size adecuado, los standbys pueden desconectarse si se retrasan. Monitorea el uso con pg_ls_waldir().
  • Errores de red no manejados: Interrupciones pueden causar reconexiones infinitas. Configura timeouts como wal_sender_timeout y wal_receiver_timeout.

Checklist de dominio

  1. ¿Puedes configurar un servidor primary para replicación en streaming modificando postgresql.conf y pg_hba.conf?
  2. ¿Sabes usar pg_basebackup para crear una réplica inicial de un standby?
  3. ¿Entiendes cómo verificar el estado de replicación con pg_stat_replication y calcular el lag?
  4. ¿Puedes identificar y resolver problemas comunes como réplicas detenidas o retraso excesivo?
  5. ¿Conoces las diferencias entre replicación síncrona y asíncrona y cuándo usar cada una?
  6. ¿Sabes configurar parámetros de rendimiento como max_wal_senders y wal_keep_size para alta concurrencia?
  7. ¿Puedes realizar un failover manual promoviendo un standby a primary en caso de fallo?

Configuración de un entorno de replicación en streaming con failover

En este ejercicio, configurarás un entorno de replicación en streaming entre dos servidores PostgreSQL y simularás un failover. Sigue estos pasos:

  1. Prepara dos máquinas virtuales o contenedores con PostgreSQL 14+ instalado. Nómbralas 'primary' y 'standby'.
  2. En el servidor primary:
    • Edita postgresql.conf para habilitar replicación: wal_level = replica, max_wal_senders = 5, wal_keep_size = 500MB.
    • Agrega una entrada en pg_hba.conf para permitir conexiones del standby usando md5.
    • Crea un usuario específico para replicación: CREATE USER replicacion_user WITH REPLICATION ENCRYPTED PASSWORD 'secure_pass';
    • Reinicia PostgreSQL.
  3. En el servidor standby:
    • Detén el servicio PostgreSQL y borra el directorio de datos.
    • Usa pg_basebackup para copiar datos del primary: pg_basebackup -h primary_ip -D /var/lib/postgresql/data -U replicacion_user -P -v -R.
    • Inicia PostgreSQL; debería conectarse automáticamente al primary.
  4. Verifica la replicación:
    • En el primary, ejecuta SELECT * FROM pg_stat_replication; para confirmar la conexión.
    • Crea una tabla en el primary e inserta datos; verifica que aparezcan en el standby.
  5. Simula un failover:
    • Detén el servidor primary abruptamente (simula un fallo).
    • En el standby, promuévelo a primary usando pg_ctl promote o creando un archivo trigger.
    • Reconfigura aplicaciones para apuntar al nuevo primary.
Pistas
  • Asegúrate de que los puertos (por defecto 5432) estén abiertos entre los servidores.
  • Si pg_basebackup falla, verifica la autenticación en pg_hba.conf y las credenciales.
  • Para promover el standby, en versiones recientes, usa pg_ctl promote -D /ruta/datos.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.