Modularidad, Escalabilidad y Clean Installations con Docker
Introducción
Apache Airflow se ha consolidado como una herramienta esencial para la orquestación de flujos de trabajo (workflows) en proyectos de datos. Sin embargo, en entornos productivos y de gran escala, la centralización de DAGs y servicios en un único servidor puede generar problemas de flexibilidad, escalabilidad y mantenimiento.
Este artículo propone una solución que se basa en la separación de DAGs del motor de Airflow, la encapsulación de servicios en contenedores Docker y la adopción del paradigma de «clean installations». A lo largo de esta explicación, veremos cómo la arquitectura modular y basada en Docker mejora la gestión de flujos de trabajo, simplificando tanto el despliegue como el mantenimiento del sistema.
Descripción de la Solución
1. Separación de DAGs y Uso de Volúmenes Compartidos.
En entornos tradicionales, los DAGs y scripts de Airflow se almacenan directamente en el servidor que ejecuta Airflow. Sin embargo, al utilizar Docker, podemos desacoplar los DAGs del servidor mediante volúmenes compartidos. Los DAGs y nuevas funcionalidades se despliegan en un volumen físico del sistema host y luego se replican automáticamente a todos los contenedores que ejecutan Airflow.
Esto permite un despliegue sencillo de nuevas funcionalidades sin tener que reiniciar ni reconfigurar los contenedores. Todos los contenedores de ejecución (scheduler, webserver, workers) acceden a las mismas funcionalidades a través de los volúmenes compartidos.
2. Encapsulación de Servicios en Docker
Otro aspecto clave de nuestra solución es la encapsulación de servicios dentro de contenedores Docker. Esto permite gestionar diferentes tipos de servicios de manera independiente, asegurando que cada servicio tenga sus propias dependencias y ciclo de vida sin afectar el servidor o el resto del sistema.
Definimos dos tipos principales de servicios encapsulados:
Run Execute Dead: Son servicios que ejecutan una tarea y finalizan. Perfecto para trabajos puntuales, como scripts o procesos batch.
Ejemplo de comando Docker:
Run Listening: Son servicios que permanecen activos, escuchando eventos o ejecutando procesos continuos. Un ejemplo común sería un servidor que espera conexiones o un servicio de cola de mensajes.
Ejemplo de comando Docker:
3. Paradigma de Clean Installations.
Una de las principales ventajas de encapsular servicios en Docker es la implementación del paradigma de «clean installations». Al ejecutar todas las dependencias y servicios dentro de contenedores, el entorno físico del servidor permanece limpio y sin la necesidad de instalaciones directas de software como Python, R o cualquier otra dependencia.
Esto reduce los conflictos de versiones, facilita la portabilidad del sistema y asegura que cada contenedor tenga exactamente las versiones y configuraciones que necesita para funcionar correctamente, sin alterar el entorno base.
Evaluación de Soluciones
Centralización Tradicional de DAGs y Servicios:
-
- Pros: Simplicidad de configuración inicial, ya que todo está centralizado.
- Contras: Dificultad para escalar y problemas de mantenimiento al instalar dependencias directamente en el servidor.
Separación de DAGs y Uso de Volúmenes Comunes con Docker:
-
- Pros: Flexibilidad y facilidad de despliegue de nuevas funcionalidades. Los volúmenes compartidos permiten que los DAGs se distribuyan automáticamente a los contenedores.
- Contras: Aunque puede parecer complejo al principio, el despliegue se simplifica notablemente al centralizar la configuración en un único archivo, docker-compose.yaml.
Encapsulación de Servicios y Clean Installations
-
- Pros: Aislamiento total de dependencias, facilidad para portar servicios a otros entornos sin ensuciar el servidor físico.
- Contras: Requiere un esfuerzo inicial para preparar las imágenes Docker, pero una vez hecho, el sistema es mucho más fácil de gestionar.
Parte Técnica
Configuración Completa de un Servidor Airflow con Docker Compose
A continuación, se muestra una configuración completa de docker-compose.yaml que incluye todos los servicios principales necesarios para un entorno de Apache Airflow montado en microservicios. Esta configuración aprovecha los volúmenes compartidos para sincronizar los DAGs, logs y plugins entre los contenedores de ejecución de Airflow.
1. Docker Compose YAML:
2. Explicación de los Servicios:
-
- PostgreSQL (Base de datos): Almacena toda la información relacionada con la ejecución de DAGs, historiales de tareas y resultados.
- Redis (Broker de Celery): Se utiliza como sistema de mensajería para Celery, que gestiona la cola de tareas distribuidas entre los diferentes trabajadores.
- Airflow Webserver: Proporciona la interfaz gráfica (UI) donde puedes visualizar, gestionar y ejecutar DAGs. Corre en el puerto 8080.
- Airflow Scheduler: Programa las tareas de los DAGs y las distribuye entre los diferentes trabajadores.
- Airflow Workers: Son los trabajadores de Celery que ejecutan las tareas distribuidas por el scheduler. En este ejemplo, se configuran dos workers para ilustrar la escalabilidad horizontal.
- Airflow Init: Inicializa la base de datos de Airflow y crea un usuario administrador. Este servicio se ejecuta una sola vez
3. Ventajas de esta Configuración:
1. Escalabilidad: Añadir más workers es tan sencillo como duplicar la sección correspondiente en el docker-compose.yaml.
2. Mantenimiento de Logs: Cada servicio genera sus propios logs, facilitando la monitorización y depuración.
Ejemplo de acceso a logs de un worker:
3. Despliegue Simplificado: Al centralizar la configuración en un único archivo, se reduce la complejidad y se facilita el mantenimiento.
4. Ejemplos de Servicios Encapsulados
Run Execute Dead:
Run Listening:
Conclusión
En este artículo hemos explorado cómo la separación de DAGs, la encapsulación de servicios en Docker y el uso de volúmenes compartidos proporcionan una arquitectura escalable y flexible para gestionar flujos de trabajo en Apache Airflow. La configuración completa con Docker Compose permite aprovechar al máximo las ventajas de los microservicios, facilitando el despliegue, la escalabilidad y el mantenimiento del sistema.
Aunque la configuración inicial puede parecer compleja, el uso de Docker Compose centraliza la gestión en un único archivo de configuración. Además, el paradigma de «clean installations» asegura que el entorno del servidor permanezca limpio y libre de conflictos, mejorando la portabilidad y el mantenimiento a largo plazo.