Cómo configurar la replicación PostgreSQL multimaestro en Ubuntu 22.04

PostgreSQL es un sistema de gestión de bases de datos de código abierto centrado en la extensibilidad y el cumplimiento de SQL. PostgreSQL es un RDBMS (Sistema de Gestión de Bases de Datos Relacionales) avanzado y de clase empresarial que admite consultas SQL (relacionales) y JSON (no relacionales).

Es un sistema de gestión de bases de datos muy estable y de nivel empresarial que ofrece distintas soluciones, lo que te permite configurar la alta disponibilidad y la conmutación por error. PostgreSQL se utiliza como base de datos principal para aplicaciones web, móviles y analíticas. Tiene una gran reputación por su fiabilidad, flexibilidad, robustez de funciones y rendimiento.

Este tutorial instalará el servidor de bases de datos PostgreSQL en servidores Ubuntu 22.04 y configurará la replicación Multi-Master con varios servidores mediante Bucardo -un sistema de replicación asíncrona de PostgreSQL-. Instalarás PostgreSQL a través del repositorio oficial de PostgreSQL, compilarás e instalarás bucardo, y luego configurarás la replicación multimaestro entre servidores PostgreSQL.

Bucardo es una aplicación Perl que habilita el sistema de replicación asíncrona PostgreSQL y te permite configurar operaciones multimaestro y multifuente. Bucardo es gratuito y de código abierto, con licencia BSD.

Requisitos previos

Necesitarás dos o más servidores Ubuntu 22.04 para completar este tutorial. También necesitarás un usuario no root con privilegios de administrador sudo/root en tus sistemas.

En este ejemplo se utilizarán dos servidores Ubuntu 22.04 con los siguientes detalles:

Hostname      IP Address
---------------------------
postgres01    192.168.5.121
postgres02    192.168.5.122

Cuando todos los requisitos estén listos, puedes empezar a instalar el servidor PostgreSQL.

Configurar /etc/hosts y UFW

En esta primera sección, configurarás el ‘/etc/hosts’ y el cortafuegos UFW para abrir el puerto predeterminado 5432 de PostgreSQL y permitir que una subred de red específica acceda a él. Debes configurar el archivo /etc/hosts y el UFW en tus dos servidores.

Abre el archivo /etc/hosts utilizando el siguiente comando del editor nano.

sudo nano /etc/hosts

Añade las siguientes líneas al archivo y asegúrate de cambiar los detalles dirección IP y nombre de host con tu entorno de trabajo actual.

192.168.5.121    postgres01
192.168.5.122    postgres02

Guarda y cierra el archivo cuando hayas terminado.

A continuación, introduce el siguiente comando ‘ufw’ para abrir el puerto OpenSSH y el puerto 5432 del servidor PostgreSQL. Con esto, abrirás el puerto 22 por defecto de OpenSSH, luego abrirás también el puerto 5432 del servidor PostgreSQL y especificarás el acceso sólo desde redes de confianza‘192.168.5.0/24‘.

sudo ufw allow OpenSSH
sudo ufw allow from 192.168.5.0/24 to any port 5432

Ahora introduce el siguiente comando para iniciar y habilitar UFW. Cuando se te solicite, introduce y para confirmar y pulsa ENTER para continuar.

sudo ufw enable

El mensaje«El cortafuegos está activo y habilitado al iniciar el sistema» confirma que el UFW se está ejecutando y se iniciará automáticamente al iniciar el sistema.

configurar ufw y /etc/hosts

Por último, comprueba el estado del cortafuegos UFW utilizando el siguiente comando.

sudo ufw status

Deberías recibir una salida como ésta – El servicio OpenSSH se ha añadido y está disponible en la lista de reglas del UFW. Además, el puerto 5432 del servidor PostgreSQL sólo es accesible desde‘192.168.5.0/24‘.

verificar ufw

Instalar el servidor PostgreSQL

Primero, introduce el comando ‘apt install’ para instalar algunas dependencias básicas. Introduce y cuando te lo pida y pulsa ENTER para continuar.

sudo apt install wget gnupg2 lsb-release curl apt-transport-https ca-certificates

instalar deps básicos

A continuación, introduce el comando ‘curl’ para descargar la clave GPG del repositorio PostgreSQL, convierte el archivo .asc a .gpg mediante el comando ‘gpg –dearmor’, y luego añade el repositorio PostgreSQL.

curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/pgdg.gpg > /dev/null 2>&1
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/pgdg.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

añadir repo postgresql

