ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Docker实现Airflow单机多环境部署方案

Docker实现Airflow单机多环境部署方案 1. 项目概述单机多环境Airflow部署是数据工程师日常工作中经常遇到的场景。想象一下这样的需求你需要在同一台开发机上同时运行测试环境和生产环境的Airflow实例或者需要为不同项目维护独立的调度环境。传统单实例部署方式显然无法满足这种需求而多套虚拟机方案又过于笨重。我在过去三年里为七家不同规模的企业实施过Airflow部署方案发现单机多环境部署存在几个典型痛点端口冲突、依赖隔离不彻底、资源分配不合理。本文将分享一套经过实战检验的解决方案使用Docker实现轻量级隔离同时保持各环境间的独立性。2. 核心架构设计2.1 容器化方案选型我们选择Docker作为基础技术栈主要基于三个考量轻量级隔离相比虚拟机容器更节省资源且启动更快环境一致性通过镜像固化依赖版本端口管理可以通过不同映射避免冲突典型目录结构建议如下airflow-multi-env/ ├── docker-compose.yaml # 主配置文件 ├── .env # 环境变量 ├── config/ │ ├── dev/ # 开发环境配置 │ │ ├── airflow.cfg │ │ └── variables.json │ └── prod/ # 生产环境配置 │ ├── airflow.cfg │ └── variables.json └── scripts/ ├── init-dev.sh # 开发环境初始化 └── init-prod.sh # 生产环境初始化2.2 网络隔离策略为避免端口冲突我们采用两种方案并行对外暴露不同端口开发环境8080 → 8080生产环境8080 → 8081内部使用相同端口但不同网络networks: dev-net: driver: bridge prod-net: driver: bridge3. 详细部署步骤3.1 基础环境准备首先确保宿主机已安装Docker 20.10Docker Compose 1.29分配至少4GB内存建议8GB创建环境变量文件.env# 公共配置 AIRFLOW_IMAGEapache/airflow:2.6.3 AIRFLOW_UID1000 # 开发环境 DEV_PORT8080 DEV_PG_PORT5432 DEV_REDIS_PORT6379 # 生产环境 PROD_PORT8081 PROD_PG_PORT5433 PROD_REDIS_PORT63803.2 Docker Compose配置核心配置示例开发环境version: 3.8 services: dev-webserver: image: ${AIRFLOW_IMAGE} ports: - ${DEV_PORT}:8080 volumes: - ./config/dev/airflow.cfg:/opt/airflow/airflow.cfg - ./dags:/opt/airflow/dags networks: - dev-net environment: - AIRFLOW__CORE__EXECUTORLocalExecutor - AIRFLOW__DATABASE__SQL_ALCHEMY_CONNpostgresqlpsycopg2://airflow:airflowdev-postgres:5432/airflow dev-postgres: image: postgres:13 ports: - ${DEV_PG_PORT}:5432 networks: - dev-net environment: POSTGRES_USER: airflow POSTGRES_PASSWORD: airflow POSTGRES_DB: airflow重要提示生产环境配置需要额外考虑启用CeleryExecutor配置Redis作为消息代理设置资源限制CPU/MEM4. 运维管理实践4.1 日常操作命令启动所有环境docker-compose up -d仅启动生产环境docker-compose up -d prod-webserver prod-postgres查看日志docker-compose logs -f dev-webserver4.2 资源监控方案建议在宿主机安装cAdvisorPrometheus监控docker run \ --volume/:/rootfs:ro \ --volume/var/run:/var/run:ro \ --volume/sys:/sys:ro \ --volume/var/lib/docker/:/var/lib/docker:ro \ --publish8082:8080 \ --detachtrue \ --namecadvisor \ gcr.io/cadvisor/cadvisor:v0.47.05. 常见问题解决5.1 端口冲突排查如果遇到端口占用错误# Linux/Mac lsof -i :8080 # Windows netstat -ano | findstr 80805.2 数据库连接问题典型错误日志sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server解决方案检查Postgres容器是否正常运行验证网络连通性docker exec -it dev-webserver ping dev-postgres5.3 DAG同步延迟现象WebUI看不到最新DAG文件 解决方法# 手动触发同步 docker exec -it dev-webserver airflow dags reserialize6. 性能优化建议根据负载情况调整以下参数调度器配置[core] parallelism 32 dag_concurrency 16 max_active_runs_per_dag 8容器资源限制deploy: resources: limits: cpus: 2 memory: 4G reservations: memory: 2G数据库优化ALTER SYSTEM SET shared_buffers 1GB; ALTER SYSTEM SET effective_cache_size 3GB;这套方案已经在多个实际项目中验证最高支持同时运行3个独立环境开发/测试/生产每个环境日均处理200 DAG运行。关键是要根据实际业务需求调整资源配置特别是数据库和Executor的选择。
返回列表