PostgreSQL replicación

PostgreSQL permite la replicación con esclavos abiertos para consulta, esta replicación se realiza como en otras bases de datos con la transferencia del log de transacciones a un servidor remoto. Para realizar esta configuración utilizaremos PostgreSQL 9.3 instalado desde sus repositorios de yum .

Para este entorno asumimos que tenemos una base de datos maestro en el host “master” con el ip 192.168.0.10, y un host esclavo llamado “slave” en el ip 192.168.0.11.

Como primer paso creamos un usuario de replicación en el maestro.

psql -c "CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'passwd';"

En la base de datos maestro cambiamos los valores por defecto de los siguientes parámetros en el archivo postgresql.conf, será necesario crear el directorio /var/lib/pgsql/9.3/backup/archive/ para los archivos que genere WAL.

listen_addresses = '*'
wal_level = hot_standby
checkpoint_segments=8
archive_mode=on
archive_command=' test ! -f /var/lib/pgsql/9.3/backup/archive/%f && cp %p /var/lib/pgsql/9.3/backup/archive/%f '
max_wal_senders = 3
wal_keep_segments = 8

luego en pg_hba.conf agregamos una línea para que el host esclavo se pueda conectar al master remotamente.

host replication replicator 192.168.0.79/24 md5

Finalmente reiniciamos la base de datos para que todos los cambios sean tomados en cuenta por el motor.

Para crear la base de datos esclavo inicial a partir de la cual se aplicaran los logs podemos usar el comando pg_basebackup, este utilitario se conecta remotamente a la base de datos maestro y copia en el esclavo todos los archivos necesarios. Por supuesto bajamos la base de datos en el esclavo antes de proceder para evitar errores.

pg_ctl stop
pg_basebackup -h 192.168.0.10 -D /var/lib/postgresql/9.3/data  -U replicator -v -P

En el archivo postgresql.conf del esclavo activamos la opción de hot_standby, esta clausula se ignora si hay un cambio de roles y el esclavo pasa a ser el maestro.

hot_standby = on

finalmente creamos el archivo recovery.conf en el directorio de datos de PostgreSQL del esclavo, este archivo debe contener las siguientes directivas:

standby_mode='on'
primary_conninfo = 'host=192.168.0.10 port=5432 user=replicator password=passwd'
trigger_file= '/tmp/postgresql.trigger'

levantamos la base de datos en el esclavo y comprobamos el estado de la la replicación en el maestro con la siguiente consulta:

select * from pg_stat_replication;

Y eso es todo, espero que sea de utilidad.