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.

2 thoughts on “PostgreSQL replicación

  1. Y en caso de que el maestro se caiga, para poder invertir los roles (el maestro se convierta en esclavo) y seguir usando al esclavo pero ahora como maestro , que se deberia de hacer?

    La primera idea que se me viene a la mente es que mediante un script se cambien los valores de los archivos de cofiguracion, pero seria necesario un reinicio del postgresql creo.

  2. Efectivamente tendría que ser por medio de scripts. PostgreSQL no tiene un monitor ( aún ) que se encargue de todo el proceso ( o no que yo conozca ).
    FJA

Leave a Reply

Your email address will not be published. Required fields are marked *