PostgreSQL 22 de noviembre, 2023 • 8 min de lectura

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