You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 17:15:04