Airflow(Kubernetes Executor) DAG记录锁定致调度跳过问题咨询
Airflow DagRun调度锁定机制解析与锁释放场景
锁定机制核心原理
Airflow的DAG调度锁是为了避免重复调度同一DAG、生成冗余DagRun的核心机制。即使是单个调度器Pod,调度器进程在启动某DAG的调度逻辑前,会向元数据库(如PostgreSQL)的dag_lock表写入锁记录,标记该DAG处于“正在调度”状态,确保同一时间只有一个进程处理该DAG的调度流程。
锁的常规释放场景
- 主动释放:调度器完成该DAG的一轮调度流程(包括生成DagRun、更新调度状态等操作)后,会主动删除
dag_lock中的对应记录,释放锁。 - 异常捕获释放:若调度器处理该DAG时触发可捕获的异常,会执行锁释放逻辑,清理锁记录。
- 超时自动释放:Airflow默认通过
dag_lock_timeout配置锁超时时间(默认300秒),如果持有锁的进程挂掉、无响应或长时间未更新锁的心跳,超时后锁会被自动释放,后续调度逻辑可重新获取锁。
单个调度器Pod出现锁卡住的常见原因
- 调度器进程处理目标DAG时进入死循环、阻塞(如DAG解析耗时过长、数据库查询超时),无法主动释放锁,且未及时更新锁心跳导致超时机制未触发。
- 元数据库连接异常,导致调度器无法正常写入/删除锁记录。
- 自定义的DAG调度逻辑存在缺陷,干扰了锁的正常释放流程。
生产环境替代重启Pod的解决方案
- 手动释放锁:使用Airflow CLI执行
airflow dags unlock dag-test,直接清理目标DAG的锁记录,无需重启调度器。 - 调整锁超时配置:检查
airflow.cfg中的dag_lock_timeout参数,根据DAG调度耗时设置合理值,避免锁长时间无法自动释放。 - 排查调度阻塞点:查看调度器日志(对应
scheduler_job_runner.py的输出),定位处理dag-test时的异常或耗时操作,针对性优化(如简化DAG结构、优化数据库查询)。 - 配置调度器健康检查:给调度器Pod配置存活探针,当进程无响应时自动重启,同时依赖锁超时机制自动释放锁。
内容的提问来源于stack exchange,提问作者user12294404
相关产品推荐
相关产品推荐