Ahora actualiza y refresca tu paquete de Ubuntu para aplicar el nuevo repositorio PostgreSQL que has añadido.

sudo apt update

actualizar repo

Ahora puedes instalar el servidor PostgreSQL mediante el siguiente comando ‘apt install’. Con esto, instalarás la última versión del servidor PostgreSQL, que es PostgreSQL 15.

sudo apt install postgresql

Cuando se te solicite, introduce y para confirmar y pulsa ENTER para continuar.

instalar postgresql

Una vez instalado el servidor PostgreSQL, introduce el siguiente comando systemctl para verificar el servicio PostgreSQL y asegurarte de que se está ejecutando y está habilitado.

sudo systemctl is-enabled postgresql
sudo systemctl status postgresql

La salida ‘activo (en ejecución)‘ confirma que el servidor PostgreSQL está en ejecución. Y la salida ‘enabled‘ confirma que el PostgreSQL se ejecutará automáticamente al iniciarse el sistema.

verificar postgresql

Por último, también tendrás que instalar la extensión PostgreSQL‘plperl‘, que necesitará el software Bucardo. Introduce el siguiente comando ‘apt install’ para instalar la extensión ‘plperl’.

sudo apt install postgresql-plperl-15

La instalación debería comenzar automáticamente.

instalar plperl lang

Con esto, ya has instalado PostgreSQL 15 en ambos servidores Ubuntu 22.04, y también has instalado la extensión PostgreSQL ‘plperl’ que utilizará Bucardo. En el siguiente paso, configurarás el usuario y la base de datos PostgreSQL que utilizará Bucardo, y también configurarás la base de datos de prueba que se utilizará para las pruebas de replicación.

Configurar base de datos y usuario

En esta sección, crearás una nueva base de datos y un nuevo usuario que se utilizarán para la instalación de Bucardo. También crearás una nueva base de datos con el esquema para probar la replicación PostgreSQL. Asegúrate de ejecutar el comando y las consultas siguientes en los servidores PostgreSQL bot.

Antes de empezar, mueve el directorio de trabajo a‘/var/lib/postgresql‘.

cd /var/lib/postgresql

Ahora inicia sesión en el shell PostgreSQL mediante el siguiente comando.

sudo -u postgres psql

Una vez conectado a la shell PostgreSQL, introduce las siguientes consultas para crear un nuevo usuario y una nueva base de datos llamada ‘bucardo’. Esta base de datos se utilizará para almacenar los datos de Bucardo, y el usuario ‘bucardo‘ debe tener el privilegio SUPERUSUARIO.

CREATE USER bucardo WITH SUPERUSER;
CREATE DATABASE bucardo OWNER bucardo;

crear base de datos usuario bucardo

Ahora introduce las siguientes consultas para verificar la lista de bases de datos y usuarios en PostgreSQL. Si tienes éxito, deberías ver la base de datos y el usuario ‘bucardo’ escuchando en la salida.

\l
\du

Lista de bases de datos en el servidor PostgreSQL.

listar bases de datos

Lista de usuarios en el servidor PostgreSQL.

listar usuarios

Tras crear la base de datos y el usuario para Bucardo, a continuación crearás una nueva base de datos para probar la replicación en tu servidor PostgreSQL.

Introduce la siguiente consulta para crear una nueva base de datos ‘testdb‘. A continuación, conéctate a la base de datos ‘testdb‘ mediante la consulta‘\c‘.

CREATE DATABASE testdb;
\c testdb;

Ahora introduce la siguiente consulta para crear una nueva tabla ‘usuarios’.

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  first_name VARCHAR(255),
  last_name VARCHAR(255) NOT NULL,
  city VARCHAR(255)
);

crear base de datos testdb y tabla usuarios

Una vez creada la tabla, introduce las siguientes consultas para verificar el esquema de la tabla ‘usuarios’ y, a continuación, verifica la lista de datos disponibles en la tabla.

\dt
select * from users;

listar esquema de tabla

Configurar el servidor PostgreSQL

En esta sección, configurarás ambos servidores PostgreSQL para que se ejecuten en una dirección IP interna. Además, configurarás la autenticación PostgreSQL para permitir conexiones entre servidores como de confianza para PostgreSQL.

Abre la configuración por defecto de PostgreSQL ‘/etc/postgresql/15/main/postgresql.conf ‘ utilizando el siguiente comando del editor nano.

sudo nano /etc/postgresql/15/main/postgresql.conf

