Está en la página 1de 8

Replicación Base de Datos PostgreSQL

usando repmgr.
JEL/ presente instructivo tiene como finalidad, mostrar los pasos básicos necesario para la
U
instalación y configuración de un proceso de replicación (maestro – esclavo) en
A
PostgreSQL versión 9.6, utilizando repmgr versión 4.2
N
La replicación es la transmisión de información derivada de las modificaciones de estado,
de una base de datos a otra, en pocas palabras, todas las operaciones que que
T
modifiquen el estado de la BD se transmiten a otra BD que “replica” las operaciones, de
R
forma que ambas BD tengan la misma información.
U
C
Dentro
U
de las formas de replicación tenemos:
P
Maestro-maestro (multi-master): En éste modo, todos los nodos involucrados están en
E
capacidad
I de ejecutar operaciones de Lectura/Escritura (read/writer). En pocas palabras,
cualquier nodo involucrado está en capacidad de actualizar los datos. Para mantener la
consistencia de los datos, el proceso de replicación involucra tareas de resolución de
conflictos, en algunos casos según el número de nodos involucrados, puede aumentar la
latencia en la comunicación.
Maestro-esclavo: En éste modo, todos los cambios son registrados en el nodo principal, el
cual es el único habilitado para la función Lectura/Escritura (read/writer) y es el
encargado de efectuar la replicación ha todos los nodos involucrados, los cuales sólo
tienen capacidad para Lectura (read).

Un caso de uso típico para la replicación maestro – esclavo, con el modo en espera
(standby), el esclavo funciona como una copia de seguridad del maestro y puede ser
fácilmente activado en caso de un problema con el primario
repmgr es un conjunto de herramientas de código abierto para administrar la replicación
y la conmutación por error en un clúster de servidores PostgreSQL. Mejora las
capacidades incorporadas de Hot-Standby de PostgreSQL con herramientas para
configurar servidores de reserva, monitorear la replicación y realizar tareas
administrativas como failover o operaciones de cambio manual. La herramienta no
replica los datos en sí, sino que le permite controlar fácilmente la reproducción, el modo
de espera (hot standby) en el servidor (s) y controlar el estado de todo el proceso de
replicación.
Como ya indicamos, el ejemplo que a continuación presentamos estará dirigido a la
replicación maestro – Esclavo de dos nodos (master – esclavo) utilizando la herramienta
repmgr.

Hecho por: Dr. Manuel Silvestre Guedez


Banco Activo Universal.
Fecha: 25 de Abril 2017
Requisitos:
 Se debe contar con suficiente privilegios para la configuración de aplicativos
 Se debe contar con instalación del servicio SSH (servidor y cliente)
Plataforma:
 Equipos de arquitectura 64 bits
 Sistema operativo ‘GNU/Linux’ Debian versión 9.0 (actualmente estable)
Aplicaciones:
 postgresql-9.6 -> versión 9.6.8-1.pgdg90+1
 repmgr -> versión 4.0.4

Equipo involucrados:
Servidor: nodo1 (master)
(192.168.0.125)
Servidor nodo2 (esclavo)
(192.168.0.53)

CONFIGURACIÓN EN AMBOS SERVIDORES (MAESTRO – ESCLAVO)


1.- Configurar resolución local de DNS:
root@master:~# vim /etc/hosts
Efectuar el cambio: (master)
127.0.0.1 localhost
127.0.1.1 nodo1
192.168.0.125 nodo1
192.168.0.53 nodo2
Efectuar el cambio: (esclavo)
127.0.0.1 localhost
127.0.1.1 nodo2
192.168.0.53 nodo2
192.168.0.125 nodo1

INSTALACIÓN DE APLICACIONES EN AMBOS SERVIDORES


(MAESTRO – ESCLAVO)
2. Agregar repositorio:
root@nodo1:~# echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -sc)-
pgdg main" > /etc/apt/sources.list.d/pgdg.list
3. Descargar llave repositorio:
root@nodo1:~# wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc |
sudo apt-key add -
4. Instalar paquetes:
root@nodo1:~# aptitude update && aptitude -y install openssh-server openssh-client
postgresql-9.6 postgresql-9.6-repmgr

Hecho por: Dr. Manuel Silvestre Guedez


Banco Activo Universal.
Fecha: 25 de Abril 2017
5. Crear enlace simbólico del binaro del pg_ctl:
root@nodo1:~# ln -s /usr/lib/postgresql/9.6/bin/pg_ctl /usr/bin/pg_ctl

Nota: pg_ctl será el utilizado para poner en funcionamiento el


servicio postgresql

