
Año nuevo vida nueva. Si el último trimestre de 2019 estuvo centrando en las capacidades de los operadores aplicados a los sistemas de monitorización, ahora les llega el turno a las bases de datos distribuidas.
La premisa es sencilla, unos primeros artículos centrado en los conceptos básicos que atañen al tema y después una serie de entregas con las que desgranar las peculiaridades de cada una que pueden decantar la balanza en función de las necesidades o del caso de uso particular.
Distributed database
Una base de datos distribuida es un conjunto de múltiples bases de datos lógicamente relacionadas, las cuales no comparten componentes físicos y se encuentran distribuidas en diferentes espacios lógicos y geográficos.
Es decir, en lugar de tener una clásica base de datos monolítica corriendo sobre un potente hardware, se pasa a tener uno o más clusters interconectados, compuesto por varios nodos, normalmente ubicados en distintas zonas geográficas, entre los que se reparte tanto los datos como la carga de trabajo.

Distributed database types
Una vez definido los que son las bases de datos distribuidas, es hora de describir los principales tipos existentes:
Relational Database
Una base de datos relacional es un tipo de base de datos en la que la información se organiza como un conjunto de tablas con columnas y filas relacionadas entre sí. Las tablas se utilizan para almacenar la información sobre una determinada entidad, las columnas hacen referencia a sus propiedades, mientras que cada fila representa un objeto único de datos implícitamente estructurados. El archiconocido SQL o lenguaje de consulta estructurada es la interfaz principal utilizada para comunicarse con ellas.
Así, estas características la vuelven idónea para aquellos casos de uso en los que se requiere un modelado férreo de los datos y garantizar las propiedades ACID en las transacciones, algo que será detallado más adelante.
Key/Value Store
Una base de datos key-value es un tipo de base de datos no relacional, en la que, como su propio nombre indica, los datos se almacenan en un formato clave-valor, utilizando la clave como identificador único. El formato de ambos campos no se limita a un valor primario u objeto simple, sino que pueden llegar a contener objetos compuestos complejos.
Este tipo de bases de datos se caracteriza por su buen rendimiento, si bien su abanico de querys es muy limitado debido a que únicamente se pueden realizar búsquedas por la clave.
Así, estas características la vuelven idónea para implementar casos de usos tan típicos como los carros de la compra o los almacenes de sesiones.
Document Store
Una base de datos orientada a documentos es un tipo de base de datos no relacional diseñada para almacenar y consultar datos como documentos de tipo JSON o XML. Aunque estos documentos tengan un formato estructurado, no siempre hacen uso de un esquema fijo, es decir, no todos los documentos de una misma colección deben tener exactamente los mismos campos.
Este tipo de bases de datos se caracteriza por permitir almacenar colecciones de datos que evolucionen según las necesidades de las aplicaciones, permitiendo además realizar consultas por sus distintos campos, no únicamente por su clave primaria. Ahora bien, esto puede llegar a penalizar el rendimiento con volúmenes altos de datos, por los que modelarlos correctamente en función de las operaciones a realizar es de vital importancia.
Así, estas características la vuelven idónea para implementar catálogos, perfiles de usuario o sistemas de administración de contenido en los que cada documento es único y evoluciona con el tiempo.
Wide Column Store
Una base de datos columnar es un tipo de base de datos no relacional que almacena los datos en columnas. Los datos se agrupan en tablas, filas y columnas, pero a diferencia de una base de datos relacional, los nombres y el formato de las columnas pueden variar de una fila a otra en la misma tabla.
Este tipo de bases de datos se caracteriza por su eficiencia en las operaciones de consulta y filtrado de datos. Por contra, el rendimiento de las operaciones de inserción y actualización de datos es algo pobre, especialmente cuando no se ejecutan operaciones masivas sobre múltiples entradas.
Así, estas características la vuelven idónea para aplicaciones de analítica, data warehousing o big data, entre otros.