Descomenta el parámetro ‘listen_addresses‘ y añade la dirección IP interna de tu servidor PostgreSQL. Con esto, configurarás PostgreSQL para que se ejecute en una dirección IP interna en cada servidor.

A continuación se muestra la configuración para el servidor postgres01.

listen_addresses = 'localhost, 192.168.5.121'

configuración dirección postgres01

Y a continuación la configuración para el servidor postgres02.

listen_addresses = 'localhost, 192.168.5.122'

postgres02 dirección en ejecución

Guarda y cierra el archivo cuando hayas terminado.

A continuación, abre el archivo de configuración de autenticación PostgreSQL por defecto‘/etc/postgresql/15/main/pg_hba.conf ‘ utilizando el siguiente comando del editor nano.

sudo nano /etc/postgresql/15/main/pg_hba.conf

En el servidor postgres01, añade las siguientes configuraciones y asegúrate de cambiar la dirección IP por la dirección IP del servidor postgres02. Con esto, todas las conexiones locales y las conexiones del usuario bucardo serán de confianza. Además, las conexiones de los usuarios postgres y bucardo que provengan del postgres02 serán de confianza.

# local connection and bucardo user
local    all             all                                    trust
local    all             bucardo                                trust

# Bucardo user remote connections
host    all             postgres         192.168.5.122/24       trust
host    all             bucardo          192.168.5.122/24       trust

auth postgres01

A continuación se muestra la configuración para el servidor postgres02. Asegúrate de cambiar la dirección IP por la dirección IP del servidor postgres01.

# local connection and bucardo user
local    all             all                                    trust
local    all             bucardo                                trust

# Bucardo user remote connections
host    all             postgres         192.168.5.121/24       trust
host    all             bucardo          192.168.5.121/24       trust

setup postgres02 auth

Guarda y cierra el archivo cuando hayas terminado.

Ahora introduce el siguiente comando systemctl para reiniciar el servicio PostgreSQL y aplicar los cambios.

sudo systemctl restart postgresql

Con esto, el servidor PostgreSQL debería estar ejecutándose en localhost y en la dirección IP interna mediante el parámetro‘listen_addresses‘. Introduce el siguiente comando para verificar la lista de puertos abiertos en cada servidor. Deberías ver que PostgreSQL se está ejecutando en una dirección IP interna de los servidores postgres01 y postgres02.

ss -tulpn | grep postgres

verificar puerto postgresql

Por último, para verificar la autenticación, puedes introducir el siguiente comando para conectarte a la shell de PostgreSQL.

En el servidor postgres01, introduce el siguiente comando. Si lo consigues, deberías conectarte al shell PostgreSQL del servidor postgres02 sin necesidad de autenticación, porque estás en el host y usuario de confianza.

sudo -u postgres psql
sudo -u postgres psql -U bucardo -h 192.168.5.122

Para el servidor postgres02, puedes introducir el siguiente comando para conectarte al shell PostgreSQL que se ejecuta en el servidor postgres01. Tendrás un resultado similar, ya que accederás al servidor postgres01 sin autenticación de contraseña porque tanto el usuario como el conectado son de confianza.

sudo -u postgres psql
sudo -u postgres psql -U bucardo -h 192.168.5.121

Con esto, ya has terminado la instalación del servidor PostgreSQL 15, has configurado la base de datos y el usuario para Bucardo, y también has configurado las listen_addresses y la autenticación de PostgreSQL.

En el siguiente paso, compilarás e instalarás Bucardo como una aplicación que te permite crear una replicación PostgreSQL Multi-Master.

Instalar Bucardo

Bucardo es una aplicación gratuita y de código abierto para crear sistemas de replicación PostgreSQL multi-fuente y multi-maestro. En esta sección, instalarás Bucardo manualmente desde el código fuente, además no necesitas instalar Bucardo en todos los nodos.

Instalarás Bucardo sólo en el servidor ‘postgres01’. Así que asegúrate de ejecutar todos estos comandos siguientes en el servidor postgres01.

Primero, introduce el siguiente comando apt para instalar las dependencias de paquetes para Bucardo. Introduce y cuando se te pida y pulsa ENTER para continuar.

sudo apt install make libdbix-safe-perl libboolean-perl libdbd-mock-perl libdbd-pg-perl libanyevent-dbd-pg-perl libpg-hstore-perl libpgobject-perl libpod-parser-perl libencode-locale-perl

instalar deps

Ahora descarga el código fuente de Bucardo mediante el siguiente comando wget.

wget -q https://bucardo.org/downloads/Bucardo-5.6.0.tar.gz