6. Configurar relación de confianza conexión SSH usuario postrgres en ambos servidores


Autenticación SSH basado en Llave Pública (SSH Key)

CONFIGURACION DE POSTGRESQL EN SERVIDOR MASTER


7. Editar archvio de configuración de postgresql:
root@nodo1:~# vim /etc/postgresql/9.6/main/postgresql.conf

Efectuar los siguientes cambios:


listen_addresses = '*'
shared_preload_libraries = 'repmgr'
wal_level = 'hot_standby'
archive_mode = on
archive_command = '/bin/true'
max_wal_senders = 10
wal_keep_segments = 100
max_replication_slots = 5
hot_standby = on
Nota: Ejemplo de
configuración https://repmgr.org/docs/4.0/quickstart-postgresql-
configuration.html
8. Crear usuario para la replicación:
root@nodo1:~# createuser -Upostgres -s repmgr
9. Crear Base de Datos para replicación:
root@nodo1:~# createdb -Upostgres repmgr -O repmgr
10. La aplicación repmgr instalará una extensión “repmgr”, el cual crea un esquema
denominado “repmgr”, que contiene las tablas “repmgr” de metadatos, así como otras
funciones, por ello se recomienda que se establezca la repmgr ruta de búsqueda del
usuario para incluir este nombre de esquema, por ejemplo:
10.1. Acceder consola de PostgreSQL:
root@nodo1:~# psql -U postgres
10.2. Esteblecer ruta:
postgres=# ALTER USER repmgr SET search_path TO repmgr, "$user", public;
11. Establacer los permisos para el acceso del usuario para replicación en postgresql:
root@nodo1:~# vim /etc/postgresql/9.6/main/pg_hba.conf

Hecho por: Dr. Manuel Silvestre Guedez


Banco Activo Universal.
Fecha: 25 de Abril 2017
Efectuar los siguientes cambios:

local replication repmgr trust


host replication repmgr 127.0.0.1/32 trust
host replication repmgr 192.168.0.0/24 trust

local repmgr repmgr trust


host repmgr repmgr 127.0.0.1/32 trust
host repmgr repmgr 192.168.0.0/24 trust
12. Reiniciar el servicio de postgresql:
root@nodo1:~# /etc/init.d/postgresql restart

SERVIDOR ESCLAVO
13. Comprobar si desde el servidor “esclavo” se puede establecer conexión con el
servidor “mater”
root@nodo2:~# psql 'host=nodo1 user=repmgr dbname=repmgr connect_timeout=2'
psql (9.6.8)
conexión SSL (protocolo: TLSv1.2, cifrado: ECDHE-RSA-AES256-GCM-SHA384, bits: 256,
compresión: desactivado)
Digite «help» para obtener ayuda.
Repmgr=#

SERVIDOR MASTER
14. Editar archivo de configuración repmgr en servidor Master:
root@nodo1:~# vim /etc/repmgr.conf
Efectura los siguientes cambios:
# https://repmgr.org/docs/4.0/quickstart-repmgr-conf.html
# https://repmgr.org/docs/4.0/configuration-file-settings.html
# Un entero único mayor que cero que identifica el nodo.
node_id = 1

#Una cadena arbitraria (pero única)


node_name = 'nodo1'

#Información de conexión a la base de datos como una cadena conninfo. Todos los
servidores
#del clúster deben poder conectarse al nodo local utilizando esta cadena.
conninfo = 'host=nodo1 user=repmgr dbname=repmgr connect_timeout=5 '

#El directorio de datos del nodo


data_directory = '/var/lib/postgresql/9.6/main'

#Habilitar la supervisión
monitoring_history = yes

Hecho por: Dr. Manuel Silvestre Guedez


Banco Activo Universal.
Fecha: 25 de Abril 2017
#registros logs del sistema
log_file='/var/log/postgresql/repmgr.log'
log_level=NOTICE

#Intentos reconexión al master


#número de veces para comprobar el servidor primario original para un cierre limpio
después de ejecutar
#el comando de apagado, antes de abortar
reconnect_attempts=6
#intervalo (en segundos) para comprobar la primaria original para un cierre limpio
después de ejecutar
#el comando de apagado (hasta un máximo de reconnect_attempts intentos)
reconnect_interval=10

#configuración para el failover automático


failover=automatic
promote_command='/usr/bin/repmgr standby promote -f /etc/repmgr.conf --log-to-file'
follow_command='/usr/bin/repmgr standby follow -f /etc/repmgr.conf --log-to-file –
upstream-node-id=%n'

Nota: CONFIGURACION FAILOVER (conmutación por error)


