- Streaming Replication de PostgreSQL es una forma eficiente de mantener una réplica casi en tiempo real de la DB primaria en uno o más servidores en espera
- El servidor primario transmite continuamente los registros de Write-Ahead Log (WAL) a los servidores en espera a medida que se generan, minimizando la latencia del proceso de replicación
- Está diseñada para mejorar la alta disponibilidad y la escalabilidad, permitiendo descargar consultas de lectura a los servidores en espera para reducir la carga del servidor primario
- Soporta tanto modo síncrono como asíncrono, lo que permite ajustar con flexibilidad el equilibrio entre consistencia de datos y rendimiento
- Incluye el proceso en el que el servidor en espera se conecta al primario para solicitar el streaming de WAL y aplica los registros recibidos a su propia copia de la DB
- En comparación con el envío de logs basado en archivos, ofrece failover más rápido y menor riesgo de pérdida de datos, por lo que es ideal para entornos geográficamente distribuidos
¿Cómo funciona Streaming Replication?
- El servidor primario envía continuamente datos WAL en tiempo real al servidor en espera, manteniendo la DB del standby casi idéntica a la del primario
- Esto permite usar la réplica para failover del maestro o para manejar cargas de lectura, lo que permite que el sistema escale varias veces
Archivos de configuración de PostgreSQL y sus ubicaciones
- Los archivos de configuración de PostgreSQL cumplen un papel importante en la administración de la configuración y el comportamiento del servidor de base de datos.
postgresql.conf: el archivo principal de configuración que contiene la mayoría de los ajustes del servidor. Según el sistema operativo, puede estar en distintas ubicaciones como /etc/postgresql/<version>/main/postgresql.conf (Debian/Ubuntu) o /var/lib/pgsql/<version>/data/postgresql.conf (Red Hat/CentOS)
pg_hba.conf: controla la autenticación de clientes y define cómo pueden conectarse al servidor. Generalmente se encuentra en el mismo directorio que postgresql.conf
pg_ident.conf: se usa para mapear nombres de usuario, aunque se utiliza con menos frecuencia
recovery.conf: se usaba para configurar servidores en espera en versiones anteriores a PostgreSQL 12, pero en versiones posteriores su contenido se trasladó a postgresql.conf y postgresql.auto.conf
- La ubicación exacta puede variar según el sistema operativo, el método de instalación y la versión de PostgreSQL
- Puedes encontrar la ubicación de estos archivos desde una instancia de PostgreSQL usando el comando SQL
SHOW config_file;
Ejemplo y estructura de WAL (Write Ahead Logs)
- Puedes ver WAL con el comando
pg_waldump
- Cada línea representa un registro WAL que contiene información sobre una operación de la DB
- Componentes de cada registro:
- rmgr: administrador de recursos (por ejemplo, Heap, Btree, Transaction)
- len: longitud del registro
- tx: ID de transacción
- lsn: número de secuencia del log
- prev: LSN anterior
- desc: descripción de la operación
- Tipos de operaciones visibles:
- operaciones INSERT (Heap y Btree)
- operaciones MULTI_INSERT (Heap2)
- transacciones COMMIT
- operaciones sobre archivos (CREATE)
- Full Page Writes (FPW)
- La salida de WAL muestra en detalle el flujo de transacciones, modificaciones de datos y actividad del sistema, por lo que resulta útil para analizar el comportamiento de la DB, resolver problemas y hacer recuperación a un punto en el tiempo
Cómo trabajar con Docker
- Ajustes importantes relacionados con Streaming Replication en
postgresql.conf:
- wal_level, max_wal_senders, max_replication_slots, hot_standby, etc.
- Lo necesario para un ejemplo con Docker Compose:
init-master.sh: configura el maestro de PostgreSQL para replicación. Crea el usuario de replicación y el slot, y actualiza la configuración relacionada con WAL
init-replica.sh: prepara la réplica de PostgreSQL para conectarse al maestro e iniciar la replicación. Espera a que el maestro esté listo, luego realiza un respaldo base y configura la réplica
start-replica.sh: inicia la réplica de PostgreSQL dentro del contenedor Docker. Ejecuta el script init-replica.sh y luego arranca PostgreSQL
docker-compose.yml: define los servicios de maestro y réplica y configura las variables de entorno, volúmenes, comandos y demás elementos necesarios
- Después de dar permisos de ejecución a los scripts y ejecutar
docker-compose up -d, se iniciarán el maestro y la réplica
- Puedes conectarte al maestro y verificar el estado de la replicación con
pg_stat_replication
- Puedes conectarte a la réplica y confirmar si está en modo de recuperación con
pg_is_in_recovery()
Opinión de GN⁺
- Streaming Replication puede mejorar en gran medida el rendimiento y la resiliencia de la infraestructura de base de datos. Ya sea para prepararse para escenarios de failover o para distribuir la carga de lectura hacia las réplicas, esto puede ayudar a que la DB escale y mantenga un rendimiento estable
- Mostrar el proceso completo de configuración y la salida es importante. Esto ofrece una visión integral de muchas piezas móviles y ayuda a entender mejor qué está ocurriendo
- Entender cómo funciona Streaming Replication y configurarlo correctamente es muy importante. Ojalá este artículo haya ayudado a aclarar el proceso y a ofrecer una mejor visión de cómo funciona la replicación
- Otros productos o proyectos con funciones similares incluyen Replication de MySQL y Data Guard de Oracle. Estas soluciones también funcionan transmitiendo cambios desde el maestro hacia las réplicas, aunque los detalles de implementación pueden variar
- Al usar Streaming Replication, hay que considerar el ancho de banda y la latencia de red. La transferencia de datos entre el maestro y las réplicas puede consumir una cantidad importante de recursos de red. La escalabilidad del número de réplicas también es un punto importante a evaluar
- También deben evaluarse los requisitos de consistencia de datos. La replicación síncrona puede afectar el rendimiento de escritura, pero ofrece una consistencia más fuerte. La replicación asíncrona brinda mejor rendimiento, aunque con una ligera posibilidad de pérdida de datos
1 comentarios
Opiniones en Hacker News
Hay una opinión de que este artículo es excelente, pero que, desde la perspectiva de alguien que intenta administrar bases de datos como desarrollador full-stack, le faltan casos de uso reales
cronpara revisar el estadoSe afirma que la solución más sencilla para la replicación de PostgreSQL es un operador de Kubernetes
Se considera que una de las razones para usar Kubernetes y Helm es que pueden resolver este problema
Se recomienda StackGres para usuarios de Kubernetes
Finalmente, hay una opinión escéptica de que este artículo parece haber sido escrito por IA