Sincronizando las secuencias con Bucardo

- Andrés Cruz

In english
Sincronizando las secuencias con Bucardo

Hace algunas entradas anteriores, hablamos sobre Bucardo y su utilidad para replicar Base de Datos postgresql, vimos como instalar Bucardo y dimos los primeros pasos para sincronizar nuestras Base de datos; en específico, creamos una simple relación maestro-maestro de dos Base de Datos pertenecientes a distintos host; la entrada es la siguiente:

BUCARDO: EL SISTEMA DE REPLICACIÓN PARA POSTGRESQL

Ahora les traigo un pequeño detalle que hay que tener en cuenta al momento de sincronizar las Base de Datos y se trata de sincronizar las secuencias:

Secuencias PGAdmin-PostgreSQL

Las secuencias y Bucardo

Las secuencias se emplean para generar valores enteros únicos para su asignación en las tablas asociadas; en otras palabras, son las empleadas para generar llaves primaria (Primary Key -PK-) para su posterior guardado en las tablas; por defecto Bucardo no sincroniza las secuencias para estos identificadores al insertar los registros replicados, dando como resultado una inconsistencia entre las base de datos a sincronizar (en lo que a las secuencias se refiere); sin embargo tenemos varias maneras de solucionar esto; primero la más fácil:

1.0 Modificar la secuencia de los contadores

Imaginemos que tenemos dos Base de Datos, en redes distintas que para sincronizarse requieren de una conexión a Internet:

Conectar BDs Internet

Sin embargo, en al menos una de las redes no es posible contar con una conexión a Internet permanente (salvo unas pocas horas al día) dando como resultado que la sincronización no puede llevarse a cabo de manera regular.

Para empeorar la situación, ambas Base de Datos son actualizadas por usuarios distintos todo el tiempo.

¿Qué podríamos hacer si deseamos sincronizar estas dos Base de Datos?

1.1 Evitar la colición de registros

Podemos manejar secuencias distintas para que los registros nunca sean solapados y al sincronizar las Base de Datos jamás colisionarán los identificadores de las Base de Datos (o indicar que la PK del registro a insertar ya existe):

Secuencia BD1 = START WITH 1 INCREMENT BY 2.
Secuencia BD2 = START WITH 2 INCREMENT BY 2.

También podemos emplear intervalos diferentes; es decir, comenzar el contador en alguna de las Base de Datos en 1 y la otra en 100000000:

Secuencia BD1 =  START WITH 1.
Secuencia BD2 =  START WITH 100000000.

Ambos escenarios los puedes ver en el siguiente enlace Pushdelta syncs and sequences.

1.2 Sincronizando las secuencia con Bucardo

El otro escenario es indicar que -además de las tablas- también sincronicen las secuencias; para ello empleamos el siguiente comando:

bucardo add <sequences> db=dbname=<nombrebd>  relgroup=<nombrerelgroup>

En dónde <sequences> son las secuencias a sincronizar; si deseamos sincronizar todas las secuencias en nuestra Base de Datos:

bucardo add all sequences db=dbname=<nombrebd>  relgroup=<nombrerelgroup>

Siguiendo nuestro ejemplo que vimos en la entrada anterior de Bucardo, para hacer una sincronización tanto de las tablas como de sus secuencias son necesarias los siguientes comandos:

bucardo add database oo2local dbname=oo2 user=postgres pass=postgres
bucardo add database ooremoto dbname=oo user=postgres pass=XXXX host=XXXXX

bucardo add dbgroup mydbgroup midblocal:source midbremoto:source

bucardo add all tablerelgroup=myrelgroup db=midblocal

bucardo add all sequences db=midblocal relgroup=myrelgroup

bucardo add sync mysync relgroup=myrelgroup dbs=mydbgroup autokick=0
bucardo update sync mysync autokick=1

La muy buena noticia es que si estabas usando el esquema planteado en la entrega anterior (todas la tablas sin los esquemas), puedes ejecutar esta simple línea:

bucardo add all tablerelgroup=myrelgroup db=midblocal

Para indicarle a Bucardo que también sincronice las secuencias y listo; no es necesario reiniciar o actualizar más nada, Bucardo tomará las nuevas configuraciones automáticamente; aun así si quieres saber que los cambios que aplicastes están siendo realmente tomados por Bucardo, basta con ejecutar el siguiente comando:

linux1@linux1-Lenovo-3000:~$ bucardo status mysync
======================================================================
Last good                : Aug 13, 2015 12:04:39 (time to run: 8s)
Rows deleted/inserted    : 1 / 1
Sync name                : mysync
Current state            : Good
Source relgroup/database : myrelgroup / midblocal
Tables in sync           : 47
Status                   : Active
Check time               : None
Overdue time             : 00:00:00
Expired time             : 00:00:00
Stayalive/Kidsalive      : Yes / Yes
Rebuild index            : No
Autokick                 : Yes
Onetimecopy              : No
Post-copy analyze        : Yes
Last error:              : 
======================================================================

Bucardo agrega en Tables in sync el total de las tablas y secuencias a sincronizar; como mi Base de Datos cuenta con 29 tablas y 18 secuencias que en total dan 47 tablas y secuencias.

Iconos obtenidos de:

Icons made by Webalys from www.flaticon.com is licensed by CC BY 3.0

Icons made by SimpleIcon from www.flaticon.com is licensed by CC BY 3.0

Andrés Cruz

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

Andrés Cruz En Udemy

Acepto recibir anuncios de interes sobre este Blog.