AUTOMATICO: Es la forma de hacer que un servidor esclavo se
convierta en maestro de forma automática. Para que la
conmutación por error se realice de forma automática, hay que
efectuar cambios en las variables “failover”,
“promote_command” y “follow_command”.
15. Agregar la ruta del repmgr.conf en el archivo de servicio “demonio” de repmgr:
root@nodo1:~# vim /etc/init.d/repmgrd
Incluir lo siguiente:
REPMGRD_ENABLED=yes
REPMGRD_CONF=/etc/repmgr.conf
16. Configurar la rotación de los log’s del repmgr:
root@nodo1:/# vim /etc/logrotate.d/repmgr
/var/log/postgresql/repmgr.log {
missingok
compress
rotate 52
maxsize 100M
weekly
create 0600 postgres postgres
}

Hecho por: Dr. Manuel Silvestre Guedez


Banco Activo Universal.
Fecha: 25 de Abril 2017
17. Registrar el servidor primario:
postgres@nodo1:~$ repmgr -f /etc/repmgr.conf primary register
NOTICE: attempting to install extension "repmgr"
NOTICE: "repmgr" extension successfully installed
NOTICE: primary node record (id: 1) registered
18. Verificar el estado del cluster:
postgres@nodo1:/$ repmgr -f /etc/repmgr.conf cluster show
ID | Name | Role | Status | Upstream | Location | Connection string
----+-------+---------+-----------+----------+----------+---------------------------------------------------------
1 | nodo1 | primary | * running | | default | host=nodo1 user=repmgr
dbname=repmgr connect_timeout=5
19. Verificar tabla de metadatos
postgres@nodo1:/$ psql -Urepmgr -d repmgr -c "SELECT * FROM repmgr.nodes;"
node_id | upstream_node_id | active | node_name | type | location | priority |
conninfo | repluser | slot_name | config_file
---------+------------------+--------+-----------+---------+----------+----------
+---------------------------------------------------------+----------+---------------+------------------
1| |t | nodo1 | primary | default | 100 | host=nodo1
user=repmgr dbname=repmgr connect_timeout=5 | repmgr | repmgr_slot_1 |
/etc/repmgr.conf
(1 fila)

SERVIDOR ESCLAVO
20. Detener el servicio de postgresql:
postgres@nodo2:~$ pg_ctl -D /var/lib/postgresql/9.6/main stop
21. Eliminar el contenido del directorio de datos del postgresql:
postgres@nodo2:~$ rm -rf /var/lib/postgresql/9.6/main/
22. Crear archivo repmgr.conf:
root@nodo2:~# vim /etc/repmgr.conf
Incluir la siguiente información:
node_id=2
node_name=nodo2
conninfo='host=nodo2 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/var/lib/postgresql/9.6/main'
reconnect_attempts=6
reconnect_interval=10
failover=automatic
promote_command='/usr/bin/repmgr standby promote -f /etc/repmgr.conf --log-to-file'
follow_command='/usr/bin/repmgr standby follow -f /etc/repmgr.conf --log-to-file --
upstream-node-id=%n'
23. Iniciar sesión como usuario postgres:
root@nodo2:~# su postgres
24. Comprobar el modo de espera puede ser clonada:
postgres@nodo2:~$ repmgr -h nodo1 -U repmgr -d repmgr -f /etc/repmgr.conf standby
clone --dry-run

Hecho por: Dr. Manuel Silvestre Guedez