Una vez descargado, extrae el código fuente de Bucardo y muévelo al directorio de trabajo de Bucardo.

tar xf Bucardo-5.6.0.tar.gz
cd Bucardo-*/

descargar bucardo

Ahora introduce el siguiente comando para compilar e instalar Bucardo en el servidor postgres01.

perl Makefile.PL
sudo make install

compilar instalar bucardo

Comprueba la ruta binaria de la aplicación ‘bucardo’ y verifica la versión de Bucardo mediante el siguiente comando.

which bucardo
bucardo --version

El archivo binario de ‘bucardo‘ se encuentra en ‘/usr/local/bin/bucardo’, y la versión instalada actualmente es la v5.6.0.

verificar bucardo

Con bucardo instalado, a continuación configurarás la replicación PostgreSQL Multi-Master utilizando dos servidores PostgreSQL postgres01 y postgres02.

Configurar la Replicación Multi-Maestro con Bucardo

Los siguientes comandos deben ejecutarse en el servidor postgres01.

Antes de empezar, introduce el siguiente comando para crear un nuevo directorio de datos y de registro para Bucardo.

sudo mkdir -p /var/run/bucardo /var/log/bucardo
touch /var/log/bucardo/log.bucardo

Ejecuta el siguiente comando ‘bucardo’ para iniciar la instalación. Revisa la configuración de la conexión a PostgreSQL y, a continuación, introduce P para continuar.

bucardo install

Cuando la instalación de Bucardo se realice correctamente, deberías obtener un mensaje de salida como ‘Lainstalación ha finalizado‘.

instalar bucardo

Introduce el siguiente comando para definir el servidor de base de datos y el nombre de la base de datos que se replicará. Esa información se almacenará como‘servidor1’ para el servidor PostgreSQL ppstgres01 y‘servidor2‘ para el servidor PostgreSQL postgres02.

bucardo add database server1 dbname=testdb
bucardo add database server2 dbname=testdb host=192.168.5.122

añadir db

Añade el esquema de la tabla que quieres replicar. en este ejemplo, la tabla llamada«usuarios» se replicará y sincronizará entre los servidores PostgreSQL.

bucardo add table public.users db=server1
bucardo add table public.users db=server2

añadir tabla

También puedes añadir todas las tablas de la base de datos mediante el comando‘bucardo add all tables‘. Con esto, también crearás un relgroup si no existe ya.

bucardo add all tables --her=testdbSrv1 db=server1
bucardo add all tables --her=testdbSrv2 db=server2

añadir toda la tabla relgroup

Introduce el siguiente comando para verificar la lista de relgroup disponibles.

bucardo list relgroup

A continuación, verifica la lista de relgroup, deberías ver la salida de detalles como la siguiente. En cada relgroup, verás el nombre del relgroup seguido del servidor PostgreSQL y la tabla disponible que se añade al relgroup.

lista relgroup

Con el relgroup y la tabla añadidos, ahora iniciarás el proceso de sincronización para ambos servidores PostgreSQL. Introduce el siguiente comando para crear una nueva sincronización ‘testdbSrv1‘ que sincronizará el‘servidor1‘ y el‘servidor2‘. Y la sincronización se llama ‘testdbSrv2‘ que sincronizará entre elservidor2′ y el ‘servidor1‘.

bucardo add sync testdbSrv1 relgroup=testdbSrv1 db=server1,server2
bucardo add sync testdbSrv2 relgroup=testdbSrv2 db=server2,server1

añadir sync relgroup

Ahora verifica la lista de sincronización en Bucardo introduciendo el siguiente comando.

bucardo list sync

Verás la sincronización ‘testdbSrv1‘ con el estado‘Activo‘ y la sincronización es desde el ‘servidor1‘ como origen y‘servidor2‘ como nodo de destino. En cuanto a la sincronización «testdbSrv2«, el estado también es «Activo«, pero la sincronización es del«servidor2″ como origen al«servidor1» de destino.

lista sync relgroup

A continuación, introduce el siguiente comando para reiniciar el proceso de sincronización. Y deberías ver una salida‘Iniciando Bucardo‘ cuando se realice con éxito.

bucardo restart sync

reiniciar sincronización

Por último, verifica el estado de la sincronización utilizando el siguiente comando‘bucardo‘.

bucardo status

Deberías recibir una salida similar a ésta – Ambas sincronizaciones‘testdbSrv1‘ y‘testdbSrv2‘ en estado ‘Bueno‘, lo que confirma que la sincronización está funcionando y tu configuración se ha realizado correctamente.