Graph Database
Una base de datos de grafos es un tipo de base de datos diseñada expresamente para almacenar relaciones y navegar por ellas. Los nodos se utilizan para almacenar entidades de datos, mientras que los bordes para las relaciones entre entidades.
Su topología la convierte muy propicia en aquellos ámbitos en los que es capital mantener un amplio y extenso modelo de relación a la vez que un esquema flexible de los datos. Por contra, no es muy eficientes a la hora de procesar operaciones contra grandes volúmenes de datos.
Así, estas características la vuelven idónea para la implementación de motores de recomendación, ya que permiten almacenar en un único grafo los intereses del cliente, amigos e historial de compras.
Characteristics
La principal característica o punto fuerte de las bases de datos distribuidas es la escalabilidad, concretamente el escalado horizontal. Es decir, es posible añadir más nodos al cluster, de tal forma que tanto los datos como la carga de trabajo se distribuyan entre ellos, aspirando así a una mejora de rendimiento lineal del sistema.
El hecho de haber matizado que se trata de una característica aspiracional en lugar de algo intrínseco a su naturaleza no es algo casual. Durante los próximos meses se detallará el funcionamiento de los productos más populares del mercado y esta frase cobrará sentido.
Dicho esto, la replicación de datos entre los distintos nodos del cluster también garantiza la alta disponibilidad, resiliencia, tolerancia a fallos del sistema o la posibilidad de ubicar la información en distintas ubicaciones geográficas, pudiendo el usuario acceder a aquellos nodos que se encuentran mas cercanos a su posición.
En resumen, todo esto en conjunto permite que las bases de datos dejen de ser el cuello de botella a la hora de diseñar grandes aplicaciones con miles de usuarios concurrentes.
Sharding
Durante todo el articulo se viene haciendo referencia a la capacidad de distribuir los datos a lo largo de los diferentes nodos o clusters que conforman una base de datos distribuida y esto es posible gracias al sharding.
El sharding es un patrón de arquitectura de base de datos relacionado con el particionado horizontal, proceso en el que se dividen los datos en fragmentos más pequeños llamados shards lógicos, que pueden ser ubicados y replicados a lo largo de los distintos nodos del cluster, también llamados shards físicos.
Este patrón se entiende mejor cuando es comparado con el particionado vertical, proceso en el que separan columnas enteras en nuevas tablas.
Una vez definido, es hora de hablar de las principales estrategias de sharding existentes, es decir, los algoritmos para distribuir los datos en los shards.
Hash based sharding
En esta estrategia se aplica un algoritmo de hashing sobre el shard-key de los datos y el resultado se utiliza para determinar en qué shard deben residir.
El shard-key es un campo de una tabla o colección de datos, normalmente la primary key, sobre el que se aplica el algoritmo de hashing. Es recomendable que el campo seleccionado sea inmutable, de lo contrario, el shard de destino cambiaría con cada actualización de este y habría que reubicarlo y actualizar las réplicas correspondientes.
La principal ventaja de esta estrategia es que los datos se reparten de forma uniforme por el cluster, balanceando así la carga entre los distintos nodos y permitiendo hacer búsquedas sobre registros específicos con un bajo tiempo de respuesta. Por el contrario, su rendimiento se ve muy mermado al realizar busquedas ordenadas, ya que los datos pueden encontrarse desperdigados entre los distintos nodos.
Range based sharding
En esta estrategia los datos se organizan en rangos en función del shard-key. Por ejemplo, dada una lista de productos, se podrían agrupar en los distintos shards en función de su precio, delimitando para cada shard un rango de valores.
La principal ventaja de esta estrategia es que al tener los datos organizados por el shard-key, permite realizar búsquedas filtradas y ordenadas por el mismo de forma eficiente, siempre y cuando se haya determinado un shard-key adecuado para las necesidades de consulta. Por el contrario, no garantiza una distribución uniforme de los datos y por lo tanto tampoco de la carga de trabajo.
Directory based sharding
En esta estrategia se debe crear y mantener una lookup table que determina que shard dispone de cada dato. Es decir, la lookup table no es más que una tabla estática que contiene la información sobre qué shard le corresponde a cada shard-key.
La principal ventaja de esta estrategia es la flexibilidad, ya que permite organizar los datos en función del criterio deseado. Por el contrario, la lookup-table se convierte en un punto único de fallo y el hecho de consultarla antes de cada operación puede penalizar el rendimiento.
En definitiva, el sharding es la clave para el desarrollo de las bases de datos distribuidas, ya que es la base que posibilita el escalado horizontal, replicación, alta disponibilidad, resiliencia, tolerancia a fallos del sistema, balanceo de carga o reducción de costes, dado que siempre será más barato que escalar verticalmente.
Conclusiones
En conclusión, este primer artículo está centrado en describir que son las bases de datos distribuidas, su tipología, características y qué papel juega el sharding en ellas.
Todos estos conceptos, así como aquellos descritos en la segunda entrega (CAP, ACID y MVCC) resultan fundamentales para comprender el modo de funcionamiento de las distintas bases de datos distribuidas.
Referencias
Se recomienda encarecidamente leer los siguientes artículos que han servido de base para el escrito:
- https://es.wikipedia.org/wiki/Base_de_datos_distribuida
- https://berb.github.io/diploma-thesis/original/063_types.html
- https://www.digitalocean.com/community/tutorials/understanding-database-sharding
- https://blog.yugabyte.com/how-data-sharding-works-in-a-distributed-sql-database/
- https://www.cockroachlabs.com/blog/unpacking-competitive-benchmarks
Excelente primera aproximación a teoría de DBs, con un resumen claro de las distintas opciones de sharding. Me suscribo y quedo a la espera de la segunda entrega!
LikeLike