Banco Activo Universal.
Fecha: 25 de Abril 2017
NOTICE: destination directory "/var/lib/postgresql/9.6/main" provided
NOTICE: standby will attach to upstream node 1
HINT: consider using the -c/--fast-checkpoint option
25. Si no se informen problemas, la espera se puede clonar con:
postgres@nodo2:~$ repmgr -h nodo1 -U repmgr -d repmgr -f /etc/repmgr.conf standby
clone
NOTICE: destination directory "/var/lib/postgresql/9.6/main" provided
NOTICE: starting backup (using pg_basebackup)...
HINT: this may take some time; consider using the -c/--fast-checkpoint option
NOTICE: standby clone (using pg_basebackup) complete
NOTICE: you can now start your PostgreSQL server
HINT: for example: pg_ctl -D /var/lib/postgresql/9.6/main start
HINT: after starting the server, you need to register this standby with "repmgr standby
register"
Nota:
(*)El proceso anterior ha clonado los archivos del directorio de datos PostgreSQL desde el
servidor master (nodo1) utilizando las utilidad pg_basebackup de PostgreSQL. Se creará
de forma automática el archivo recovery.conf, el cual contiene la configuración necesaria
para el inicio de la replicación.
26. El sistema clona el contenido del directorio ‘/var/lib/postgresql/9.6/main/’ pero los
archivos de configuración del postgresql en debian se encuentran en ‘/etc/postgresql/9.6/
main/’ y por eso no los clona. Por ello se deben copiar dichos archivos:
postgres@nodo2:~$ scp -r root@nodo1:/etc/postgresql/9.6/main/*
/etc/postgresql/9.6/main/
27. Inciar el servidor postgres:
postgres@nodo2:~$ pg_ctl -D /var/lib/postgresql/9.6/main/ -o
"--config_file=/etc/postgresql/9.6/main/postgresql.conf" start
servidor iniciándose
postgres@nodo2:~$ 2018-05-02 14:28:24.112 -04 [12736] LOG: el sistema de bases de
datos fue interrumpido; última vez en funcionamiento en 2018-05-02 14:25:40 -04
2018-05-02 14:28:24.498 -04 [12736] LOG: entrando al modo standby
2018-05-02 14:28:24.503 -04 [12736] LOG: redo comienza en 0/A000028
2018-05-02 14:28:24.505 -04 [12736] LOG: el estado de recuperación consistente fue
alcanzado en 0/A0000F8
2018-05-02 14:28:24.506 -04 [12735] LOG: el sistema de bases de datos está listo para
aceptar conexiones de sólo lectura
2018-05-02 14:28:24.552 -04 [12740] LOG: iniciando el flujo de WAL desde el primario
en 0/B000000 en el timeline 1
28. Comprobar el status del postgresql:
postgres@nodo2:~$ pg_ctl -D /var/lib/postgresql/9.6/main/ status
pg_ctl: el servidor está en ejecución (PID: 707)
/usr/lib/postgresql/9.6/bin/postgres "-D" "/var/lib/postgresql/9.6/main"
"--config_file=/etc/postgresql/9.6/main/postgresql.conf"
29. Registrar el servidor esclavo “nodo2” como standby:

Hecho por: Dr. Manuel Silvestre Guedez


Banco Activo Universal.
Fecha: 25 de Abril 2017
postgres@nodo2:~$ repmgr standby register
WARNING: --upstream-node-id not supplied, assuming upstream node is primary (node ID
1)
NOTICE: standby node "nodo2" (id: 2) successfully registered
30. Verificar el Cluster:
postgres@nodo2:~$ repmgr -f /etc/repmgr.conf cluster show
ID| Name | Role | Status | Upstream | Location | Connection string
---+-------+---------+-----------+----------+----------+--------------------------------------------------------
1 | nodo1 | primary | * running | | default | host=nodo1 user=repmgr
dbname=repmgr connect_timeout=5
2 | nodo2 | standby | running | nodo1 | default | host=nodo2 user=repmgr
dbname=repmgr connect_timeout=5
31. Verificar tabla de metadatos
postgres@nodo2:/$ psql -Urepmgr -d repmgr -c "SELECT * FROM repmgr.nodes;"
node_id | upstream_node_id | active | node_name | type | location | priority |
conninfo | repluser | slot_name | config_file
---------+------------------+--------+-----------+---------+----------+----------
+--------------------------------------------------------+----------+-----------+------------------
1| |t | nodo1 | primary | default | 100 | host=nodo1
user=repmgr dbname=repmgr connect_timeout=5 | repmgr | | /etc/repmgr.conf
2| 1|t | nodo2 | standby | default | 100 | host=nodo2
user=repmgr dbname=repmgr connect_timeout=5 | repmgr | | /etc/repmgr.conf
(2 filas)

SERVIDOR MASTER
32. Verificar la replicación, desde el servidor master:
root@nodo1:~# psql -Urepmgr -drepmgr -c "SELECT * FROM pg_stat_replication;"
pid | usesysid | usename | application_name | client_addr | client_hostname |
client_port | backend_start | backend_xmin | state | sent_location |
write_location | flush_location | replay_location | sync_priority | sync_state
------+----------+---------+------------------+----------------+-----------------+-------------
+-------------------------------+--------------+-----------+---------------+----------------+----------------
+-----------------+---------------+------------
9446 | 16384 | repmgr | nodo2 | 192.168.0.53 | | 51550 | 2018-
04-27 11:46:54.292661-04 | | streaming | 0/7000450 | 0/7000450 |
0/7000450 | 0/7000450 | 0 | async
(1 fila)

Hecho por: Dr. Manuel Silvestre Guedez


Banco Activo Universal.
Fecha: 25 de Abril 2017

También podría gustarte