如何使用docker-compose在分布式Airflow架构中配置Celery Worker
远程Celery Worker配置修正与问题排查方案
一、数据库连接异常问题解决
现有配置错误修正:
- 数据库连接串语法错误:你的配置中PostgreSQL端口误填为8080(8080为Airflow WebUI默认端口),PostgreSQL默认服务端口为5432,若你未手动修改PG端口请替换为5432。同时连接串中存在多余的
@airflow认证段,需要删除冗余部分,正确格式为postgresql://{用户名}:{密码}@{数据库主机}:{端口}/{库名} - Redis连接串语法错误:Broker URL中同样存在多余的
@airflow段,带密码的Redis正确连接格式为redis://:{密码}@{主机}:{端口}/{库号},无密码可去掉密码段写为redis://@{主机}:{端口}/{库号} - 端口访问校验:确认主节点PostgreSQL、Redis服务均绑定非127.0.0.1地址,主节点防火墙/安全组开放5432(PG)、6380(Redis)端口,允许工作节点IP访问
必须统一的核心配置项
- *AIRFLOW__CORE__FERNET_KEY:主节点和所有工作节点的该值必须完全一致,不可留空。可在主节点执行命令
docker-compose run --rm airflow-webserver python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"生成固定值,所有节点统一配置 - 所有节点的Airflow镜像版本必须完全一致,不能存在版本差会导致组件通信异常
- 共享存储权限校验:挂载的dags、logs、plugins目录权限需与配置的AIRFLOW_UID(50000)、AIRFLOW_GID(50000)匹配,确保容器内有读写权限
修正后的Worker docker-compose配置参考:
--- version: '3' x-airflow-common: &airflow-common image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.1.0} environment: &airflow-common-env AIRFLOW_UID: 50000 AIRFLOW_GID: 50000 AIRFLOW__CORE__EXECUTOR: CeleryExecutor # 替换为你实际的PostgreSQL端口 AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@airflowhost.example.com:5432/airflow # 替换为你实际的PostgreSQL端口 AIRFLOW__CELERY__RESULT_BACKEND: db+postgresql://airflow:airflow@airflowhost.example.com:5432/airflow # 替换为你实际的Redis密码,无密码可删除密码段 AIRFLOW__CELERY__BROKER_URL: redis://:your_redis_password@airflowhost.example.com:6380/0 # 替换为和主节点完全一致的fernet key AIRFLOW__CORE__FERNET_KEY: '替换为生成的固定fernet key' AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: 'true' AIRFLOW__CORE__LOAD_EXAMPLES: 'true' AIRFLOW__API__AUTH_BACKEND: 'airflow.api.auth.backend.basic_auth' # 新增配置解决日志拉取问题 AIRFLOW__CELERY__WORKER_HOSTNAME: ${HOSTNAME} volumes: - /airflow/dev/dags:/opt/airflow/dags - /airflow/dev/logs:/opt/airflow/logs - /airflow/dev/plugins:/opt/airflow/plugins user: "${AIRFLOW_UID:-50000}:${AIRFLOW_GID:-50000}" services: airflow-remote-worker: <<: *airflow-common command: celery worker ports: # 映射8793端口供主节点拉取日志 - 8793:8793 healthcheck: test: - "CMD-SHELL" - 'celery --app airflow.executors.celery_executor.app inspect ping -d "celery@$${HOSTNAME}"' interval: 10s timeout: 10s retries: 5 restart: always
二、日志拉取异常问题解决
你遇到的Unsupported URL protocol ''错误是因为主节点无法获取Worker的可访问地址,导致拼接日志URL时主机位为空,按以下步骤配置即可解决:
- 在Worker节点配置
AIRFLOW__CELERY__WORKER_HOSTNAME,值为当前Worker可被主节点解析的主机名或者物理IP地址,上面的配置示例已经添加了该配置项 - 主节点的docker-compose配置中,给webserver、scheduler服务都添加
extra_hosts配置,写入所有Worker的IP和主机名映射,示例如下:
extra_hosts: - "worker1主机名:worker1的IP地址" - "worker2主机名:worker2的IP地址"
- 若不想配置主机名解析,可直接将
AIRFLOW__CELERY__WORKER_HOSTNAME配置为Worker的物理IP地址,主节点可直接通过IP拉取日志 - 确认Worker节点防火墙/安全组开放8793端口,允许主节点IP访问
- 确认所有节点的logs共享存储挂载路径完全一致,权限配置正确
内容的提问来源于stack exchange,提问作者MrBronson
相关产品推荐
相关产品推荐