estado de bucardo

Llegados a este punto, ya has configurado la replicación Multi-Maestro en PostgreSQL mediante Bucardo. A continuación verificarás la replicación Multi-Maestro añadiendo nuevos datos desde ambos servidores y verificando la replicación entre servidores PostgreSQL.

Verificar la replicación Multi-Maestro Servidor PostgreSQL

Con el Multi-Maestro PostgreSQL configurado, esto significa que ambos PostgreSQL estarán sincronizados entre sí y que los dos servidores aceptan operaciones de LECTURA y ESCRITURA. En este ejemplo, verificarás el despliegue PostgreSQL multimaestro insertando nuevos datos en la base de datos «prueba».

En primer lugar, en el servidor postgres01, accede al shell PostgreSQL y conéctate a la base de datos ‘testdb‘.

sudo -u postgres psql
\c testdb

Introduce las siguientes consultas para insertar nuevos datos en la tabla ‘usuarios’.

INSERT INTO users(id, first_name, last_name, city)
VALUES 
(1, 'Alice', 'Wonderland', 'Sweden'),
(2, 'Bob', 'Rista', 'Romania'),
(3, 'John', 'Bonas', 'England');

añadir datos postgres01

Comprueba y recupera tus datos mediante la consulta select que aparece a continuación. Deberías ver que tus datos están disponibles.

select count(*) from users;
select * from users;

verificar datos postgres01

Escribe‘quit‘ para salir del intérprete de comandos PostgreSQL.

A continuación, verifica el estado de sincronización de Bucardo mediante el comando‘bucardo‘ que aparece a continuación.

bucardo status

En la sección‘Última I/D‘, verás la última sincronización de datos entre los servidores PostgreSQL.

estado después de la sincronización

Ahora desplázate al servidor postgres02, accede al intérprete de comandos PostgreSQL y conéctate a la base de datos‘testdb‘.

sudo -u postgres psql
\c testdb

Recupera los datos disponibles en la tabla‘usuarios‘ utilizando la siguiente consulta. Deberías ver que tus datos están disponibles y replicados desde el servidor postgres01.

select count(*) from users;
select * from users;

mostrar datos postgres01

A continuación, introduce las siguientes consultas para añadir otros datos y escribe‘quit‘ para salir del intérprete de comandos PostgreSQL.

INSERT INTO users(id, first_name, last_name, city)
VALUES 
(4, 'Ian', 'Gibson', 'Liverpool'),
(5, 'Tom', 'Riddle', 'Paris'),
(6, 'Jared', 'Dunn', 'New York');
quit

insertar datos postgres02

Ahora vuelve al servidor postgres01 y ejecuta el siguiente comando bucardo para verificar el estado de la sincronización.

bucardo status

Deberías ver que en‘testdbSrv2‘ la última sincronización es la 3. Puedes verlo en la sección‘Última I/D’.

estado de bucardo

Ahora accede de nuevo al intérprete de comandos PostgreSQL y conéctate a la base de datos ‘testdb’.

sudo -u postgres psql
\c testdb

A continuación, comprueba la lista de datos disponibles en la tabla‘usuarios‘. Deberías ver los datos adicionales que has añadido desde el servidor postgres02.

select count(*) from users;
select * from users;

mostrar datos actualizados

Con esto, ya has configurado las réplicas PostgreSQL multimaestro mediante Bucardo en servidores Ubuntu 22.04.

Conclusión

En este tutorial, has instalado el servidor PostgreSQL en servidores Ubuntu 22.04 y has configurado la replicación multimaestro mediante Bucardo utilizando dos servidores PostgreSQL. Has aprendido a configurar PostgreSQL para que se ejecute en una dirección IP local, a configurar la autenticación para los usuarios de PostgreSQL, a compilar e instalar Bucardo y, a continuación, a configurar la replicación multimaestro con Bucardo.

Además, has verificado la replicación multimaestro en PostgreSQL insertando nuevos datos de los servidores PostgreSQL para asegurarte de que las bases de datos y las tablas están replicadas y sincronizadas.

Con esto, ya puedes añadir más servidores PostgreSQL a tu entorno actual, luego también puedes configurar el equilibrio de carga y la conmutación por error mediante una aplicación de terceros como HAPROXY o utilizando pgPool para gestionar las conexiones de los clientes. Para obtener información detallada sobre PostgreSQL, visita la documentación oficial de PostgreSQL. Para Bucardo, visita la documentación oficial de Bucardo.

También te podría gustar...