Bucardo: el sistema de replicación para PostgreSQL

- Andrés Cruz

In english

Como especifica el título para esta entrada, Bucardo es un sistema de replicación que en otras palabras permite "clonar" o "duplicar" registros dentre Base de Datos (fuentes-objetivos), ademas cuenta con soporte para manejar múltiples Base de Datos con relaciones maestros-esclavos.

Aunque el fuente debe ser una Base de Datos PostgreSQL el objetivo puede ser PostgreSQL, MySQL, Redis, Oracle, MariaDB, SQLite, o MongoDB.

Los pasos para instalar Bucardo en Linux es muy sencillo (como veremos en la siguiente sección) aunque Bucardo puede ser un poco dificil de instalar debido a varias configuraciones y dependencias necesarias a nivel del Sistema Operativo pero en esta entrada podrás encontrar una sección en donde hablamos de Errores que me ocurrieron mientras instalaba Bucardo.

Esta entrada ofrece una rápida pero completa vista a Bucardo comenzando por su instalación en un ambiente Linux, su configuración, algunos errores que te pueden aparecer en el proceso de su instalación y culminado la entrada realizando un pequeño experimento con una simple relación Maestro-Maestro con Base de Datos PostgreSQL.

Instalando Bucardo en Ubuntu -parte 1-

En esta sección daremos unos tips de como instalar Bucardo en su versión 5.3.1 en Ubuntu, aunque el procedimiento es el mismo para otras distribuciones Linux; primero descargamos el Bucardo.tar.gz desde la sección de descargas.

Desempaquetamos el paquete y nos ubicamos desde la terminal en la carpeta; para el momento en que se escribió esta entrada es la versión es la 5.3.1:

cd Bucardo-5.3.1/

Generamos el Makefile:

perl Makefile.PL Generating a Unix-style Makefile Writing Makefile for Bucardo Writing MYMETA.yml and MYMETA.json

Lo más recomendable es que obtengas tu copia de bucardo desde su repositorio de GitHub en: git clone git://bucardo.org/bucardo.git

Finalmente instalamos Bucardo:

make make install

En Fedora existe otro método para hacernos con una copia de Bucardo, y consiste en instalarlo mediante los repositorios:

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm yum -y install bucardo

Configurando el ambiente en PostgreSQL para Bucardo

Una vez que instalamos la primera fase de Bucardo a través de los Makefile, vamos a PGAdmin o cualquier otro Administrador y creamos una Base de Datos y Rol (con SuperUsuario) llamada "bucardo":

Esquema de Bucardo en PostgreSQL

Configurando Bucardo -parte 2-

Ahora seguiremos con la instalación de Bucardo según las configuraciones realizadas en PostgreSQL; para ello debemos ejecutar en un terminal:

bucardo install

o -dependiendo de la fuente de instalación.-

bucardo_ctl install

Veremos la siguiente información:

Current connection settings: 1. Host:           <none> 2. Port:           5432 3. User:           postgres 4. Database:       bucardo 5. PID directory:  /var/run/bucardo

Si el directorio /var/run/bucardo no existe, créelo a través de: mkdir /var/run/bucardo

Se especifica el Host, usuario y base de datos creados anteriormente:

Current connection settings: 1. Host:           localhost 2. Port:           5432 3. User:           bucardo 4. Database:       bucardo 5. PID directory:  /var/run/bucardo

Errores que me ocurrieron mientras instalaba Bucardo:

  • ERROR: language "plperlu" does not exist: Instalamos el paquete con Instalamos el paquete con sudo yum install postgresql-plperl, luego de la instalación en la Base de Datos de Bucardo corrermos:         CREATE EXTENSION plperl;        CREATE LANGUAGE plperlu;
  • ERROR: permission denied for language plperlu Coloque al usuario como SuperUser desde la interfaz de pgAdmin
  • Para algún error concerniente a la autenticación; recuerda colocar en el pg_hba.conf ubicado en /etc/postgresql/X.X/main/p:
  • local   bucardo         bucardo                                 md5
  • Si al ejecutar un comando de Bucardo aparece el siguiente error: DBI connect('dbname=bucardo','bucardo',...) failed: fe_sendauth: no password supplied at /usr/local/bin/bucardo line 308.        Puedes solventar el error modificando el archivo señalado en el error (/usr/local/bin/bucardo), buscar la línea de código señalada:
Archivo error, contraseña no especificada
  • Y agregar la contraseña de Bucardo:
Archivo error, contraseña especificada

Si todo sale bien y no ocurrió algún otro error, FELICIDADES, acabas de completar la instalación de Bucardo y ahora puedes crear todas las relaciones entre Base de Datos que quieras.

Creando una relación Maestro-Maestro con Bucardo

En esta última sección veremos cómo crear una simple relación maestro esclavo con los comandos de Bucardo los cuales explicaré brevemente a continuación:

  • Primero creamos las Base de Datos; si son locales no es necesario especificar el host: bucardo add database <nombre> dbname=<nombrebd> user=<usuariobd> pass=<contraseñabd>
  • para agregar las tablas y secuencias a sincronizar: bucardo add table <tabla1> <tabla2> … relgroup=<nombrerelgroup>
  • Creamos un grupo de Base de Datos para poder sincronizarlas fácilmente más adelante: bucardo add dbgroup <nombredbgroup> <nombrebd>:source <nombrebd>:source
  • Ahora creamos la sincronización con: bucardo add <nombresync> mysync relgroup=<nombrerelgroup> dbs=<nombredbgroup> autokick=0
  • Y activamos la sincronización: bucardo update sync <nombresync> autokick=1

Puedes encontrar la documentación oficial y completa en los enlaces al final de esta entrada.

Una vez entendido los comando básicos para crear un sistema de replicación, ahora vamos a crear una relación Maestro-Maestro en donde una de las Base de Datos se encuentra local y otra remota; para ello empleamos los siguiente comandos:

bucardo add database midblocal dbname=oo user=bucardo pass=bucardo bucardo add database midbremoto dbname=oo user=postgres pass=postgres host=<IPRemota> bucardo add table public.estatus db=midblocal relgroup=myrels bucardo add dbgroup mydbgroup midblocal:source midbremoto:source bucardo add sync mysync relgroup=myrels dbs=mydbgroup autokick=0 bucardo update sync mysync autokick=1 bucardo reload config

Finalmente iniciamos Bucardo con:

bucardo start

Y verificamos su estatus con:

bucardo status

Ahora prueba insertar registros en cualquiera de las tablas de las Base de Datos que estén sincronizadas y deberían replicarse para mantenerse sincronizadas.

Algunos enlaces de interés:

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy