Configurar replicación en PostgreSQL

Categorías:

Se deben usar dos servidores como mínimo, la replicación por default es asíncrona

Una vez instalado el motor en ambas máquinas se procede a ingresar como usuario postgres y ejecutar la siguiente sentencia

psql -c "ALTER SYSTEM SET listen_addresses TO '*';"

Esto permite que el motor pueda ser accedido desde cualquier dirección IP. También debemos configurar o descomentar 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

Creamos el usuario de replicación desde psql

postgres=# CREATE USER repodb REPLICATION LOGIN ENCRYPTED PASSWORD '*8$#_.203#P05';
CREATE ROLE
postgres=#

Editamos el archivo pg_hba.conf para autorizar el acceso desde la IP del servidor sclavo al usuario de replicación

host	replication	repodb	192.168.1.51/32	md5

Una vez realizamos estos pasos, procedemos a reniciar el servicio de postgresql

[root@pruebas data]# systemctl restart  postgresql-10
[root@pruebas data]#

Verificamos 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 ${PGDATA} (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

nov 22 18:16:04 pruebas systemd[1]: Stopped PostgreSQL 10 database server.
nov 22 18:16:04 pruebas systemd[1]: Starting PostgreSQL 10 database server...
nov 22 18:16:04 pruebas systemd[1]: Started PostgreSQL 10 database server.
[root@crm-odoo-ppalprod-pg data]#

Todo lo que hemos realizado es desde el lado servidor.

Desde el lado del servidor esclavo lo que hacemos es detener el servicio de postgres y remover o cambiar el nombre del directorio de datos de postgresql.

[root@odoo-rep 10]# mv data/ dataOrig
[root@odoo-rep 10]#

Luego de ello, ejecutamos 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]#

Una vez terminado, procedemos a cambiar 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]#

Como se ve en la ilustración anterior por defecto el propietario es root, cambiamos entonces la propiedad

 

[root@odoo-rep 10]# chown -R postgres:postgres data
[root@odoo-rep 10]#

Iniciamos el servicio de postgres

[root@odoo-rep 10]# systemctl start postgresql.service 
[root@odoo-rep 10]#

Verificamos el estado del servicio

[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)
  Drop-In: /etc/systemd/system/postgresql.service.d
           └─override.conf
   Active: active (running) since Wed 2023-11-22 18:24:30 -05; 4s ago
  Process: 29310 ExecStartPre=/usr/libexec/postgresql-check-db-dir postgresql (code=exited, status=0/SUCCESS)
 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

Nov 22 18:24:30 odoo-rep postmaster[29312]: 2023-11-22 18:24:30.246 -05 [29312] LOG:  listening on IPv6 address "::1", port 5432
Nov 22 18:24:30 odoo-rep postmaster[29312]: 2023-11-22 18:24:30.246 -05 [29312] LOG:  listening on IPv4 address "127.0.0.1", port 5432
Nov 22 18:24:30 odoo-rep postmaster[29312]: 2023-11-22 18:24:30.247 -05 [29312] LOG:  could not bind IPv4 address "192.168.13.29": Cannot assign requested address
Nov 22 18:24:30 odoo-rep postmaster[29312]: 2023-11-22 18:24:30.247 -05 [29312] HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
Nov 22 18:24:30 odoo-rep postmaster[29312]: 2023-11-22 18:24:30.247 -05 [29312] WARNING:  could not create listen socket for "192.168.13.29"
Nov 22 18:24:30 odoo-rep postmaster[29312]: 2023-11-22 18:24:30.247 -05 [29312] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
Nov 22 18:24:30 odoo-rep postmaster[29312]: 2023-11-22 18:24:30.249 -05 [29312] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
Nov 22 18:24:30 odoo-rep postmaster[29312]: 2023-11-22 18:24:30.259 -05 [29312] LOG:  redirecting log output to logging collector process
Nov 22 18:24:30 odoo-rep postmaster[29312]: 2023-11-22 18:24:30.259 -05 [29312] HINT:  Future log output will appear in directory "log".
Nov 22 18:24:30 odoo-rep systemd[1]: Started PostgreSQL database server.
[root@odoo-rep 10]#

Y listo, esto es todo.