Loading Likes...

Desde habitissimo estamos orgullosos de presentaros MyAAS, bases de datos precargadas como servicios. Hace un tiempo que liberamos la herramienta en GitHub pero todavía no la habíamos presentado de manera oficial.

Importar bases de datos es lento

En el día a día, nuestros desarolladores requieren una base de datos para realizar su trabajo. Estas bases de datos necesitan ser actualizadas a menudo por varios motivos; puede que simplemente necesites datos más frescos o que has realizado un cambio de modelo de forma errónea y necesitas volverlo atrás. Las bases de datos con las que trabajamos pueden llegar a ser bastante grandes, y restaurar una copia puede ser un proceso de entre 30 y 80 minutos según el tamaño de esta y la capacidad de la máquina donde se ejecuta. Durante este tiempo, el desarrollador no puede usar su entorno de trabajo porque el motor de bases de datos está ocupado con la importación.

Durante un tiempo solucionamos esto teniendo múltiples copias locales de la base de datos. De esta manera, cuando teníamos que realizar una importación podíamos usar la base de datos secundaria y seguir trabajando mientras la principal se importaba. Sin embargo, podía cometerse otro error sobre esta base de datos secundaria y tener que restaurar también esta, con lo que esta primera solución no escalaba. Necesitábamos una forma rápida y escalable de disponer de nuevas bases de datos cada vez que lo necesitáramos sin tener que esperar más de unos segundos.

Desarrollador iniciando una importación
Desarrollador iniciando una importación

Solucionando el problema

Durante un hack day me puse a pensar en cómo podríamos usar Docker para implementar un servicio que nos diera copias al instante de cualquiera de una serie de bases de datos plantilla pre-cargadas de antemano. El resultado fue un proyecto al que cariñosamente llamamos MyAAS (MySQL As A Service). La broma con el significado en inglés es, por supuesto, intencionada.

Desarrollador usando MyASS
Desarrolladores usando MyAAS

El funcionamiento de este servicio es el siguiente: durante la noche, mientras nuestros cansados desarolladores sueñan con algoritmos, un servidor en la oficina importa una copia actualizada de cada base de datos que podemos necesitar en el día a día. A la mañana siguiente, nuestros desarrolladores, recargados de energía, podrán solicitar copias de cada una de esas bases de datos, tantas veces como quieran, sin tener que esperar más de 3 o 4 segundos cada vez. Comparado con los más de 30 minutos que esta operación podía llegar a tardar, esto es como ir a la velocidad de la luz.

Cómo funciona la magia

Los lectores más técnicos estarán pensado “sí, sí, pero… ¿cómo funciona exactamente? ¿cómo puede importarse una base de datos de varios gigas en 1 segundo?”.

El servicio arranca cada noche un proceso que importa cualquier fichero terminado en .sql desde un directorio configurado. Este proceso crea una base de datos con el mismo nombre que el fichero y carga su contenido en la base de datos que servirá como plantilla para luego poder crear múltiples bases de datos con el mismo contenido. Esta base de datos se ejecuta sobre un contenedor de Docker y el volumen donde MySQL guarda los datos se monta sobre un disco formateado en BTRFS. Cuando la importación ha terminado, los contenedores de estas bases de datos se detienen.

Cada vez que el servicio recibe una llamada por la API solicitando una copia de una de estas plantillas, realizamos una copia del volumen correspondiente usando una técnica conocida como copy on write. La característica de este tipo de copias es que no se duplican los datos, sino que el archivo se crea como una referencia al original y, solo cuando la copia o el original cambian, se guardan las diferencias de cada versión, por separado. Mientras, siguen compartiendo los datos para las zonas comunes.

MyAss en acción
MyAAS en acción

Esto tiene dos implicaciones: por un lado, las copias son muy rápidas; por otro, ocupan muy poco espacio ya que, aunque la base de datos sea de varios gigas de tamaño, no las estamos duplicando enteras, sino que solo incrementamos el tamaño en disco para almacenar las modificaciones respecto a la original.

Loading Likes...

One thought on “Presentamos MyAAS, bases de datos precargadas como servicio

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *