La fragmentación de bases de datos es una técnica para lograr la escalabilidad horizontal en sistemas a gran escala.
Casi todos los sistemas del mundo real constan de un servidor de base de datos que recibe muchas solicitudes de lectura y una cantidad no despreciable de solicitudes de escritura. Esto puede sobrecargar el servidor y dificultar el rendimiento del sistema.
Para mitigar tales impactos y mejorar el rendimiento de un sistema, existen enfoques como la replicación de bases de datos y la fragmentación de bases de datos. En esta guía, exploraremos primero las técnicas para mejorar el rendimiento del sistema, entre las que se incluyen:
- Ampliación del servidor de base de datos
- Replicación de la base de datos
- Particionamiento horizontal
Después de discutir estas técnicas, procederemos a aprender cómo funciona la fragmentación de bases de datos y también veremos las ventajas y limitaciones de este enfoque.
Comencemos
Técnicas para mejorar el rendimiento del sistema
Comencemos discutiendo las técnicas para mejorar el rendimiento del sistema cuando existen cuellos de botella debidos al servidor de base de datos:
#1. Ampliación del servidor de base de datos
Ampliar la instancia del servidor de base de datos puede parecer un enfoque sencillo para mejorar el rendimiento del sistema. Esto incluye aumentar la potencia de procesamiento, añadir más RAM y similares.
Sin embargo, esta técnica viene con la siguiente limitación. No podemos tener un servidor con almacenamiento y potencia de procesamiento infinitos. Y más allá de un cierto límite, obtenemos rendimientos decrecientes.
#2. Replicación de la base de datos
Cuando la instancia del servidor de base de datos se sobrecarga debido a las peticiones entrantes, podemos considerar la replicación de la base de datos.
En la replicación de bases de datos, tenemos un nodo maestro que suele recibir las solicitudes de escritura. Existen múltiples réplicas de lectura.
Esto mejora la disponibilidad y mitiga la sobrecarga del sistema. Ahora podemos procesar múltiples consultas en paralelo, ya que las solicitudes de lectura pueden enrutarse a una de las réplicas de lectura.
Pero esto introduce otro problema. Las peticiones de escritura al nodo maestro pueden modificar los datos, y estas actualizaciones se propagan periódicamente a las réplicas de lectura.
Supongamos que hay una solicitud de lectura a una de las réplicas de lectura al mismo tiempo que una operación de escritura está en curso en el nodo maestro.
Los cambios en el nodo maestro aún no se habrán propagado a las réplicas de lectura. En este caso, es posible que estemos leyendo datos obsoletos, lo que no es deseable.
#3. Particionamiento horizontal
El particionamiento horizontal es otra técnica para optimizar el rendimiento del sistema. Podemos tener una única tabla de gran tamaño con miles de millones de filas (como una tabla de clientes y datos de transacciones).
Las operaciones de lectura de una tabla de base de datos de este tipo son más lentas. Pero utilizando el particionamiento horizontal, la única tabla grande se divide ahora en múltiples particiones (o tablas más pequeñas) desde las que podemos leer. Las bases de datos relacionales como PostgreSQL soportan de forma nativa el particionamiento.
Sin embargo, todas las particiones siguen estando dentro de una única instancia de servidor de base de datos. La única diferencia es que ahora podemos leer de las particiones en lugar de la única tabla grande.
Por lo tanto, cuando hay un aumento en el número de solicitudes entrantes, el servidor puede no ser capaz de soportar el aumento de la demanda.
¿Cómo funciona la fragmentación de bases de datos?
Ahora que hemos discutido los enfoques para mejorar el rendimiento del sistema y sus limitaciones, entendamos cómo funciona la fragmentación de la base de datos.
En la fragmentación, dividimos la única base de datos grande en varias bases de datos más pequeñas, cada una de las cuales se ejecuta en una instancia de servidor de base de datos. Cada una de estas bases de datos más pequeñas se denomina shard. Y cada shard contiene un subconjunto único de los datos.
Pero, ¿cómo dividimos la base de datos en fragmentos? Y ¿cómo determinamos cuáles de las filas van a cada uno de los shards?
🔑 Introduzca la clave de fragmentación.
Comprender la clave de fragmentación
Entendamos el papel de la clave de fragmentación.
La clave de fragmentación, que suele ser una columna (o una combinación de columnas) de la tabla de la base de datos, debe elegirse de forma que la distribución de los datos sea uniforme en los distintos fragmentos. Porque no queremos que un shard en particular sea mucho más grande que los demás.
En una base de datos que almacena datos sobre clientes y transacciones, el customer_ID
es un buen candidato para la clave de fragmentación.
Una vez que hayamos decidido la clave de fragmentación, podemos idear una función hash que determine qué filas van a cada uno de los fragmentos.
En este ejemplo, digamos que necesitamos dividir la base de datos en cinco fragmentos (fragmento #0 a fragmento #4) utilizando el customer_ID
como clave de fragmentación. En este caso, una función hash sencilla es customer_ID % 5.
Todos los valores de customer_ID
que dejen un resto de cero al dividirlos por 5 se asignarán al fragmento #0. Y los valores de customer_ID
que dejen restos del 1 al 4 se asignarán al fragmento del 1 al 4, respectivamente.
Una vez implementada de este modo la fragmentación de la base de datos, es importante contar con una capa de enrutamiento que dirija las solicitudes entrantes al fragmento de base de datos correcto.
Ventajas de la fragmentación de bases de datos
Estas son algunas de las ventajas de la fragmentación de bases de datos:
#1. Alta escalabilidad
Siempre es posible fragmentar una base de datos más grande en múltiples fragmentos más pequeños. Por tanto, la fragmentación de bases de datos nos permite escalar horizontalmente.
#2. Alta disponibilidad
Cuando hay una única instancia de servidor de base de datos que gestiona todas las solicitudes entrantes, tenemos un único punto de fallo. Si el servidor de base de datos se cae, toda la aplicación se cae.
Con la fragmentación de la base de datos, la probabilidad de que todos los fragmentos de la base de datos estén caídos en un instante dado es relativamente baja. Por lo tanto, si un shard en particular está caído, no podremos procesar las peticiones de lectura a ese shard. Pero los demás shards podrán seguir procesando las solicitudes entrantes. El resultado es una alta disponibilidad y una mayor tolerancia a los fallos.
Limitaciones de la fragmentación de bases de datos
Repasemos ahora algunas de las limitaciones de la fragmentación de bases de datos:
#1. Complejidad
Aunque la fragmentación tiene ventajas en términos de escalabilidad y tolerancia a fallos, introduce complejidad en el sistema.
Desde la asignación de registros a particiones hasta la implementación de la capa de enrutamiento para dirigir las consultas a los respectivos shards, la fragmentación de bases de datos conlleva una complejidad considerable.
#2. Resharding
Otra limitación del sharding es la necesidad de resharding.
Aunque utilizamos la función hashing para obtener una distribución uniforme de los registros de datos, es posible que uno de los shards sea mucho mayor que los demás y se agote antes. En este caso, tenemos que tener en cuenta el resharding (o reshuffling), y eso conlleva una sobrecarga sustancial.
#3. Ejecución de consultas complejas
Cuando necesite ejecutar consultas para análisis que impliquen uniones, tendrá que utilizar registros de varios shards en lugar de una única base de datos. Esto puede suponer un reto cuando necesite ejecutar demasiadas consultas analíticas. Puede evitarlo desnormalizando las bases de datos, ¡pero aún así requiere cierto esfuerzo!
Conclusión
Concluyamos la discusión con un resumen de lo que hemos aprendido.
Ampliar el hardware no siempre es óptimo. Por lo tanto, no se recomienda aumentar la instancia del servidor. También revisamos técnicas como la replicación de bases de datos y el particionamiento horizontal y sus limitaciones.
A continuación, aprendimos cómo funciona la fragmentación de bases de datos dividiendo una base de datos grande en fragmentos más pequeños y fáciles de gestionar. Discutimos cómo debe elegirse cuidadosamente la clave de fragmentación para obtener particiones uniformes y la necesidad de una capa de enrutamiento para dirigir las peticiones entrantes al fragmento de base de datos correcto.
La fragmentación de bases de datos tiene ventajas como la alta disponibilidad y la escalabilidad. Algunas de las desventajas incluyen la complejidad de configurar el sharding y el resharding cuando uno o más shards se agotan.
Así que puede considerar la fragmentación cuando crea que las ventajas superan la complejidad introducida por la fragmentación. A continuación, consulte la comparación de las distintas bases de datos relacionales de AWS.