Introducción

Almacenar datos en un solo lugar suele ser riesgoso. Por lo general, se recomienda que tenga un plan para asegurarse de recuperarse de un desastre tan pronto como ocurra.

Una buena forma de garantizar un plan de recuperación ante desastres eficaz es tener los mismos datos en varios servidores y mantenerlos sincronizados. Los servidores de bases de datos suelen trabajar juntos de modo que si el servidor principal / maestro falla, uno de ellos se hará cargo, creando una alta disponibilidad. Varios servidores de bases de datos también pueden proporcionar los mismos datos al mismo tiempo; esto se conoce como equilibrio de carga.

Esta guía le muestra cómo configurar una replicación maestro-esclavo en la que a un servidor de base de datos se le otorgan permisos de lectura y escritura mientras que al segundo se le otorgan permisos de solo lectura.

Antes de que empieces

  • 2 Ubuntu 18.04 Virtual Private Server (VPS) o servidor dedicado con un usuario no root con permisos Sudo. Uno actúa como maestro, el otro como servidor auxiliar / en espera.
  • PostgreSQL está instalado y configurado en ambos servidores. Aquí se explica cómo instalar el servidor de base de datos PostgreSQL en Ubuntu 18.04

pasos

Primero debe cambiar la dirección de la lista en la página de configuración de PostgreSQL. El servidor debe poder escuchar todos los puertos.

$ sudo vim /etc/postgresql/9.5/main/postgresql.conf

Nota especial: la versión de Postgresql puede ser diferente y, por lo tanto, su ruta puede ser diferente a la anterior.

Busque la palabra listen_addresses en su editor o configure números y desplácese hacia abajo hasta la línea 59.

Quite el comentario de la línea y cambie el nombre de localhost a * para que el servidor escuche todas las direcciones IP. Debe verse como el siguiente extracto.

...
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses="*"                # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
...

Mientras guarda sus cambios, cierre su editor y vuelva a cargar el servicio Postgresql para reflejar los cambios que realizó.

$ sudo systemctl restart postgresql

Crea una base de datos de muestra

Para propósitos de prueba de replicación, cree una tabla de muestra llamada Personajes.

Inicie sesión en su base de datos de Postgres

$ sudo -i -u postgres psql postgres
# CREATETABLEcharacters(fname text, character_id serial, datetimestamp, description text);

Ahora inserte datos de muestra en su tabla recién creada.

# INSERTINTOcharacters (fname, date, description) VALUES ( 'Griffin', current_date, 'This is a sample character' );
INSERT01

Configuración del servidor primario

PostgreSQL requiere un rol / usuario con permisos especiales para propósitos de replicación.

$ sudo -u postgres createuser -U postgres replicationuser -P -c 5 --replication

Nota especial: puede obtener más información sobre las opciones del comando createuser aquí. Además, en un entorno de producción, asegúrese de que la contraseña del usuario de replicación sea FUERTE para evitar incidentes como la fuerza bruta o simplemente adivinar contraseñas.

Luego, debe crear un directorio de archivo que sea un subdirectorio del directorio principal predeterminado de su clúster.

$ sudo mkdir -p /var/lib/postgresql/9.5/main/mnt/server/archivedir

Configurar el pg_hbaarchivo .conf

$ sudo vim /etc/postgresql/9.5/main/pg_hba.conf

Busque la sección de replicación y luego agregue la siguiente entrada al usuario de replicación para que tenga este aspecto. Recuerde reemplazar la dirección IP de su servidor esclavo.

# Allow replication connections
host     replication             replicationuser                192.168.56.20/24               md5

Salga mientras guarda los cambios.

Edite el postgresql.conffile

$ sudo vim /etc/postgresql/9.5/main/postgresql.conf

Edite las siguientes configuraciones. Recuerde eliminar cualquier configuración que edite de los comentarios.

listen_addresses="*"
wal_level = hot_standby
archive_mode= on
Archive_commend = 'test ! -f mnt/server/archivedir/%f && cp %p mnt/server/archivedir/%f'
max_wal_senders=3

Cuando guarde los cambios, salga y reinicie el servicio Postgresql

$ sudo systemctl restart postgresql

Configuración del servidor esclavo

Primero detenga el servicio postgresql en su servidor esclavo.

$ sudo systemctl stop postgresql

Cambie el nombre del directorio principal en el directorio de Postgresql por otro, ya que la copia de seguridad no reemplazará los archivos existentes en la misma carpeta.

$ sudo mv /var/lib/postgresql/9.3/main /var/lib/postgresql/9.3/main_old

Ejecute la utilidad pg_basebackup. Reemplace la dirección IP con la dirección IP de su servidor maestro.

$ sudo -u postgres pg_basebackup -h 192.168.56.20 -D /var/lib/postgresql/9.5/main -U replicationuser -v -P --xlog-method=stream

Ingrese la contraseña de usuario de replicación que estableció en su servidor maestro cuando se le solicite.

Edite el postgresqlarchivo .conf

$ sudo vim /etc/postgresql/9.5/main/postgresql.conf

Busque la opción de configuración hot_standby y cámbiela a en.

Salga mientras guarda los cambios.

Ahora debe especificar la configuración de recuperación que se utilizará en caso de recuperación de datos.

$ sudo cp -avr /usr/share/postgresql/9.5/recovery.conf.sample /var/lib/postgresql/9.5/main/recovery.conf

Edite el archivo de recuperación

$ sudo vim /var/lib/postgresql/9.5/main/recovery.conf

Busque standby_mode y cambie la opción a en para que el servidor permanezca en modo de espera.

Busque Primary_conninfo y agregue los detalles del servidor maestro

primary_conninfo= 'host=192.168.56.20 port=5432 user=replicationuser password=.Breotmas@12P12sr%'

Salga mientras guarda los cambios.

Inicie el servicio postgresql en su servidor esclavo

$ sudo systemctl start postgresql

Prueba de replicación

Vaya a su servidor maestro en la tabla que creó. Agrega una nueva entrada.

$ sudo -u postgres psql postgres
# INSERTINTOcharacter(fname, date, description) VALUES ( 'Sanchez', current_date, 'This is a family guy character');
INSERT01

Vuelva a su servidor esclavo en la base de datos de Postgres y mire los datos

$ sudo -u postgres psql postgres
# SELECT * FROMcharacter
 fname  | character_id |        date         |        description         
---------+--------------+---------------------+----------------------------
 Griffin |            1 | 2018-10-22 00:00:00 | This is a sample character
 Sanchez |            2 | 2018-10-2200:00:00 | A Rick and Morty character
(2 rows)

Conclusión

Si pudo ver los datos en su servidor esclavo después de pegarlos en su servidor maestro, significa que ha configurado con éxito su replicación maestro-esclavo de PostgreSQL.

Hay dos formas de invocar la conmutación por error si el servidor maestro deja de funcionar repentinamente; Puede usar el comando pg_ctl o especificar una ubicación para el archivo de activación en el archivo /etc/postgresql/9.5/main/postgresql.conf en su servidor esclavo. Simplemente busque la línea trigger_file = “/ tmp / postgresql.trigger.5432” en el archivo y descomente.