Replicacion Base de Datos PostgreSQL usando repmgr

EL presente instructivo tiene como finalidad, mostrar los pasos básicos necesario para la instalación y configuración de un proceso de replicación (maestro – esclavo) en PostgreSQL versión 9.6, utilizando repmgr versión 4.2

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 modifiquen el estado de la BD se transmiten a otra BD que “replica” las operaciones, de forma que ambas BD tengan la misma información.

Dentro de las formas de replicación tenemos:

Maestro-maestro (multi-master): En éste modo, todos los nodos involucrados están en capacidad 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.

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 invlocrados:

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

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

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

#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
    }

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
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:

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)

Enlace:
Configurar PostgreSQL 9.5 maestro-esclavo de replicación usando repmgr
How to setup a PostgreSQL cluster with repmgr
repmgr 4.0.5 Documentación
Repmgr no se inscriben en espera claster, lo que me he perdido?

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s