Configurar replicación en PostgreSQL
Guía paso a paso para configurar replicación maestro-esclavo en PostgreSQL usando dos servidores. La replicación por defecto es asíncrona.
Requisitos previos
Se deben usar dos servidores como mínimo. La replicación por defecto es asíncrona. Una vez instalado el motor en ambas máquinas, procedemos con la configuración.
Configuración del servidor maestro
Paso 1: Configurar acceso remoto
Ingresa como usuario postgres y ejecuta la siguiente sentencia para permitir que el motor pueda ser accedido desde cualquier dirección IP:
psql -c "ALTER SYSTEM SET listen_addresses TO '*';" Paso 2: Editar postgresql.conf
Configura o descomenta los siguientes parámetros en el archivo postgresql.conf:
wal_level = logical
wal_log_hints = on
max_wal_senders = 8
max_wal_size = 1GB
hot_standby = on Paso 3: Crear usuario de replicación
Desde psql, crea el usuario de replicación:
postgres=# CREATE USER repodb REPLICATION LOGIN ENCRYPTED PASSWORD '*8$#_.203#P05';
CREATE ROLE
postgres=# Paso 4: Configurar pg_hba.conf
Edita el archivo pg_hba.conf para autorizar el acceso desde la IP del servidor esclavo al usuario de replicación:
host replication repodb 192.168.1.51/32 md5 Paso 5: Reiniciar PostgreSQL
Una vez realizados estos pasos, reinicia el servicio de PostgreSQL:
[root@pruebas data]# systemctl restart postgresql-10
[root@pruebas data]# Paso 6: Verificar el servicio
Verifica que el servicio haya iniciado sin errores:
[root@pruebas data]# systemctl status postgresql-10
● postgresql-10.service - PostgreSQL 10 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-10.service; enabled; vendor preset: disabled)
Active: active (running) since mié 2023-11-22 18:16:04 -05; 1s ago
Docs: https://www.postgresql.org/docs/10/static/
Process: 29719 ExecStartPre=/usr/pgsql-10/bin/postgresql-10-check-db-dir (code=exited, status=0/SUCCESS)
Main PID: 29724 (postmaster)
CGroup: /system.slice/postgresql-10.service
├─29724 /usr/pgsql-10/bin/postmaster -D /var/lib/pgsql/10/data/
├─29726 postgres: logger process
├─29728 postgres: checkpointer process
├─29729 postgres: writer process
├─29730 postgres: wal writer process
├─29731 postgres: autovacuum launcher process
├─29732 postgres: stats collector process
├─29733 postgres: bgworker: logical replication launcher
└─29734 postgres: odoo odoodb 192.168.1.3(49372) idle Configuración del servidor esclavo
Paso 1: Detener PostgreSQL y respaldar datos
Desde el servidor esclavo, detén el servicio de PostgreSQL y renombra el directorio de datos:
[root@odoo-rep 10]# systemctl stop postgresql
[root@odoo-rep 10]# mv data/ dataOrig
[root@odoo-rep 10]# Paso 2: Ejecutar pg_basebackup
Ejecuta el comando pg_basebackup para copiar todo el directorio del servidor maestro al esclavo:
[root@odoo-rep 10]# pg_basebackup -h 192.168.1.19 -U repodoodb -X stream -v -R -W -D /var/lib/pgsql/10/data
Password:
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: A/71000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: write-ahead log end point: A/710022B0
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: base backup completed
[root@odoo-rep 10]# Paso 3: Cambiar propietario del directorio
Una vez terminado, cambia el propietario del directorio data:
[root@odoo-rep 10]# ls -ltr
total 8
drwx------. 20 postgres postgres 4096 Nov 22 18:18 dataOrig
drwx------. 20 root root 4096 Nov 22 18:23 data
[root@odoo-rep 10]#
[root@odoo-rep 10]# chown -R postgres:postgres data
[root@odoo-rep 10]# Paso 4: Iniciar el servicio
Inicia el servicio de PostgreSQL en el servidor esclavo:
[root@odoo-rep 10]# systemctl start postgresql.service
[root@odoo-rep 10]# Paso 5: Verificar el estado
Verifica que el servicio esté corriendo correctamente y que el proceso de replicación esté activo:
[root@odoo-rep 10]# systemctl status postgresql.service
● postgresql.service - PostgreSQL database server
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2023-11-22 18:24:30 -05; 4s ago
Main PID: 29312 (postmaster)
Tasks: 7 (limit: 24825)
Memory: 31.3M
CGroup: /system.slice/postgresql.service
├─29312 /usr/bin/postmaster -D /var/lib/pgsql/10/data
├─29314 postgres: logger process
├─29315 postgres: startup process recovering 000000010000000A00000072
├─29316 postgres: checkpointer process
├─29317 postgres: writer process
├─29318 postgres: stats collector process
└─29319 postgres: wal receiver process streaming A/720002B8
Nota el proceso wal receiver process streaming que indica que la replicación está funcionando correctamente.
Conclusión
Con estos pasos has configurado exitosamente una replicación maestro-esclavo en PostgreSQL. El servidor esclavo ahora está recibiendo y aplicando los cambios del servidor maestro de forma asíncrona.
💡 Puntos importantes:
- La replicación por defecto es asíncrona
- El servidor esclavo está en modo de solo lectura (hot standby)
- Asegúrate de que el firewall permita la conexión en el puerto 5432
- Monitorea regularmente el estado de la replicación