Claves únicas en bases de datos distribuidas MySQL

Publicado por Andrea Navarro en

mysqlAl utilizar bases de datos distribuidas surge el problema de la duplicación de la clave primaria. Si nuestra aplicación utilizaba una clave primaria autoincremental al distribuir tener en funcionamiento más de un base los valores continuaran incrementando de manera independiente lo que generará una duplicidad al sincronizarlas. A continuación se listan algunas maneras de crear claves únicas.
  • Claves autoincrementales
  • Claves con números aleatorios
  • Claves compuestas
  • Realizar transacciones en el servidor principal

Utilizando claves autoincrementales

A partir de MySQL 5 es estan disponibles dos variables de servidor llamadas auto_increment_increment y auto_increment_offset. Estas variables nos permitirán continuar usando nuestras claves autoincrementales en un sistema distribuido sin generar conflictos de claves.

Ambas variables tendrán un valor por defecto de 1. Al insertar el un registro el valor es el menor de la lista de números naturales que sea mayor que el valor existente mas grande. Al modificar este valor por defecto la serie de números que se utilizará para seleccionar el nuevo valor se dará por la siguiente formula:

donde N es la serie de números naturales
Si por ejemplo seteo el auto_increment_increment en 100 y el auto_increment_offset en 20 la serie quedaría definida como

20,120,220,320,420,…

Para aplicar esto en las bases de datos en necesario setear estas variables modificando el archivo de configuración de MySQL. El valor de auto_increment_increment debe ser por lo menos un número mayor al número de bases de datos que se utilizaran, este valor será el mismo en todas las bases. Luego es necesario setear un auto_increment_offset diferente para cada base de datos evitando de esta manera que se dupliquen las claves.

Finalmente la base de datos central debe tener estas variables con los valores por defecto. De esta manera al sincronizar tomará todos los valores y la tabla estará unificada.

Claves autoincrementales en bases distribuidas

Utilizar valores aleatorios como claves primariasPara asegurar que las claves creadas sean únicas y no se repitan en ninguna de las bases es posible utilizar un número generado aleatoria mente, el nombre debe ser lo suficientemente grande y el grado de entropía debe ser el suficiente para garantizar que no se generará la misma clave dos veces evitando así las colisiones.

Un UUID puede solucionar este problema, para aprender más sobre UUID y cómo utilizar visita nuestro artículo UUID vs autoincremental como clave primaria.

Utilizar claves primarias compuestas

Para evitar el uso de valores aleatorios y beneficiarse de las características de una clave autoincremental es posible la creación de una tabla con clave primaria comcolicionespuesta con dos campos donde el primero sea el id del servidor sobre el cual se está escribiendo y el otro un valor autoincremental que será independiente para cada servidor.

Realizar todas las transacciones en el servidor principal

Es posible evitar todo tipo de conflicto en las claves simplemente dándole a las bases distribuidas permisos de solo lectura, permitiendo que se realicen consultas, y dejando las operaciones de transacción para el servidor principal. Es un proyecto donde la cantidad de entradas no sea muy elevada puede ser la solución más simple pero es importante tener en cuenta que si el volumen de transacciones aumenta se generará un efecto de cuello de botella que ralentizará el sistema.

Estos son solo algunos ejemplos de garantizar claves únicas.

¿Administrás bases de datos distribuidas? ¿Qué métodos de sincronización usas?

 


Andrea Navarro

- Ingeniera en Informática - Docente universitaria - Investigadora